@navios/di 0.3.1 → 0.4.1

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 (97) hide show
  1. package/README.md +67 -6
  2. package/coverage/base.css +224 -0
  3. package/coverage/block-navigation.js +87 -0
  4. package/coverage/clover.xml +2659 -0
  5. package/coverage/coverage-final.json +46 -0
  6. package/coverage/docs/examples/basic-usage.mts.html +376 -0
  7. package/coverage/docs/examples/factory-pattern.mts.html +1039 -0
  8. package/coverage/docs/examples/index.html +176 -0
  9. package/coverage/docs/examples/injection-tokens.mts.html +760 -0
  10. package/coverage/docs/examples/request-scope-example.mts.html +847 -0
  11. package/coverage/docs/examples/service-lifecycle.mts.html +1162 -0
  12. package/coverage/favicon.png +0 -0
  13. package/coverage/index.html +236 -0
  14. package/coverage/lib/_tsup-dts-rollup.d.mts.html +2806 -0
  15. package/coverage/lib/index.d.mts.html +310 -0
  16. package/coverage/lib/index.html +131 -0
  17. package/coverage/prettify.css +1 -0
  18. package/coverage/prettify.js +2 -0
  19. package/coverage/sort-arrow-sprite.png +0 -0
  20. package/coverage/sorter.js +196 -0
  21. package/coverage/src/container.mts.html +586 -0
  22. package/coverage/src/decorators/factory.decorator.mts.html +322 -0
  23. package/coverage/src/decorators/index.html +146 -0
  24. package/coverage/src/decorators/index.mts.html +91 -0
  25. package/coverage/src/decorators/injectable.decorator.mts.html +394 -0
  26. package/coverage/src/enums/index.html +146 -0
  27. package/coverage/src/enums/index.mts.html +91 -0
  28. package/coverage/src/enums/injectable-scope.enum.mts.html +127 -0
  29. package/coverage/src/enums/injectable-type.enum.mts.html +97 -0
  30. package/coverage/src/errors/errors.enum.mts.html +109 -0
  31. package/coverage/src/errors/factory-not-found.mts.html +109 -0
  32. package/coverage/src/errors/factory-token-not-resolved.mts.html +115 -0
  33. package/coverage/src/errors/index.html +221 -0
  34. package/coverage/src/errors/index.mts.html +106 -0
  35. package/coverage/src/errors/instance-destroying.mts.html +109 -0
  36. package/coverage/src/errors/instance-expired.mts.html +109 -0
  37. package/coverage/src/errors/instance-not-found.mts.html +109 -0
  38. package/coverage/src/errors/unknown-error.mts.html +130 -0
  39. package/coverage/src/event-emitter.mts.html +400 -0
  40. package/coverage/src/factory-context.mts.html +109 -0
  41. package/coverage/src/index.html +296 -0
  42. package/coverage/src/index.mts.html +139 -0
  43. package/coverage/src/injection-token.mts.html +571 -0
  44. package/coverage/src/injector.mts.html +133 -0
  45. package/coverage/src/interfaces/factory.interface.mts.html +121 -0
  46. package/coverage/src/interfaces/index.html +161 -0
  47. package/coverage/src/interfaces/index.mts.html +94 -0
  48. package/coverage/src/interfaces/on-service-destroy.interface.mts.html +94 -0
  49. package/coverage/src/interfaces/on-service-init.interface.mts.html +94 -0
  50. package/coverage/src/registry.mts.html +247 -0
  51. package/coverage/src/request-context-holder.mts.html +607 -0
  52. package/coverage/src/service-instantiator.mts.html +559 -0
  53. package/coverage/src/service-locator-event-bus.mts.html +289 -0
  54. package/coverage/src/service-locator-instance-holder.mts.html +307 -0
  55. package/coverage/src/service-locator-manager.mts.html +604 -0
  56. package/coverage/src/service-locator.mts.html +2911 -0
  57. package/coverage/src/symbols/index.html +131 -0
  58. package/coverage/src/symbols/index.mts.html +88 -0
  59. package/coverage/src/symbols/injectable-token.mts.html +88 -0
  60. package/coverage/src/utils/defer.mts.html +304 -0
  61. package/coverage/src/utils/get-injectable-token.mts.html +142 -0
  62. package/coverage/src/utils/get-injectors.mts.html +691 -0
  63. package/coverage/src/utils/index.html +176 -0
  64. package/coverage/src/utils/index.mts.html +97 -0
  65. package/coverage/src/utils/types.mts.html +241 -0
  66. package/docs/README.md +5 -2
  67. package/docs/api-reference.md +38 -0
  68. package/docs/container.md +75 -0
  69. package/docs/getting-started.md +4 -3
  70. package/docs/injectable.md +4 -3
  71. package/docs/migration.md +177 -0
  72. package/docs/request-contexts.md +364 -0
  73. package/lib/_tsup-dts-rollup.d.mts +182 -41
  74. package/lib/_tsup-dts-rollup.d.ts +182 -41
  75. package/lib/index.d.mts +1 -0
  76. package/lib/index.d.ts +1 -0
  77. package/lib/index.js +480 -294
  78. package/lib/index.js.map +1 -1
  79. package/lib/index.mjs +480 -295
  80. package/lib/index.mjs.map +1 -1
  81. package/package.json +1 -1
  82. package/src/__tests__/defer.spec.mts +166 -0
  83. package/src/__tests__/errors.spec.mts +61 -0
  84. package/src/__tests__/event-emitter.spec.mts +163 -0
  85. package/src/__tests__/get-injectors.spec.mts +70 -0
  86. package/src/__tests__/registry.spec.mts +335 -0
  87. package/src/__tests__/request-scope.spec.mts +34 -35
  88. package/src/__tests__/service-instantiator.spec.mts +408 -0
  89. package/src/__tests__/service-locator-event-bus.spec.mts +242 -0
  90. package/src/__tests__/service-locator-manager.spec.mts +370 -0
  91. package/src/__tests__/unified-api.spec.mts +130 -0
  92. package/src/base-instance-holder-manager.mts +175 -0
  93. package/src/event-emitter.mts +5 -5
  94. package/src/index.mts +1 -0
  95. package/src/request-context-holder.mts +73 -44
  96. package/src/service-locator-manager.mts +12 -70
  97. package/src/service-locator.mts +421 -226
@@ -0,0 +1,1162 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for docs/examples/service-lifecycle.mts</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">docs/examples</a> service-lifecycle.mts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">0% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>0/251</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/1</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/1</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">0% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>0/251</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 type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></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>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
426
+ <span class="cline-any cline-neutral">&nbsp;</span>
427
+ <span class="cline-any cline-no">&nbsp;</span>
428
+ <span class="cline-any cline-neutral">&nbsp;</span>
429
+ <span class="cline-any cline-no">&nbsp;</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-neutral">&nbsp;</span>
432
+ <span class="cline-any cline-neutral">&nbsp;</span>
433
+ <span class="cline-any cline-neutral">&nbsp;</span>
434
+ <span class="cline-any cline-neutral">&nbsp;</span>
435
+ <span class="cline-any cline-neutral">&nbsp;</span>
436
+ <span class="cline-any cline-neutral">&nbsp;</span>
437
+ <span class="cline-any cline-neutral">&nbsp;</span>
438
+ <span class="cline-any cline-neutral">&nbsp;</span>
439
+ <span class="cline-any cline-neutral">&nbsp;</span>
440
+ <span class="cline-any cline-neutral">&nbsp;</span>
441
+ <span class="cline-any cline-no">&nbsp;</span>
442
+ <span class="cline-any cline-no">&nbsp;</span>
443
+ <span class="cline-any cline-no">&nbsp;</span>
444
+ <span class="cline-any cline-no">&nbsp;</span>
445
+ <span class="cline-any cline-neutral">&nbsp;</span>
446
+ <span class="cline-any cline-no">&nbsp;</span>
447
+ <span class="cline-any cline-no">&nbsp;</span>
448
+ <span class="cline-any cline-neutral">&nbsp;</span>
449
+ <span class="cline-any cline-no">&nbsp;</span>
450
+ <span class="cline-any cline-no">&nbsp;</span>
451
+ <span class="cline-any cline-no">&nbsp;</span>
452
+ <span class="cline-any cline-no">&nbsp;</span>
453
+ <span class="cline-any cline-no">&nbsp;</span>
454
+ <span class="cline-any cline-no">&nbsp;</span>
455
+ <span class="cline-any cline-no">&nbsp;</span>
456
+ <span class="cline-any cline-no">&nbsp;</span>
457
+ <span class="cline-any cline-no">&nbsp;</span>
458
+ <span class="cline-any cline-neutral">&nbsp;</span>
459
+ <span class="cline-any cline-no">&nbsp;</span>
460
+ <span class="cline-any cline-no">&nbsp;</span>
461
+ <span class="cline-any cline-neutral">&nbsp;</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-no">&nbsp;</span>
467
+ <span class="cline-any cline-no">&nbsp;</span>
468
+ <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
473
+ <span class="cline-any cline-no">&nbsp;</span>
474
+ <span class="cline-any cline-neutral">&nbsp;</span>
475
+ <span class="cline-any cline-no">&nbsp;</span>
476
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
480
+ <span class="cline-any cline-no">&nbsp;</span>
481
+ <span class="cline-any cline-no">&nbsp;</span>
482
+ <span class="cline-any cline-no">&nbsp;</span>
483
+ <span class="cline-any cline-no">&nbsp;</span>
484
+ <span class="cline-any cline-no">&nbsp;</span>
485
+ <span class="cline-any cline-no">&nbsp;</span>
486
+ <span class="cline-any cline-no">&nbsp;</span>
487
+ <span class="cline-any cline-no">&nbsp;</span>
488
+ <span class="cline-any cline-neutral">&nbsp;</span>
489
+ <span class="cline-any cline-no">&nbsp;</span>
490
+ <span class="cline-any cline-neutral">&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-neutral">&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-neutral">&nbsp;</span>
500
+ <span class="cline-any cline-no">&nbsp;</span>
501
+ <span class="cline-any cline-no">&nbsp;</span>
502
+ <span class="cline-any cline-no">&nbsp;</span>
503
+ <span class="cline-any cline-no">&nbsp;</span>
504
+ <span class="cline-any cline-neutral">&nbsp;</span>
505
+ <span class="cline-any cline-neutral">&nbsp;</span>
506
+ <span class="cline-any cline-no">&nbsp;</span>
507
+ <span class="cline-any cline-no">&nbsp;</span>
508
+ <span class="cline-any cline-no">&nbsp;</span>
509
+ <span class="cline-any cline-no">&nbsp;</span>
510
+ <span class="cline-any cline-no">&nbsp;</span>
511
+ <span class="cline-any cline-no">&nbsp;</span>
512
+ <span class="cline-any cline-no">&nbsp;</span>
513
+ <span class="cline-any cline-no">&nbsp;</span>
514
+ <span class="cline-any cline-no">&nbsp;</span>
515
+ <span class="cline-any cline-neutral">&nbsp;</span>
516
+ <span class="cline-any cline-no">&nbsp;</span>
517
+ <span class="cline-any cline-no">&nbsp;</span>
518
+ <span class="cline-any cline-neutral">&nbsp;</span>
519
+ <span class="cline-any cline-neutral">&nbsp;</span>
520
+ <span class="cline-any cline-no">&nbsp;</span>
521
+ <span class="cline-any cline-no">&nbsp;</span>
522
+ <span class="cline-any cline-no">&nbsp;</span>
523
+ <span class="cline-any cline-neutral">&nbsp;</span>
524
+ <span class="cline-any cline-no">&nbsp;</span>
525
+ <span class="cline-any cline-no">&nbsp;</span>
526
+ <span class="cline-any cline-neutral">&nbsp;</span>
527
+ <span class="cline-any cline-no">&nbsp;</span>
528
+ <span class="cline-any cline-no">&nbsp;</span>
529
+ <span class="cline-any cline-neutral">&nbsp;</span>
530
+ <span class="cline-any cline-neutral">&nbsp;</span>
531
+ <span class="cline-any cline-no">&nbsp;</span>
532
+ <span class="cline-any cline-neutral">&nbsp;</span>
533
+ <span class="cline-any cline-neutral">&nbsp;</span>
534
+ <span class="cline-any cline-no">&nbsp;</span>
535
+ <span class="cline-any cline-no">&nbsp;</span>
536
+ <span class="cline-any cline-no">&nbsp;</span>
537
+ <span class="cline-any cline-no">&nbsp;</span>
538
+ <span class="cline-any cline-neutral">&nbsp;</span>
539
+ <span class="cline-any cline-no">&nbsp;</span>
540
+ <span class="cline-any cline-no">&nbsp;</span>
541
+ <span class="cline-any cline-no">&nbsp;</span>
542
+ <span class="cline-any cline-neutral">&nbsp;</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-no">&nbsp;</span>
548
+ <span class="cline-any cline-neutral">&nbsp;</span>
549
+ <span class="cline-any cline-no">&nbsp;</span>
550
+ <span class="cline-any cline-no">&nbsp;</span>
551
+ <span class="cline-any cline-no">&nbsp;</span>
552
+ <span class="cline-any cline-no">&nbsp;</span>
553
+ <span class="cline-any cline-no">&nbsp;</span>
554
+ <span class="cline-any cline-no">&nbsp;</span>
555
+ <span class="cline-any cline-neutral">&nbsp;</span>
556
+ <span class="cline-any cline-no">&nbsp;</span>
557
+ <span class="cline-any cline-no">&nbsp;</span>
558
+ <span class="cline-any cline-no">&nbsp;</span>
559
+ <span class="cline-any cline-no">&nbsp;</span>
560
+ <span class="cline-any cline-no">&nbsp;</span>
561
+ <span class="cline-any cline-neutral">&nbsp;</span>
562
+ <span class="cline-any cline-no">&nbsp;</span>
563
+ <span class="cline-any cline-no">&nbsp;</span>
564
+ <span class="cline-any cline-no">&nbsp;</span>
565
+ <span class="cline-any cline-neutral">&nbsp;</span>
566
+ <span class="cline-any cline-no">&nbsp;</span>
567
+ <span class="cline-any cline-no">&nbsp;</span>
568
+ <span class="cline-any cline-no">&nbsp;</span>
569
+ <span class="cline-any cline-neutral">&nbsp;</span>
570
+ <span class="cline-any cline-no">&nbsp;</span>
571
+ <span class="cline-any cline-no">&nbsp;</span>
572
+ <span class="cline-any cline-no">&nbsp;</span>
573
+ <span class="cline-any cline-no">&nbsp;</span>
574
+ <span class="cline-any cline-no">&nbsp;</span>
575
+ <span class="cline-any cline-no">&nbsp;</span>
576
+ <span class="cline-any cline-neutral">&nbsp;</span>
577
+ <span class="cline-any cline-no">&nbsp;</span>
578
+ <span class="cline-any cline-no">&nbsp;</span>
579
+ <span class="cline-any cline-no">&nbsp;</span>
580
+ <span class="cline-any cline-no">&nbsp;</span>
581
+ <span class="cline-any cline-neutral">&nbsp;</span>
582
+ <span class="cline-any cline-no">&nbsp;</span>
583
+ <span class="cline-any cline-no">&nbsp;</span>
584
+ <span class="cline-any cline-no">&nbsp;</span>
585
+ <span class="cline-any cline-no">&nbsp;</span>
586
+ <span class="cline-any cline-neutral">&nbsp;</span>
587
+ <span class="cline-any cline-neutral">&nbsp;</span>
588
+ <span class="cline-any cline-no">&nbsp;</span>
589
+ <span class="cline-any cline-no">&nbsp;</span>
590
+ <span class="cline-any cline-no">&nbsp;</span>
591
+ <span class="cline-any cline-no">&nbsp;</span>
592
+ <span class="cline-any cline-neutral">&nbsp;</span>
593
+ <span class="cline-any cline-no">&nbsp;</span>
594
+ <span class="cline-any cline-no">&nbsp;</span>
595
+ <span class="cline-any cline-neutral">&nbsp;</span>
596
+ <span class="cline-any cline-neutral">&nbsp;</span>
597
+ <span class="cline-any cline-no">&nbsp;</span>
598
+ <span class="cline-any cline-neutral">&nbsp;</span>
599
+ <span class="cline-any cline-no">&nbsp;</span>
600
+ <span class="cline-any cline-no">&nbsp;</span>
601
+ <span class="cline-any cline-no">&nbsp;</span>
602
+ <span class="cline-any cline-no">&nbsp;</span>
603
+ <span class="cline-any cline-no">&nbsp;</span>
604
+ <span class="cline-any cline-no">&nbsp;</span>
605
+ <span class="cline-any cline-no">&nbsp;</span>
606
+ <span class="cline-any cline-neutral">&nbsp;</span>
607
+ <span class="cline-any cline-no">&nbsp;</span>
608
+ <span class="cline-any cline-no">&nbsp;</span>
609
+ <span class="cline-any cline-no">&nbsp;</span>
610
+ <span class="cline-any cline-no">&nbsp;</span>
611
+ <span class="cline-any cline-no">&nbsp;</span>
612
+ <span class="cline-any cline-neutral">&nbsp;</span>
613
+ <span class="cline-any cline-no">&nbsp;</span>
614
+ <span class="cline-any cline-no">&nbsp;</span>
615
+ <span class="cline-any cline-neutral">&nbsp;</span>
616
+ <span class="cline-any cline-no">&nbsp;</span>
617
+ <span class="cline-any cline-no">&nbsp;</span>
618
+ <span class="cline-any cline-no">&nbsp;</span>
619
+ <span class="cline-any cline-no">&nbsp;</span>
620
+ <span class="cline-any cline-no">&nbsp;</span>
621
+ <span class="cline-any cline-no">&nbsp;</span>
622
+ <span class="cline-any cline-no">&nbsp;</span>
623
+ <span class="cline-any cline-no">&nbsp;</span>
624
+ <span class="cline-any cline-no">&nbsp;</span>
625
+ <span class="cline-any cline-no">&nbsp;</span>
626
+ <span class="cline-any cline-no">&nbsp;</span>
627
+ <span class="cline-any cline-neutral">&nbsp;</span>
628
+ <span class="cline-any cline-no">&nbsp;</span>
629
+ <span class="cline-any cline-no">&nbsp;</span>
630
+ <span class="cline-any cline-no">&nbsp;</span>
631
+ <span class="cline-any cline-neutral">&nbsp;</span>
632
+ <span class="cline-any cline-no">&nbsp;</span>
633
+ <span class="cline-any cline-no">&nbsp;</span>
634
+ <span class="cline-any cline-no">&nbsp;</span>
635
+ <span class="cline-any cline-no">&nbsp;</span>
636
+ <span class="cline-any cline-no">&nbsp;</span>
637
+ <span class="cline-any cline-no">&nbsp;</span>
638
+ <span class="cline-any cline-no">&nbsp;</span>
639
+ <span class="cline-any cline-neutral">&nbsp;</span>
640
+ <span class="cline-any cline-no">&nbsp;</span>
641
+ <span class="cline-any cline-no">&nbsp;</span>
642
+ <span class="cline-any cline-no">&nbsp;</span>
643
+ <span class="cline-any cline-no">&nbsp;</span>
644
+ <span class="cline-any cline-neutral">&nbsp;</span>
645
+ <span class="cline-any cline-no">&nbsp;</span>
646
+ <span class="cline-any cline-no">&nbsp;</span>
647
+ <span class="cline-any cline-no">&nbsp;</span>
648
+ <span class="cline-any cline-no">&nbsp;</span>
649
+ <span class="cline-any cline-neutral">&nbsp;</span>
650
+ <span class="cline-any cline-no">&nbsp;</span>
651
+ <span class="cline-any cline-no">&nbsp;</span>
652
+ <span class="cline-any cline-no">&nbsp;</span>
653
+ <span class="cline-any cline-no">&nbsp;</span>
654
+ <span class="cline-any cline-neutral">&nbsp;</span>
655
+ <span class="cline-any cline-neutral">&nbsp;</span>
656
+ <span class="cline-any cline-no">&nbsp;</span>
657
+ <span class="cline-any cline-no">&nbsp;</span>
658
+ <span class="cline-any cline-no">&nbsp;</span>
659
+ <span class="cline-any cline-no">&nbsp;</span>
660
+ <span class="cline-any cline-no">&nbsp;</span>
661
+ <span class="cline-any cline-no">&nbsp;</span>
662
+ <span class="cline-any cline-neutral">&nbsp;</span>
663
+ <span class="cline-any cline-no">&nbsp;</span>
664
+ <span class="cline-any cline-no">&nbsp;</span>
665
+ <span class="cline-any cline-neutral">&nbsp;</span>
666
+ <span class="cline-any cline-neutral">&nbsp;</span>
667
+ <span class="cline-any cline-no">&nbsp;</span>
668
+ <span class="cline-any cline-no">&nbsp;</span>
669
+ <span class="cline-any cline-neutral">&nbsp;</span>
670
+ <span class="cline-any cline-no">&nbsp;</span>
671
+ <span class="cline-any cline-no">&nbsp;</span>
672
+ <span class="cline-any cline-neutral">&nbsp;</span>
673
+ <span class="cline-any cline-no">&nbsp;</span>
674
+ <span class="cline-any cline-no">&nbsp;</span>
675
+ <span class="cline-any cline-neutral">&nbsp;</span>
676
+ <span class="cline-any cline-neutral">&nbsp;</span>
677
+ <span class="cline-any cline-no">&nbsp;</span>
678
+ <span class="cline-any cline-no">&nbsp;</span>
679
+ <span class="cline-any cline-neutral">&nbsp;</span>
680
+ <span class="cline-any cline-no">&nbsp;</span>
681
+ <span class="cline-any cline-no">&nbsp;</span>
682
+ <span class="cline-any cline-neutral">&nbsp;</span>
683
+ <span class="cline-any cline-no">&nbsp;</span>
684
+ <span class="cline-any cline-no">&nbsp;</span>
685
+ <span class="cline-any cline-no">&nbsp;</span>
686
+ <span class="cline-any cline-no">&nbsp;</span>
687
+ <span class="cline-any cline-neutral">&nbsp;</span>
688
+ <span class="cline-any cline-no">&nbsp;</span>
689
+ <span class="cline-any cline-neutral">&nbsp;</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-no">&nbsp;</span>
692
+ <span class="cline-any cline-no">&nbsp;</span>
693
+ <span class="cline-any cline-no">&nbsp;</span>
694
+ <span class="cline-any cline-no">&nbsp;</span>
695
+ <span class="cline-any cline-no">&nbsp;</span>
696
+ <span class="cline-any cline-neutral">&nbsp;</span>
697
+ <span class="cline-any cline-neutral">&nbsp;</span>
698
+ <span class="cline-any cline-no">&nbsp;</span>
699
+ <span class="cline-any cline-no">&nbsp;</span>
700
+ <span class="cline-any cline-no">&nbsp;</span>
701
+ <span class="cline-any cline-no">&nbsp;</span>
702
+ <span class="cline-any cline-no">&nbsp;</span>
703
+ <span class="cline-any cline-no">&nbsp;</span>
704
+ <span class="cline-any cline-neutral">&nbsp;</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-no">&nbsp;</span>
707
+ <span class="cline-any cline-neutral">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-no">&nbsp;</span>
710
+ <span class="cline-any cline-no">&nbsp;</span>
711
+ <span class="cline-any cline-no">&nbsp;</span>
712
+ <span class="cline-any cline-no">&nbsp;</span>
713
+ <span class="cline-any cline-no">&nbsp;</span>
714
+ <span class="cline-any cline-no">&nbsp;</span>
715
+ <span class="cline-any cline-no">&nbsp;</span>
716
+ <span class="cline-any cline-no">&nbsp;</span>
717
+ <span class="cline-any cline-no">&nbsp;</span>
718
+ <span class="cline-any cline-no">&nbsp;</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-no">&nbsp;</span>
721
+ <span class="cline-any cline-no">&nbsp;</span>
722
+ <span class="cline-any cline-neutral">&nbsp;</span>
723
+ <span class="cline-any cline-no">&nbsp;</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-no">&nbsp;</span>
726
+ <span class="cline-any cline-no">&nbsp;</span>
727
+ <span class="cline-any cline-no">&nbsp;</span>
728
+ <span class="cline-any cline-no">&nbsp;</span>
729
+ <span class="cline-any cline-neutral">&nbsp;</span>
730
+ <span class="cline-any cline-neutral">&nbsp;</span>
731
+ <span class="cline-any cline-no">&nbsp;</span>
732
+ <span class="cline-any cline-no">&nbsp;</span>
733
+ <span class="cline-any cline-no">&nbsp;</span>
734
+ <span class="cline-any cline-no">&nbsp;</span>
735
+ <span class="cline-any cline-no">&nbsp;</span>
736
+ <span class="cline-any cline-no">&nbsp;</span>
737
+ <span class="cline-any cline-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-no">&nbsp;</span>
740
+ <span class="cline-any cline-no">&nbsp;</span>
741
+ <span class="cline-any cline-neutral">&nbsp;</span>
742
+ <span class="cline-any cline-neutral">&nbsp;</span>
743
+ <span class="cline-any cline-no">&nbsp;</span>
744
+ <span class="cline-any cline-neutral">&nbsp;</span>
745
+ <span class="cline-any cline-no">&nbsp;</span>
746
+ <span class="cline-any cline-no">&nbsp;</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-no">&nbsp;</span>
750
+ <span class="cline-any cline-no">&nbsp;</span>
751
+ <span class="cline-any cline-neutral">&nbsp;</span>
752
+ <span class="cline-any cline-neutral">&nbsp;</span>
753
+ <span class="cline-any cline-no">&nbsp;</span>
754
+ <span class="cline-any cline-no">&nbsp;</span>
755
+ <span class="cline-any cline-neutral">&nbsp;</span>
756
+ <span class="cline-any cline-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-no">&nbsp;</span>
758
+ <span class="cline-any cline-neutral">&nbsp;</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-no">&nbsp;</span>
761
+ <span class="cline-any cline-no">&nbsp;</span>
762
+ <span class="cline-any cline-neutral">&nbsp;</span>
763
+ <span class="cline-any cline-neutral">&nbsp;</span>
764
+ <span class="cline-any cline-no">&nbsp;</span>
765
+ <span class="cline-any cline-no">&nbsp;</span>
766
+ <span class="cline-any cline-neutral">&nbsp;</span>
767
+ <span class="cline-any cline-no">&nbsp;</span>
768
+ <span class="cline-any cline-neutral">&nbsp;</span>
769
+ <span class="cline-any cline-neutral">&nbsp;</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-no">&nbsp;</span>
772
+ <span class="cline-any cline-neutral">&nbsp;</span>
773
+ <span class="cline-any cline-neutral">&nbsp;</span>
774
+ <span class="cline-any cline-no">&nbsp;</span>
775
+ <span class="cline-any cline-no">&nbsp;</span>
776
+ <span class="cline-any cline-no">&nbsp;</span>
777
+ <span class="cline-any cline-neutral">&nbsp;</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-no">&nbsp;</span>
780
+ <span class="cline-any cline-no">&nbsp;</span>
781
+ <span class="cline-any cline-no">&nbsp;</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-neutral">&nbsp;</span>
784
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import type { OnServiceDestroy, OnServiceInit } from '@navios/di'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
785
+ &nbsp;
786
+ <span class="cstat-no" title="statement not covered" >import { asyncInject, Container, inject, Injectable } from '@navios/di'</span>
787
+ &nbsp;
788
+ <span class="cstat-no" title="statement not covered" >const container = new Container()</span>
789
+ /**
790
+ * Service Lifecycle Example
791
+ *
792
+ * This example demonstrates:
793
+ * - OnServiceInit interface
794
+ * - OnServiceDestroy interface
795
+ * - Service initialization and cleanup
796
+ * - Resource management
797
+ */
798
+ &nbsp;
799
+ // 1. Service with initialization and cleanup
800
+ <span class="cstat-no" title="statement not covered" >@Injectable()</span>
801
+ <span class="cstat-no" title="statement not covered" >class DatabaseService implements OnServiceInit, OnServiceDestroy {</span>
802
+ <span class="cstat-no" title="statement not covered" > private connection: any = null</span>
803
+ <span class="cstat-no" title="statement not covered" > private isConnected = false</span>
804
+ &nbsp;
805
+ <span class="cstat-no" title="statement not covered" > async onServiceInit() {</span>
806
+ <span class="cstat-no" title="statement not covered" > console.log('🔄 Initializing database service...')</span>
807
+ &nbsp;
808
+ <span class="cstat-no" title="statement not covered" > try {</span>
809
+ <span class="cstat-no" title="statement not covered" > this.connection = await this.connect()</span>
810
+ <span class="cstat-no" title="statement not covered" > this.isConnected = true</span>
811
+ <span class="cstat-no" title="statement not covered" > console.log('✅ Database service initialized successfully')</span>
812
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
813
+ <span class="cstat-no" title="statement not covered" > console.error('❌ Failed to initialize database service:', error)</span>
814
+ <span class="cstat-no" title="statement not covered" > throw error</span>
815
+ <span class="cstat-no" title="statement not covered" > }</span>
816
+ <span class="cstat-no" title="statement not covered" > }</span>
817
+ &nbsp;
818
+ <span class="cstat-no" title="statement not covered" > async onServiceDestroy() {</span>
819
+ <span class="cstat-no" title="statement not covered" > console.log('🔄 Destroying database service...')</span>
820
+ &nbsp;
821
+ <span class="cstat-no" title="statement not covered" > try {</span>
822
+ <span class="cstat-no" title="statement not covered" > if (this.connection &amp;&amp; this.isConnected) {</span>
823
+ <span class="cstat-no" title="statement not covered" > await this.disconnect()</span>
824
+ <span class="cstat-no" title="statement not covered" > this.isConnected = false</span>
825
+ <span class="cstat-no" title="statement not covered" > console.log('✅ Database service destroyed successfully')</span>
826
+ <span class="cstat-no" title="statement not covered" > } else {</span>
827
+ <span class="cstat-no" title="statement not covered" > console.log('ℹ️ Database service was not connected')</span>
828
+ <span class="cstat-no" title="statement not covered" > }</span>
829
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
830
+ <span class="cstat-no" title="statement not covered" > console.error('❌ Error during database service cleanup:', error)</span>
831
+ <span class="cstat-no" title="statement not covered" > }</span>
832
+ <span class="cstat-no" title="statement not covered" > }</span>
833
+ &nbsp;
834
+ <span class="cstat-no" title="statement not covered" > private async connect() {</span>
835
+ // Simulate database connection
836
+ <span class="cstat-no" title="statement not covered" > console.log('🔌 Connecting to database...')</span>
837
+ <span class="cstat-no" title="statement not covered" > await new Promise((resolve) =&gt; setTimeout(resolve, 200))</span>
838
+ &nbsp;
839
+ <span class="cstat-no" title="statement not covered" > return {</span>
840
+ <span class="cstat-no" title="statement not covered" > host: 'localhost',</span>
841
+ <span class="cstat-no" title="statement not covered" > port: 5432,</span>
842
+ <span class="cstat-no" title="statement not covered" > database: 'myapp',</span>
843
+ <span class="cstat-no" title="statement not covered" > connected: true,</span>
844
+ <span class="cstat-no" title="statement not covered" > connectTime: new Date(),</span>
845
+ <span class="cstat-no" title="statement not covered" > }</span>
846
+ <span class="cstat-no" title="statement not covered" > }</span>
847
+ &nbsp;
848
+ <span class="cstat-no" title="statement not covered" > private async disconnect() {</span>
849
+ // Simulate database disconnection
850
+ <span class="cstat-no" title="statement not covered" > console.log('🔌 Disconnecting from database...')</span>
851
+ <span class="cstat-no" title="statement not covered" > await new Promise((resolve) =&gt; setTimeout(resolve, 100))</span>
852
+ <span class="cstat-no" title="statement not covered" > }</span>
853
+ &nbsp;
854
+ <span class="cstat-no" title="statement not covered" > async query(sql: string) {</span>
855
+ <span class="cstat-no" title="statement not covered" > if (!this.isConnected) {</span>
856
+ <span class="cstat-no" title="statement not covered" > throw new Error('Database not connected')</span>
857
+ <span class="cstat-no" title="statement not covered" > }</span>
858
+ &nbsp;
859
+ <span class="cstat-no" title="statement not covered" > console.log(`📊 Executing query: ${sql}`)</span>
860
+ <span class="cstat-no" title="statement not covered" > return { rows: [], query: sql, executedAt: new Date() }</span>
861
+ <span class="cstat-no" title="statement not covered" > }</span>
862
+ <span class="cstat-no" title="statement not covered" >}</span>
863
+ &nbsp;
864
+ // 2. Service with multiple resources
865
+ <span class="cstat-no" title="statement not covered" >@Injectable()</span>
866
+ <span class="cstat-no" title="statement not covered" >class CacheService implements OnServiceInit, OnServiceDestroy {</span>
867
+ <span class="cstat-no" title="statement not covered" > private cache = new Map()</span>
868
+ <span class="cstat-no" title="statement not covered" > private cleanupInterval: NodeJS.Timeout | null = null</span>
869
+ <span class="cstat-no" title="statement not covered" > private stats = {</span>
870
+ <span class="cstat-no" title="statement not covered" > hits: 0,</span>
871
+ <span class="cstat-no" title="statement not covered" > misses: 0,</span>
872
+ <span class="cstat-no" title="statement not covered" > sets: 0,</span>
873
+ <span class="cstat-no" title="statement not covered" > }</span>
874
+ &nbsp;
875
+ <span class="cstat-no" title="statement not covered" > async onServiceInit() {</span>
876
+ <span class="cstat-no" title="statement not covered" > console.log('🔄 Initializing cache service...')</span>
877
+ &nbsp;
878
+ // Start cleanup interval
879
+ <span class="cstat-no" title="statement not covered" > this.cleanupInterval = setInterval(() =&gt; {</span>
880
+ <span class="cstat-no" title="statement not covered" > this.cleanup()</span>
881
+ <span class="cstat-no" title="statement not covered" > }, 30000) // Cleanup every 30 seconds</span>
882
+ &nbsp;
883
+ <span class="cstat-no" title="statement not covered" > console.log('✅ Cache service initialized successfully')</span>
884
+ <span class="cstat-no" title="statement not covered" > }</span>
885
+ &nbsp;
886
+ <span class="cstat-no" title="statement not covered" > async onServiceDestroy() {</span>
887
+ <span class="cstat-no" title="statement not covered" > console.log('🔄 Destroying cache service...')</span>
888
+ &nbsp;
889
+ // Clear the cache
890
+ <span class="cstat-no" title="statement not covered" > this.cache.clear()</span>
891
+ &nbsp;
892
+ // Clear the interval
893
+ <span class="cstat-no" title="statement not covered" > if (this.cleanupInterval) {</span>
894
+ <span class="cstat-no" title="statement not covered" > clearInterval(this.cleanupInterval)</span>
895
+ <span class="cstat-no" title="statement not covered" > this.cleanupInterval = null</span>
896
+ <span class="cstat-no" title="statement not covered" > }</span>
897
+ &nbsp;
898
+ <span class="cstat-no" title="statement not covered" > console.log('✅ Cache service destroyed successfully')</span>
899
+ <span class="cstat-no" title="statement not covered" > console.log('📊 Final cache stats:', this.stats)</span>
900
+ <span class="cstat-no" title="statement not covered" > }</span>
901
+ &nbsp;
902
+ <span class="cstat-no" title="statement not covered" > set(key: string, value: any, ttl?: number) {</span>
903
+ <span class="cstat-no" title="statement not covered" > const expires = ttl ? Date.now() + ttl : null</span>
904
+ <span class="cstat-no" title="statement not covered" > this.cache.set(key, { value, expires })</span>
905
+ <span class="cstat-no" title="statement not covered" > this.stats.sets++</span>
906
+ <span class="cstat-no" title="statement not covered" > }</span>
907
+ &nbsp;
908
+ <span class="cstat-no" title="statement not covered" > get(key: string) {</span>
909
+ <span class="cstat-no" title="statement not covered" > const item = this.cache.get(key)</span>
910
+ <span class="cstat-no" title="statement not covered" > if (!item) {</span>
911
+ <span class="cstat-no" title="statement not covered" > this.stats.misses++</span>
912
+ <span class="cstat-no" title="statement not covered" > return null</span>
913
+ <span class="cstat-no" title="statement not covered" > }</span>
914
+ &nbsp;
915
+ <span class="cstat-no" title="statement not covered" > if (item.expires &amp;&amp; Date.now() &gt; item.expires) {</span>
916
+ <span class="cstat-no" title="statement not covered" > this.cache.delete(key)</span>
917
+ <span class="cstat-no" title="statement not covered" > this.stats.misses++</span>
918
+ <span class="cstat-no" title="statement not covered" > return null</span>
919
+ <span class="cstat-no" title="statement not covered" > }</span>
920
+ &nbsp;
921
+ <span class="cstat-no" title="statement not covered" > this.stats.hits++</span>
922
+ <span class="cstat-no" title="statement not covered" > return item.value</span>
923
+ <span class="cstat-no" title="statement not covered" > }</span>
924
+ &nbsp;
925
+ <span class="cstat-no" title="statement not covered" > private cleanup() {</span>
926
+ <span class="cstat-no" title="statement not covered" > const now = Date.now()</span>
927
+ <span class="cstat-no" title="statement not covered" > let cleaned = 0</span>
928
+ &nbsp;
929
+ <span class="cstat-no" title="statement not covered" > for (const [key, item] of this.cache.entries()) {</span>
930
+ <span class="cstat-no" title="statement not covered" > if (item.expires &amp;&amp; now &gt; item.expires) {</span>
931
+ <span class="cstat-no" title="statement not covered" > this.cache.delete(key)</span>
932
+ <span class="cstat-no" title="statement not covered" > cleaned++</span>
933
+ <span class="cstat-no" title="statement not covered" > }</span>
934
+ <span class="cstat-no" title="statement not covered" > }</span>
935
+ &nbsp;
936
+ <span class="cstat-no" title="statement not covered" > if (cleaned &gt; 0) {</span>
937
+ <span class="cstat-no" title="statement not covered" > console.log(`🧹 Cache cleanup: removed ${cleaned} expired entries`)</span>
938
+ <span class="cstat-no" title="statement not covered" > }</span>
939
+ <span class="cstat-no" title="statement not covered" > }</span>
940
+ &nbsp;
941
+ <span class="cstat-no" title="statement not covered" > getStats() {</span>
942
+ <span class="cstat-no" title="statement not covered" > return { ...this.stats, size: this.cache.size }</span>
943
+ <span class="cstat-no" title="statement not covered" > }</span>
944
+ <span class="cstat-no" title="statement not covered" >}</span>
945
+ &nbsp;
946
+ // 3. Service with conditional initialization
947
+ <span class="cstat-no" title="statement not covered" >@Injectable()</span>
948
+ <span class="cstat-no" title="statement not covered" >class EmailService implements OnServiceInit, OnServiceDestroy {</span>
949
+ <span class="cstat-no" title="statement not covered" > private smtpConnection: any = null</span>
950
+ <span class="cstat-no" title="statement not covered" > private initialized = false</span>
951
+ &nbsp;
952
+ <span class="cstat-no" title="statement not covered" > async onServiceInit() {</span>
953
+ <span class="cstat-no" title="statement not covered" > console.log('🔄 Initializing email service...')</span>
954
+ &nbsp;
955
+ // Check if email service should be enabled
956
+ <span class="cstat-no" title="statement not covered" > const emailEnabled = process.env.EMAIL_ENABLED === 'true'</span>
957
+ &nbsp;
958
+ <span class="cstat-no" title="statement not covered" > if (emailEnabled) {</span>
959
+ <span class="cstat-no" title="statement not covered" > try {</span>
960
+ <span class="cstat-no" title="statement not covered" > this.smtpConnection = await this.connectToSmtp()</span>
961
+ <span class="cstat-no" title="statement not covered" > this.initialized = true</span>
962
+ <span class="cstat-no" title="statement not covered" > console.log('✅ Email service initialized successfully')</span>
963
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
964
+ <span class="cstat-no" title="statement not covered" > console.error('❌ Failed to initialize email service:', error)</span>
965
+ // Don't throw - let the service be created but mark it as failed
966
+ <span class="cstat-no" title="statement not covered" > }</span>
967
+ <span class="cstat-no" title="statement not covered" > } else {</span>
968
+ <span class="cstat-no" title="statement not covered" > console.log('ℹ️ Email service disabled by configuration')</span>
969
+ <span class="cstat-no" title="statement not covered" > }</span>
970
+ <span class="cstat-no" title="statement not covered" > }</span>
971
+ &nbsp;
972
+ <span class="cstat-no" title="statement not covered" > async onServiceDestroy() {</span>
973
+ <span class="cstat-no" title="statement not covered" > console.log('🔄 Destroying email service...')</span>
974
+ &nbsp;
975
+ <span class="cstat-no" title="statement not covered" > if (this.initialized &amp;&amp; this.smtpConnection) {</span>
976
+ <span class="cstat-no" title="statement not covered" > try {</span>
977
+ <span class="cstat-no" title="statement not covered" > await this.disconnectFromSmtp()</span>
978
+ <span class="cstat-no" title="statement not covered" > console.log('✅ Email service destroyed successfully')</span>
979
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
980
+ <span class="cstat-no" title="statement not covered" > console.error('❌ Error during email service cleanup:', error)</span>
981
+ <span class="cstat-no" title="statement not covered" > }</span>
982
+ <span class="cstat-no" title="statement not covered" > } else {</span>
983
+ <span class="cstat-no" title="statement not covered" > console.log('ℹ️ Email service was not initialized')</span>
984
+ <span class="cstat-no" title="statement not covered" > }</span>
985
+ <span class="cstat-no" title="statement not covered" > }</span>
986
+ &nbsp;
987
+ <span class="cstat-no" title="statement not covered" > private async connectToSmtp() {</span>
988
+ <span class="cstat-no" title="statement not covered" > console.log('🔌 Connecting to SMTP server...')</span>
989
+ <span class="cstat-no" title="statement not covered" > await new Promise((resolve) =&gt; setTimeout(resolve, 150))</span>
990
+ &nbsp;
991
+ <span class="cstat-no" title="statement not covered" > return {</span>
992
+ <span class="cstat-no" title="statement not covered" > host: 'smtp.example.com',</span>
993
+ <span class="cstat-no" title="statement not covered" > port: 587,</span>
994
+ <span class="cstat-no" title="statement not covered" > secure: false,</span>
995
+ <span class="cstat-no" title="statement not covered" > connected: true,</span>
996
+ <span class="cstat-no" title="statement not covered" > }</span>
997
+ <span class="cstat-no" title="statement not covered" > }</span>
998
+ &nbsp;
999
+ <span class="cstat-no" title="statement not covered" > private async disconnectFromSmtp() {</span>
1000
+ <span class="cstat-no" title="statement not covered" > console.log('🔌 Disconnecting from SMTP server...')</span>
1001
+ <span class="cstat-no" title="statement not covered" > await new Promise((resolve) =&gt; setTimeout(resolve, 100))</span>
1002
+ <span class="cstat-no" title="statement not covered" > }</span>
1003
+ &nbsp;
1004
+ <span class="cstat-no" title="statement not covered" > async sendEmail(to: string, subject: string, body: string) {</span>
1005
+ <span class="cstat-no" title="statement not covered" > if (!this.initialized) {</span>
1006
+ <span class="cstat-no" title="statement not covered" > throw new Error('Email service not initialized')</span>
1007
+ <span class="cstat-no" title="statement not covered" > }</span>
1008
+ &nbsp;
1009
+ <span class="cstat-no" title="statement not covered" > console.log(`📧 Sending email to ${to}: ${subject}`)</span>
1010
+ <span class="cstat-no" title="statement not covered" > return { success: true, messageId: Math.random().toString(36) }</span>
1011
+ <span class="cstat-no" title="statement not covered" > }</span>
1012
+ <span class="cstat-no" title="statement not covered" >}</span>
1013
+ &nbsp;
1014
+ // 4. Service that depends on other services with lifecycle
1015
+ <span class="cstat-no" title="statement not covered" >@Injectable()</span>
1016
+ <span class="cstat-no" title="statement not covered" >class UserService implements OnServiceInit, OnServiceDestroy {</span>
1017
+ <span class="cstat-no" title="statement not covered" > private readonly db = inject(DatabaseService)</span>
1018
+ <span class="cstat-no" title="statement not covered" > private readonly cache = inject(CacheService)</span>
1019
+ <span class="cstat-no" title="statement not covered" > private readonly email = asyncInject(EmailService)</span>
1020
+ <span class="cstat-no" title="statement not covered" > private initialized = false</span>
1021
+ &nbsp;
1022
+ <span class="cstat-no" title="statement not covered" > async onServiceInit() {</span>
1023
+ <span class="cstat-no" title="statement not covered" > console.log('🔄 Initializing user service...')</span>
1024
+ &nbsp;
1025
+ // Wait for email service to be ready
1026
+ <span class="cstat-no" title="statement not covered" > await this.email</span>
1027
+ <span class="cstat-no" title="statement not covered" > this.initialized = true</span>
1028
+ &nbsp;
1029
+ <span class="cstat-no" title="statement not covered" > console.log('✅ User service initialized successfully')</span>
1030
+ <span class="cstat-no" title="statement not covered" > }</span>
1031
+ &nbsp;
1032
+ <span class="cstat-no" title="statement not covered" > async onServiceDestroy() {</span>
1033
+ <span class="cstat-no" title="statement not covered" > console.log('🔄 Destroying user service...')</span>
1034
+ &nbsp;
1035
+ // Clear user-related cache entries
1036
+ <span class="cstat-no" title="statement not covered" > this.cache.set('users:count', null)</span>
1037
+ <span class="cstat-no" title="statement not covered" > this.cache.set('users:active', null)</span>
1038
+ &nbsp;
1039
+ <span class="cstat-no" title="statement not covered" > console.log('✅ User service destroyed successfully')</span>
1040
+ <span class="cstat-no" title="statement not covered" > }</span>
1041
+ &nbsp;
1042
+ <span class="cstat-no" title="statement not covered" > async createUser(name: string, email: string) {</span>
1043
+ <span class="cstat-no" title="statement not covered" > if (!this.initialized) {</span>
1044
+ <span class="cstat-no" title="statement not covered" > throw new Error('User service not initialized')</span>
1045
+ <span class="cstat-no" title="statement not covered" > }</span>
1046
+ &nbsp;
1047
+ <span class="cstat-no" title="statement not covered" > console.log(`👤 Creating user: ${name}`)</span>
1048
+ &nbsp;
1049
+ // Check cache first
1050
+ <span class="cstat-no" title="statement not covered" > const cached = this.cache.get(`user:${email}`)</span>
1051
+ <span class="cstat-no" title="statement not covered" > if (cached) {</span>
1052
+ <span class="cstat-no" title="statement not covered" > console.log('📋 User found in cache')</span>
1053
+ <span class="cstat-no" title="statement not covered" > return cached</span>
1054
+ <span class="cstat-no" title="statement not covered" > }</span>
1055
+ &nbsp;
1056
+ // Create user in database
1057
+ <span class="cstat-no" title="statement not covered" > const user = {</span>
1058
+ <span class="cstat-no" title="statement not covered" > id: Math.random().toString(36),</span>
1059
+ <span class="cstat-no" title="statement not covered" > name,</span>
1060
+ <span class="cstat-no" title="statement not covered" > email,</span>
1061
+ <span class="cstat-no" title="statement not covered" > createdAt: new Date(),</span>
1062
+ <span class="cstat-no" title="statement not covered" > }</span>
1063
+ &nbsp;
1064
+ // Cache the user
1065
+ <span class="cstat-no" title="statement not covered" > this.cache.set(`user:${email}`, user, 300000) // 5 minutes TTL</span>
1066
+ &nbsp;
1067
+ // Send welcome email
1068
+ <span class="cstat-no" title="statement not covered" > try {</span>
1069
+ <span class="cstat-no" title="statement not covered" > const emailService = await this.email</span>
1070
+ <span class="cstat-no" title="statement not covered" > await emailService.sendEmail(</span>
1071
+ <span class="cstat-no" title="statement not covered" > email,</span>
1072
+ <span class="cstat-no" title="statement not covered" > 'Welcome!',</span>
1073
+ <span class="cstat-no" title="statement not covered" > `Hello ${name}, welcome to our platform!`,</span>
1074
+ <span class="cstat-no" title="statement not covered" > )</span>
1075
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1076
+ <span class="cstat-no" title="statement not covered" > console.error('Failed to send welcome email:', error)</span>
1077
+ <span class="cstat-no" title="statement not covered" > }</span>
1078
+ &nbsp;
1079
+ <span class="cstat-no" title="statement not covered" > return user</span>
1080
+ <span class="cstat-no" title="statement not covered" > }</span>
1081
+ &nbsp;
1082
+ <span class="cstat-no" title="statement not covered" > async getUser(email: string) {</span>
1083
+ // Check cache first
1084
+ <span class="cstat-no" title="statement not covered" > const cached = this.cache.get(`user:${email}`)</span>
1085
+ <span class="cstat-no" title="statement not covered" > if (cached) {</span>
1086
+ <span class="cstat-no" title="statement not covered" > return cached</span>
1087
+ <span class="cstat-no" title="statement not covered" > }</span>
1088
+ &nbsp;
1089
+ // Query database
1090
+ <span class="cstat-no" title="statement not covered" > const result = await this.db.query(</span>
1091
+ <span class="cstat-no" title="statement not covered" > `SELECT * FROM users WHERE email = '${email}'`,</span>
1092
+ <span class="cstat-no" title="statement not covered" > )</span>
1093
+ <span class="cstat-no" title="statement not covered" > return result.rows[0] || null</span>
1094
+ <span class="cstat-no" title="statement not covered" > }</span>
1095
+ <span class="cstat-no" title="statement not covered" >}</span>
1096
+ &nbsp;
1097
+ // 5. Usage example
1098
+ <span class="cstat-no" title="statement not covered" >async function demonstrateLifecycle() {</span>
1099
+ <span class="cstat-no" title="statement not covered" > console.log('=== Service Lifecycle Example ===\n')</span>
1100
+ &nbsp;
1101
+ // Create services (initialization happens automatically)
1102
+ <span class="cstat-no" title="statement not covered" > const userService = await container.get(UserService)</span>
1103
+ // oxlint-disable-next-line no-unused-vars
1104
+ <span class="cstat-no" title="statement not covered" > const dbService = await container.get(DatabaseService)</span>
1105
+ <span class="cstat-no" title="statement not covered" > const cacheService = await container.get(CacheService)</span>
1106
+ &nbsp;
1107
+ // Use the services
1108
+ <span class="cstat-no" title="statement not covered" > const user = await userService.createUser('Alice', 'alice@example.com')</span>
1109
+ <span class="cstat-no" title="statement not covered" > console.log('Created user:', user)</span>
1110
+ &nbsp;
1111
+ // Check cache stats
1112
+ <span class="cstat-no" title="statement not covered" > const stats = cacheService.getStats()</span>
1113
+ <span class="cstat-no" title="statement not covered" > console.log('Cache stats:', stats)</span>
1114
+ &nbsp;
1115
+ // Simulate some work
1116
+ <span class="cstat-no" title="statement not covered" > await new Promise((resolve) =&gt; setTimeout(resolve, 1000))</span>
1117
+ &nbsp;
1118
+ // Get user from cache
1119
+ <span class="cstat-no" title="statement not covered" > const cachedUser = await userService.getUser('alice@example.com')</span>
1120
+ <span class="cstat-no" title="statement not covered" > console.log('Retrieved user:', cachedUser)</span>
1121
+ &nbsp;
1122
+ // Check updated cache stats
1123
+ <span class="cstat-no" title="statement not covered" > const updatedStats = cacheService.getStats()</span>
1124
+ <span class="cstat-no" title="statement not covered" > console.log('Updated cache stats:', updatedStats)</span>
1125
+ &nbsp;
1126
+ <span class="cstat-no" title="statement not covered" > console.log('\n=== Service Cleanup ===')</span>
1127
+ &nbsp;
1128
+ // Services will be cleaned up when the application shuts down
1129
+ // or when explicitly invalidated
1130
+ <span class="cstat-no" title="statement not covered" >}</span>
1131
+ &nbsp;
1132
+ // Main function
1133
+ <span class="cstat-no" title="statement not covered" >async function main() {</span>
1134
+ <span class="cstat-no" title="statement not covered" > await demonstrateLifecycle()</span>
1135
+ <span class="cstat-no" title="statement not covered" >}</span>
1136
+ &nbsp;
1137
+ // Run the example
1138
+ <span class="cstat-no" title="statement not covered" >if (require.main === module) {</span>
1139
+ <span class="cstat-no" title="statement not covered" > main().catch(console.error)</span>
1140
+ <span class="cstat-no" title="statement not covered" >}</span>
1141
+ &nbsp;
1142
+ export { DatabaseService, CacheService, EmailService, UserService }
1143
+ &nbsp;</pre></td></tr></table></pre>
1144
+
1145
+ <div class='push'></div><!-- for sticky footer -->
1146
+ </div><!-- /wrapper -->
1147
+ <div class='footer quiet pad2 space-top1 center small'>
1148
+ Code coverage generated by
1149
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1150
+ at 2025-09-19T12:38:51.382Z
1151
+ </div>
1152
+ <script src="../../prettify.js"></script>
1153
+ <script>
1154
+ window.onload = function () {
1155
+ prettyPrint();
1156
+ };
1157
+ </script>
1158
+ <script src="../../sorter.js"></script>
1159
+ <script src="../../block-navigation.js"></script>
1160
+ </body>
1161
+ </html>
1162
+