@navios/di 0.3.0 → 0.4.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.
- package/README.md +67 -6
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +2659 -0
- package/coverage/coverage-final.json +46 -0
- package/coverage/docs/examples/basic-usage.mts.html +376 -0
- package/coverage/docs/examples/factory-pattern.mts.html +1039 -0
- package/coverage/docs/examples/index.html +176 -0
- package/coverage/docs/examples/injection-tokens.mts.html +760 -0
- package/coverage/docs/examples/request-scope-example.mts.html +847 -0
- package/coverage/docs/examples/service-lifecycle.mts.html +1162 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +236 -0
- package/coverage/lib/_tsup-dts-rollup.d.mts.html +2806 -0
- package/coverage/lib/index.d.mts.html +310 -0
- package/coverage/lib/index.html +131 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +196 -0
- package/coverage/src/container.mts.html +586 -0
- package/coverage/src/decorators/factory.decorator.mts.html +322 -0
- package/coverage/src/decorators/index.html +146 -0
- package/coverage/src/decorators/index.mts.html +91 -0
- package/coverage/src/decorators/injectable.decorator.mts.html +394 -0
- package/coverage/src/enums/index.html +146 -0
- package/coverage/src/enums/index.mts.html +91 -0
- package/coverage/src/enums/injectable-scope.enum.mts.html +127 -0
- package/coverage/src/enums/injectable-type.enum.mts.html +97 -0
- package/coverage/src/errors/errors.enum.mts.html +109 -0
- package/coverage/src/errors/factory-not-found.mts.html +109 -0
- package/coverage/src/errors/factory-token-not-resolved.mts.html +115 -0
- package/coverage/src/errors/index.html +221 -0
- package/coverage/src/errors/index.mts.html +106 -0
- package/coverage/src/errors/instance-destroying.mts.html +109 -0
- package/coverage/src/errors/instance-expired.mts.html +109 -0
- package/coverage/src/errors/instance-not-found.mts.html +109 -0
- package/coverage/src/errors/unknown-error.mts.html +130 -0
- package/coverage/src/event-emitter.mts.html +400 -0
- package/coverage/src/factory-context.mts.html +109 -0
- package/coverage/src/index.html +296 -0
- package/coverage/src/index.mts.html +139 -0
- package/coverage/src/injection-token.mts.html +571 -0
- package/coverage/src/injector.mts.html +133 -0
- package/coverage/src/interfaces/factory.interface.mts.html +121 -0
- package/coverage/src/interfaces/index.html +161 -0
- package/coverage/src/interfaces/index.mts.html +94 -0
- package/coverage/src/interfaces/on-service-destroy.interface.mts.html +94 -0
- package/coverage/src/interfaces/on-service-init.interface.mts.html +94 -0
- package/coverage/src/registry.mts.html +247 -0
- package/coverage/src/request-context-holder.mts.html +607 -0
- package/coverage/src/service-instantiator.mts.html +559 -0
- package/coverage/src/service-locator-event-bus.mts.html +289 -0
- package/coverage/src/service-locator-instance-holder.mts.html +307 -0
- package/coverage/src/service-locator-manager.mts.html +604 -0
- package/coverage/src/service-locator.mts.html +2911 -0
- package/coverage/src/symbols/index.html +131 -0
- package/coverage/src/symbols/index.mts.html +88 -0
- package/coverage/src/symbols/injectable-token.mts.html +88 -0
- package/coverage/src/utils/defer.mts.html +304 -0
- package/coverage/src/utils/get-injectable-token.mts.html +142 -0
- package/coverage/src/utils/get-injectors.mts.html +691 -0
- package/coverage/src/utils/index.html +176 -0
- package/coverage/src/utils/index.mts.html +97 -0
- package/coverage/src/utils/types.mts.html +241 -0
- package/docs/README.md +5 -2
- package/docs/api-reference.md +38 -0
- package/docs/container.md +75 -0
- package/docs/getting-started.md +4 -3
- package/docs/injectable.md +4 -3
- package/docs/migration.md +177 -0
- package/docs/request-contexts.md +364 -0
- package/lib/_tsup-dts-rollup.d.mts +180 -35
- package/lib/_tsup-dts-rollup.d.ts +180 -35
- package/lib/index.d.mts +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +485 -279
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +485 -280
- package/lib/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/defer.spec.mts +166 -0
- package/src/__tests__/errors.spec.mts +61 -0
- package/src/__tests__/event-emitter.spec.mts +163 -0
- package/src/__tests__/get-injectors.spec.mts +70 -0
- package/src/__tests__/registry.spec.mts +335 -0
- package/src/__tests__/request-scope.spec.mts +167 -4
- package/src/__tests__/service-instantiator.spec.mts +408 -0
- package/src/__tests__/service-locator-event-bus.spec.mts +242 -0
- package/src/__tests__/service-locator-manager.spec.mts +370 -0
- package/src/__tests__/unified-api.spec.mts +130 -0
- package/src/base-instance-holder-manager.mts +175 -0
- package/src/index.mts +1 -0
- package/src/request-context-holder.mts +85 -27
- package/src/service-locator-manager.mts +12 -70
- 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"> </span>
|
|
426
|
+
<span class="cline-any cline-neutral"> </span>
|
|
427
|
+
<span class="cline-any cline-no"> </span>
|
|
428
|
+
<span class="cline-any cline-neutral"> </span>
|
|
429
|
+
<span class="cline-any cline-no"> </span>
|
|
430
|
+
<span class="cline-any cline-neutral"> </span>
|
|
431
|
+
<span class="cline-any cline-neutral"> </span>
|
|
432
|
+
<span class="cline-any cline-neutral"> </span>
|
|
433
|
+
<span class="cline-any cline-neutral"> </span>
|
|
434
|
+
<span class="cline-any cline-neutral"> </span>
|
|
435
|
+
<span class="cline-any cline-neutral"> </span>
|
|
436
|
+
<span class="cline-any cline-neutral"> </span>
|
|
437
|
+
<span class="cline-any cline-neutral"> </span>
|
|
438
|
+
<span class="cline-any cline-neutral"> </span>
|
|
439
|
+
<span class="cline-any cline-neutral"> </span>
|
|
440
|
+
<span class="cline-any cline-neutral"> </span>
|
|
441
|
+
<span class="cline-any cline-no"> </span>
|
|
442
|
+
<span class="cline-any cline-no"> </span>
|
|
443
|
+
<span class="cline-any cline-no"> </span>
|
|
444
|
+
<span class="cline-any cline-no"> </span>
|
|
445
|
+
<span class="cline-any cline-neutral"> </span>
|
|
446
|
+
<span class="cline-any cline-no"> </span>
|
|
447
|
+
<span class="cline-any cline-no"> </span>
|
|
448
|
+
<span class="cline-any cline-neutral"> </span>
|
|
449
|
+
<span class="cline-any cline-no"> </span>
|
|
450
|
+
<span class="cline-any cline-no"> </span>
|
|
451
|
+
<span class="cline-any cline-no"> </span>
|
|
452
|
+
<span class="cline-any cline-no"> </span>
|
|
453
|
+
<span class="cline-any cline-no"> </span>
|
|
454
|
+
<span class="cline-any cline-no"> </span>
|
|
455
|
+
<span class="cline-any cline-no"> </span>
|
|
456
|
+
<span class="cline-any cline-no"> </span>
|
|
457
|
+
<span class="cline-any cline-no"> </span>
|
|
458
|
+
<span class="cline-any cline-neutral"> </span>
|
|
459
|
+
<span class="cline-any cline-no"> </span>
|
|
460
|
+
<span class="cline-any cline-no"> </span>
|
|
461
|
+
<span class="cline-any cline-neutral"> </span>
|
|
462
|
+
<span class="cline-any cline-no"> </span>
|
|
463
|
+
<span class="cline-any cline-no"> </span>
|
|
464
|
+
<span class="cline-any cline-no"> </span>
|
|
465
|
+
<span class="cline-any cline-no"> </span>
|
|
466
|
+
<span class="cline-any cline-no"> </span>
|
|
467
|
+
<span class="cline-any cline-no"> </span>
|
|
468
|
+
<span class="cline-any cline-no"> </span>
|
|
469
|
+
<span class="cline-any cline-no"> </span>
|
|
470
|
+
<span class="cline-any cline-no"> </span>
|
|
471
|
+
<span class="cline-any cline-no"> </span>
|
|
472
|
+
<span class="cline-any cline-no"> </span>
|
|
473
|
+
<span class="cline-any cline-no"> </span>
|
|
474
|
+
<span class="cline-any cline-neutral"> </span>
|
|
475
|
+
<span class="cline-any cline-no"> </span>
|
|
476
|
+
<span class="cline-any cline-neutral"> </span>
|
|
477
|
+
<span class="cline-any cline-no"> </span>
|
|
478
|
+
<span class="cline-any cline-no"> </span>
|
|
479
|
+
<span class="cline-any cline-neutral"> </span>
|
|
480
|
+
<span class="cline-any cline-no"> </span>
|
|
481
|
+
<span class="cline-any cline-no"> </span>
|
|
482
|
+
<span class="cline-any cline-no"> </span>
|
|
483
|
+
<span class="cline-any cline-no"> </span>
|
|
484
|
+
<span class="cline-any cline-no"> </span>
|
|
485
|
+
<span class="cline-any cline-no"> </span>
|
|
486
|
+
<span class="cline-any cline-no"> </span>
|
|
487
|
+
<span class="cline-any cline-no"> </span>
|
|
488
|
+
<span class="cline-any cline-neutral"> </span>
|
|
489
|
+
<span class="cline-any cline-no"> </span>
|
|
490
|
+
<span class="cline-any cline-neutral"> </span>
|
|
491
|
+
<span class="cline-any cline-no"> </span>
|
|
492
|
+
<span class="cline-any cline-no"> </span>
|
|
493
|
+
<span class="cline-any cline-no"> </span>
|
|
494
|
+
<span class="cline-any cline-neutral"> </span>
|
|
495
|
+
<span class="cline-any cline-no"> </span>
|
|
496
|
+
<span class="cline-any cline-no"> </span>
|
|
497
|
+
<span class="cline-any cline-no"> </span>
|
|
498
|
+
<span class="cline-any cline-no"> </span>
|
|
499
|
+
<span class="cline-any cline-neutral"> </span>
|
|
500
|
+
<span class="cline-any cline-no"> </span>
|
|
501
|
+
<span class="cline-any cline-no"> </span>
|
|
502
|
+
<span class="cline-any cline-no"> </span>
|
|
503
|
+
<span class="cline-any cline-no"> </span>
|
|
504
|
+
<span class="cline-any cline-neutral"> </span>
|
|
505
|
+
<span class="cline-any cline-neutral"> </span>
|
|
506
|
+
<span class="cline-any cline-no"> </span>
|
|
507
|
+
<span class="cline-any cline-no"> </span>
|
|
508
|
+
<span class="cline-any cline-no"> </span>
|
|
509
|
+
<span class="cline-any cline-no"> </span>
|
|
510
|
+
<span class="cline-any cline-no"> </span>
|
|
511
|
+
<span class="cline-any cline-no"> </span>
|
|
512
|
+
<span class="cline-any cline-no"> </span>
|
|
513
|
+
<span class="cline-any cline-no"> </span>
|
|
514
|
+
<span class="cline-any cline-no"> </span>
|
|
515
|
+
<span class="cline-any cline-neutral"> </span>
|
|
516
|
+
<span class="cline-any cline-no"> </span>
|
|
517
|
+
<span class="cline-any cline-no"> </span>
|
|
518
|
+
<span class="cline-any cline-neutral"> </span>
|
|
519
|
+
<span class="cline-any cline-neutral"> </span>
|
|
520
|
+
<span class="cline-any cline-no"> </span>
|
|
521
|
+
<span class="cline-any cline-no"> </span>
|
|
522
|
+
<span class="cline-any cline-no"> </span>
|
|
523
|
+
<span class="cline-any cline-neutral"> </span>
|
|
524
|
+
<span class="cline-any cline-no"> </span>
|
|
525
|
+
<span class="cline-any cline-no"> </span>
|
|
526
|
+
<span class="cline-any cline-neutral"> </span>
|
|
527
|
+
<span class="cline-any cline-no"> </span>
|
|
528
|
+
<span class="cline-any cline-no"> </span>
|
|
529
|
+
<span class="cline-any cline-neutral"> </span>
|
|
530
|
+
<span class="cline-any cline-neutral"> </span>
|
|
531
|
+
<span class="cline-any cline-no"> </span>
|
|
532
|
+
<span class="cline-any cline-neutral"> </span>
|
|
533
|
+
<span class="cline-any cline-neutral"> </span>
|
|
534
|
+
<span class="cline-any cline-no"> </span>
|
|
535
|
+
<span class="cline-any cline-no"> </span>
|
|
536
|
+
<span class="cline-any cline-no"> </span>
|
|
537
|
+
<span class="cline-any cline-no"> </span>
|
|
538
|
+
<span class="cline-any cline-neutral"> </span>
|
|
539
|
+
<span class="cline-any cline-no"> </span>
|
|
540
|
+
<span class="cline-any cline-no"> </span>
|
|
541
|
+
<span class="cline-any cline-no"> </span>
|
|
542
|
+
<span class="cline-any cline-neutral"> </span>
|
|
543
|
+
<span class="cline-any cline-no"> </span>
|
|
544
|
+
<span class="cline-any cline-no"> </span>
|
|
545
|
+
<span class="cline-any cline-no"> </span>
|
|
546
|
+
<span class="cline-any cline-no"> </span>
|
|
547
|
+
<span class="cline-any cline-no"> </span>
|
|
548
|
+
<span class="cline-any cline-neutral"> </span>
|
|
549
|
+
<span class="cline-any cline-no"> </span>
|
|
550
|
+
<span class="cline-any cline-no"> </span>
|
|
551
|
+
<span class="cline-any cline-no"> </span>
|
|
552
|
+
<span class="cline-any cline-no"> </span>
|
|
553
|
+
<span class="cline-any cline-no"> </span>
|
|
554
|
+
<span class="cline-any cline-no"> </span>
|
|
555
|
+
<span class="cline-any cline-neutral"> </span>
|
|
556
|
+
<span class="cline-any cline-no"> </span>
|
|
557
|
+
<span class="cline-any cline-no"> </span>
|
|
558
|
+
<span class="cline-any cline-no"> </span>
|
|
559
|
+
<span class="cline-any cline-no"> </span>
|
|
560
|
+
<span class="cline-any cline-no"> </span>
|
|
561
|
+
<span class="cline-any cline-neutral"> </span>
|
|
562
|
+
<span class="cline-any cline-no"> </span>
|
|
563
|
+
<span class="cline-any cline-no"> </span>
|
|
564
|
+
<span class="cline-any cline-no"> </span>
|
|
565
|
+
<span class="cline-any cline-neutral"> </span>
|
|
566
|
+
<span class="cline-any cline-no"> </span>
|
|
567
|
+
<span class="cline-any cline-no"> </span>
|
|
568
|
+
<span class="cline-any cline-no"> </span>
|
|
569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
570
|
+
<span class="cline-any cline-no"> </span>
|
|
571
|
+
<span class="cline-any cline-no"> </span>
|
|
572
|
+
<span class="cline-any cline-no"> </span>
|
|
573
|
+
<span class="cline-any cline-no"> </span>
|
|
574
|
+
<span class="cline-any cline-no"> </span>
|
|
575
|
+
<span class="cline-any cline-no"> </span>
|
|
576
|
+
<span class="cline-any cline-neutral"> </span>
|
|
577
|
+
<span class="cline-any cline-no"> </span>
|
|
578
|
+
<span class="cline-any cline-no"> </span>
|
|
579
|
+
<span class="cline-any cline-no"> </span>
|
|
580
|
+
<span class="cline-any cline-no"> </span>
|
|
581
|
+
<span class="cline-any cline-neutral"> </span>
|
|
582
|
+
<span class="cline-any cline-no"> </span>
|
|
583
|
+
<span class="cline-any cline-no"> </span>
|
|
584
|
+
<span class="cline-any cline-no"> </span>
|
|
585
|
+
<span class="cline-any cline-no"> </span>
|
|
586
|
+
<span class="cline-any cline-neutral"> </span>
|
|
587
|
+
<span class="cline-any cline-neutral"> </span>
|
|
588
|
+
<span class="cline-any cline-no"> </span>
|
|
589
|
+
<span class="cline-any cline-no"> </span>
|
|
590
|
+
<span class="cline-any cline-no"> </span>
|
|
591
|
+
<span class="cline-any cline-no"> </span>
|
|
592
|
+
<span class="cline-any cline-neutral"> </span>
|
|
593
|
+
<span class="cline-any cline-no"> </span>
|
|
594
|
+
<span class="cline-any cline-no"> </span>
|
|
595
|
+
<span class="cline-any cline-neutral"> </span>
|
|
596
|
+
<span class="cline-any cline-neutral"> </span>
|
|
597
|
+
<span class="cline-any cline-no"> </span>
|
|
598
|
+
<span class="cline-any cline-neutral"> </span>
|
|
599
|
+
<span class="cline-any cline-no"> </span>
|
|
600
|
+
<span class="cline-any cline-no"> </span>
|
|
601
|
+
<span class="cline-any cline-no"> </span>
|
|
602
|
+
<span class="cline-any cline-no"> </span>
|
|
603
|
+
<span class="cline-any cline-no"> </span>
|
|
604
|
+
<span class="cline-any cline-no"> </span>
|
|
605
|
+
<span class="cline-any cline-no"> </span>
|
|
606
|
+
<span class="cline-any cline-neutral"> </span>
|
|
607
|
+
<span class="cline-any cline-no"> </span>
|
|
608
|
+
<span class="cline-any cline-no"> </span>
|
|
609
|
+
<span class="cline-any cline-no"> </span>
|
|
610
|
+
<span class="cline-any cline-no"> </span>
|
|
611
|
+
<span class="cline-any cline-no"> </span>
|
|
612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
613
|
+
<span class="cline-any cline-no"> </span>
|
|
614
|
+
<span class="cline-any cline-no"> </span>
|
|
615
|
+
<span class="cline-any cline-neutral"> </span>
|
|
616
|
+
<span class="cline-any cline-no"> </span>
|
|
617
|
+
<span class="cline-any cline-no"> </span>
|
|
618
|
+
<span class="cline-any cline-no"> </span>
|
|
619
|
+
<span class="cline-any cline-no"> </span>
|
|
620
|
+
<span class="cline-any cline-no"> </span>
|
|
621
|
+
<span class="cline-any cline-no"> </span>
|
|
622
|
+
<span class="cline-any cline-no"> </span>
|
|
623
|
+
<span class="cline-any cline-no"> </span>
|
|
624
|
+
<span class="cline-any cline-no"> </span>
|
|
625
|
+
<span class="cline-any cline-no"> </span>
|
|
626
|
+
<span class="cline-any cline-no"> </span>
|
|
627
|
+
<span class="cline-any cline-neutral"> </span>
|
|
628
|
+
<span class="cline-any cline-no"> </span>
|
|
629
|
+
<span class="cline-any cline-no"> </span>
|
|
630
|
+
<span class="cline-any cline-no"> </span>
|
|
631
|
+
<span class="cline-any cline-neutral"> </span>
|
|
632
|
+
<span class="cline-any cline-no"> </span>
|
|
633
|
+
<span class="cline-any cline-no"> </span>
|
|
634
|
+
<span class="cline-any cline-no"> </span>
|
|
635
|
+
<span class="cline-any cline-no"> </span>
|
|
636
|
+
<span class="cline-any cline-no"> </span>
|
|
637
|
+
<span class="cline-any cline-no"> </span>
|
|
638
|
+
<span class="cline-any cline-no"> </span>
|
|
639
|
+
<span class="cline-any cline-neutral"> </span>
|
|
640
|
+
<span class="cline-any cline-no"> </span>
|
|
641
|
+
<span class="cline-any cline-no"> </span>
|
|
642
|
+
<span class="cline-any cline-no"> </span>
|
|
643
|
+
<span class="cline-any cline-no"> </span>
|
|
644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
645
|
+
<span class="cline-any cline-no"> </span>
|
|
646
|
+
<span class="cline-any cline-no"> </span>
|
|
647
|
+
<span class="cline-any cline-no"> </span>
|
|
648
|
+
<span class="cline-any cline-no"> </span>
|
|
649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
650
|
+
<span class="cline-any cline-no"> </span>
|
|
651
|
+
<span class="cline-any cline-no"> </span>
|
|
652
|
+
<span class="cline-any cline-no"> </span>
|
|
653
|
+
<span class="cline-any cline-no"> </span>
|
|
654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
656
|
+
<span class="cline-any cline-no"> </span>
|
|
657
|
+
<span class="cline-any cline-no"> </span>
|
|
658
|
+
<span class="cline-any cline-no"> </span>
|
|
659
|
+
<span class="cline-any cline-no"> </span>
|
|
660
|
+
<span class="cline-any cline-no"> </span>
|
|
661
|
+
<span class="cline-any cline-no"> </span>
|
|
662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
663
|
+
<span class="cline-any cline-no"> </span>
|
|
664
|
+
<span class="cline-any cline-no"> </span>
|
|
665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
666
|
+
<span class="cline-any cline-neutral"> </span>
|
|
667
|
+
<span class="cline-any cline-no"> </span>
|
|
668
|
+
<span class="cline-any cline-no"> </span>
|
|
669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
670
|
+
<span class="cline-any cline-no"> </span>
|
|
671
|
+
<span class="cline-any cline-no"> </span>
|
|
672
|
+
<span class="cline-any cline-neutral"> </span>
|
|
673
|
+
<span class="cline-any cline-no"> </span>
|
|
674
|
+
<span class="cline-any cline-no"> </span>
|
|
675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
677
|
+
<span class="cline-any cline-no"> </span>
|
|
678
|
+
<span class="cline-any cline-no"> </span>
|
|
679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
680
|
+
<span class="cline-any cline-no"> </span>
|
|
681
|
+
<span class="cline-any cline-no"> </span>
|
|
682
|
+
<span class="cline-any cline-neutral"> </span>
|
|
683
|
+
<span class="cline-any cline-no"> </span>
|
|
684
|
+
<span class="cline-any cline-no"> </span>
|
|
685
|
+
<span class="cline-any cline-no"> </span>
|
|
686
|
+
<span class="cline-any cline-no"> </span>
|
|
687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
688
|
+
<span class="cline-any cline-no"> </span>
|
|
689
|
+
<span class="cline-any cline-neutral"> </span>
|
|
690
|
+
<span class="cline-any cline-neutral"> </span>
|
|
691
|
+
<span class="cline-any cline-no"> </span>
|
|
692
|
+
<span class="cline-any cline-no"> </span>
|
|
693
|
+
<span class="cline-any cline-no"> </span>
|
|
694
|
+
<span class="cline-any cline-no"> </span>
|
|
695
|
+
<span class="cline-any cline-no"> </span>
|
|
696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
698
|
+
<span class="cline-any cline-no"> </span>
|
|
699
|
+
<span class="cline-any cline-no"> </span>
|
|
700
|
+
<span class="cline-any cline-no"> </span>
|
|
701
|
+
<span class="cline-any cline-no"> </span>
|
|
702
|
+
<span class="cline-any cline-no"> </span>
|
|
703
|
+
<span class="cline-any cline-no"> </span>
|
|
704
|
+
<span class="cline-any cline-neutral"> </span>
|
|
705
|
+
<span class="cline-any cline-neutral"> </span>
|
|
706
|
+
<span class="cline-any cline-no"> </span>
|
|
707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
709
|
+
<span class="cline-any cline-no"> </span>
|
|
710
|
+
<span class="cline-any cline-no"> </span>
|
|
711
|
+
<span class="cline-any cline-no"> </span>
|
|
712
|
+
<span class="cline-any cline-no"> </span>
|
|
713
|
+
<span class="cline-any cline-no"> </span>
|
|
714
|
+
<span class="cline-any cline-no"> </span>
|
|
715
|
+
<span class="cline-any cline-no"> </span>
|
|
716
|
+
<span class="cline-any cline-no"> </span>
|
|
717
|
+
<span class="cline-any cline-no"> </span>
|
|
718
|
+
<span class="cline-any cline-no"> </span>
|
|
719
|
+
<span class="cline-any cline-neutral"> </span>
|
|
720
|
+
<span class="cline-any cline-no"> </span>
|
|
721
|
+
<span class="cline-any cline-no"> </span>
|
|
722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
723
|
+
<span class="cline-any cline-no"> </span>
|
|
724
|
+
<span class="cline-any cline-neutral"> </span>
|
|
725
|
+
<span class="cline-any cline-no"> </span>
|
|
726
|
+
<span class="cline-any cline-no"> </span>
|
|
727
|
+
<span class="cline-any cline-no"> </span>
|
|
728
|
+
<span class="cline-any cline-no"> </span>
|
|
729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
730
|
+
<span class="cline-any cline-neutral"> </span>
|
|
731
|
+
<span class="cline-any cline-no"> </span>
|
|
732
|
+
<span class="cline-any cline-no"> </span>
|
|
733
|
+
<span class="cline-any cline-no"> </span>
|
|
734
|
+
<span class="cline-any cline-no"> </span>
|
|
735
|
+
<span class="cline-any cline-no"> </span>
|
|
736
|
+
<span class="cline-any cline-no"> </span>
|
|
737
|
+
<span class="cline-any cline-neutral"> </span>
|
|
738
|
+
<span class="cline-any cline-neutral"> </span>
|
|
739
|
+
<span class="cline-any cline-no"> </span>
|
|
740
|
+
<span class="cline-any cline-no"> </span>
|
|
741
|
+
<span class="cline-any cline-neutral"> </span>
|
|
742
|
+
<span class="cline-any cline-neutral"> </span>
|
|
743
|
+
<span class="cline-any cline-no"> </span>
|
|
744
|
+
<span class="cline-any cline-neutral"> </span>
|
|
745
|
+
<span class="cline-any cline-no"> </span>
|
|
746
|
+
<span class="cline-any cline-no"> </span>
|
|
747
|
+
<span class="cline-any cline-neutral"> </span>
|
|
748
|
+
<span class="cline-any cline-neutral"> </span>
|
|
749
|
+
<span class="cline-any cline-no"> </span>
|
|
750
|
+
<span class="cline-any cline-no"> </span>
|
|
751
|
+
<span class="cline-any cline-neutral"> </span>
|
|
752
|
+
<span class="cline-any cline-neutral"> </span>
|
|
753
|
+
<span class="cline-any cline-no"> </span>
|
|
754
|
+
<span class="cline-any cline-no"> </span>
|
|
755
|
+
<span class="cline-any cline-neutral"> </span>
|
|
756
|
+
<span class="cline-any cline-neutral"> </span>
|
|
757
|
+
<span class="cline-any cline-no"> </span>
|
|
758
|
+
<span class="cline-any cline-neutral"> </span>
|
|
759
|
+
<span class="cline-any cline-neutral"> </span>
|
|
760
|
+
<span class="cline-any cline-no"> </span>
|
|
761
|
+
<span class="cline-any cline-no"> </span>
|
|
762
|
+
<span class="cline-any cline-neutral"> </span>
|
|
763
|
+
<span class="cline-any cline-neutral"> </span>
|
|
764
|
+
<span class="cline-any cline-no"> </span>
|
|
765
|
+
<span class="cline-any cline-no"> </span>
|
|
766
|
+
<span class="cline-any cline-neutral"> </span>
|
|
767
|
+
<span class="cline-any cline-no"> </span>
|
|
768
|
+
<span class="cline-any cline-neutral"> </span>
|
|
769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
770
|
+
<span class="cline-any cline-neutral"> </span>
|
|
771
|
+
<span class="cline-any cline-no"> </span>
|
|
772
|
+
<span class="cline-any cline-neutral"> </span>
|
|
773
|
+
<span class="cline-any cline-neutral"> </span>
|
|
774
|
+
<span class="cline-any cline-no"> </span>
|
|
775
|
+
<span class="cline-any cline-no"> </span>
|
|
776
|
+
<span class="cline-any cline-no"> </span>
|
|
777
|
+
<span class="cline-any cline-neutral"> </span>
|
|
778
|
+
<span class="cline-any cline-neutral"> </span>
|
|
779
|
+
<span class="cline-any cline-no"> </span>
|
|
780
|
+
<span class="cline-any cline-no"> </span>
|
|
781
|
+
<span class="cline-any cline-no"> </span>
|
|
782
|
+
<span class="cline-any cline-neutral"> </span>
|
|
783
|
+
<span class="cline-any cline-neutral"> </span>
|
|
784
|
+
<span class="cline-any cline-neutral"> </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
|
+
|
|
786
|
+
<span class="cstat-no" title="statement not covered" >import { asyncInject, Container, inject, Injectable } from '@navios/di'</span>
|
|
787
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
821
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
822
|
+
<span class="cstat-no" title="statement not covered" > if (this.connection && 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
|
+
|
|
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) => setTimeout(resolve, 200))</span>
|
|
838
|
+
|
|
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
|
+
|
|
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) => setTimeout(resolve, 100))</span>
|
|
852
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
853
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
878
|
+
// Start cleanup interval
|
|
879
|
+
<span class="cstat-no" title="statement not covered" > this.cleanupInterval = setInterval(() => {</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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
889
|
+
// Clear the cache
|
|
890
|
+
<span class="cstat-no" title="statement not covered" > this.cache.clear()</span>
|
|
891
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
915
|
+
<span class="cstat-no" title="statement not covered" > if (item.expires && Date.now() > 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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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 && now > 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
|
+
|
|
936
|
+
<span class="cstat-no" title="statement not covered" > if (cleaned > 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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
975
|
+
<span class="cstat-no" title="statement not covered" > if (this.initialized && 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
|
+
|
|
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) => setTimeout(resolve, 150))</span>
|
|
990
|
+
|
|
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
|
+
|
|
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) => setTimeout(resolve, 100))</span>
|
|
1002
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1003
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
1047
|
+
<span class="cstat-no" title="statement not covered" > console.log(`👤 Creating user: ${name}`)</span>
|
|
1048
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
1079
|
+
<span class="cstat-no" title="statement not covered" > return user</span>
|
|
1080
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1081
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
1115
|
+
// Simulate some work
|
|
1116
|
+
<span class="cstat-no" title="statement not covered" > await new Promise((resolve) => setTimeout(resolve, 1000))</span>
|
|
1117
|
+
|
|
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
|
+
|
|
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
|
+
|
|
1126
|
+
<span class="cstat-no" title="statement not covered" > console.log('\n=== Service Cleanup ===')</span>
|
|
1127
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
1142
|
+
export { DatabaseService, CacheService, EmailService, UserService }
|
|
1143
|
+
</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
|
+
|