@contractkit/openapi-to-ck 0.9.0 → 0.9.2

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.
@@ -1,1378 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/schema-to-ast.ts</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">src</a> schema-to-ast.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">84.69% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>155/183</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">75% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>123/164</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">95.65% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>22/23</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">87.65% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>142/162</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 high'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
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>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a>
435
- <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a>
437
- <a name='L372'></a><a href='#L372'>372</a>
438
- <a name='L373'></a><a href='#L373'>373</a>
439
- <a name='L374'></a><a href='#L374'>374</a>
440
- <a name='L375'></a><a href='#L375'>375</a>
441
- <a name='L376'></a><a href='#L376'>376</a>
442
- <a name='L377'></a><a href='#L377'>377</a>
443
- <a name='L378'></a><a href='#L378'>378</a>
444
- <a name='L379'></a><a href='#L379'>379</a>
445
- <a name='L380'></a><a href='#L380'>380</a>
446
- <a name='L381'></a><a href='#L381'>381</a>
447
- <a name='L382'></a><a href='#L382'>382</a>
448
- <a name='L383'></a><a href='#L383'>383</a>
449
- <a name='L384'></a><a href='#L384'>384</a>
450
- <a name='L385'></a><a href='#L385'>385</a>
451
- <a name='L386'></a><a href='#L386'>386</a>
452
- <a name='L387'></a><a href='#L387'>387</a>
453
- <a name='L388'></a><a href='#L388'>388</a>
454
- <a name='L389'></a><a href='#L389'>389</a>
455
- <a name='L390'></a><a href='#L390'>390</a>
456
- <a name='L391'></a><a href='#L391'>391</a>
457
- <a name='L392'></a><a href='#L392'>392</a>
458
- <a name='L393'></a><a href='#L393'>393</a>
459
- <a name='L394'></a><a href='#L394'>394</a>
460
- <a name='L395'></a><a href='#L395'>395</a>
461
- <a name='L396'></a><a href='#L396'>396</a>
462
- <a name='L397'></a><a href='#L397'>397</a>
463
- <a name='L398'></a><a href='#L398'>398</a>
464
- <a name='L399'></a><a href='#L399'>399</a>
465
- <a name='L400'></a><a href='#L400'>400</a>
466
- <a name='L401'></a><a href='#L401'>401</a>
467
- <a name='L402'></a><a href='#L402'>402</a>
468
- <a name='L403'></a><a href='#L403'>403</a>
469
- <a name='L404'></a><a href='#L404'>404</a>
470
- <a name='L405'></a><a href='#L405'>405</a>
471
- <a name='L406'></a><a href='#L406'>406</a>
472
- <a name='L407'></a><a href='#L407'>407</a>
473
- <a name='L408'></a><a href='#L408'>408</a>
474
- <a name='L409'></a><a href='#L409'>409</a>
475
- <a name='L410'></a><a href='#L410'>410</a>
476
- <a name='L411'></a><a href='#L411'>411</a>
477
- <a name='L412'></a><a href='#L412'>412</a>
478
- <a name='L413'></a><a href='#L413'>413</a>
479
- <a name='L414'></a><a href='#L414'>414</a>
480
- <a name='L415'></a><a href='#L415'>415</a>
481
- <a name='L416'></a><a href='#L416'>416</a>
482
- <a name='L417'></a><a href='#L417'>417</a>
483
- <a name='L418'></a><a href='#L418'>418</a>
484
- <a name='L419'></a><a href='#L419'>419</a>
485
- <a name='L420'></a><a href='#L420'>420</a>
486
- <a name='L421'></a><a href='#L421'>421</a>
487
- <a name='L422'></a><a href='#L422'>422</a>
488
- <a name='L423'></a><a href='#L423'>423</a>
489
- <a name='L424'></a><a href='#L424'>424</a>
490
- <a name='L425'></a><a href='#L425'>425</a>
491
- <a name='L426'></a><a href='#L426'>426</a>
492
- <a name='L427'></a><a href='#L427'>427</a>
493
- <a name='L428'></a><a href='#L428'>428</a>
494
- <a name='L429'></a><a href='#L429'>429</a>
495
- <a name='L430'></a><a href='#L430'>430</a>
496
- <a name='L431'></a><a href='#L431'>431</a>
497
- <a name='L432'></a><a href='#L432'>432</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
498
- <span class="cline-any cline-neutral">&nbsp;</span>
499
- <span class="cline-any cline-neutral">&nbsp;</span>
500
- <span class="cline-any cline-neutral">&nbsp;</span>
501
- <span class="cline-any cline-neutral">&nbsp;</span>
502
- <span class="cline-any cline-neutral">&nbsp;</span>
503
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
507
- <span class="cline-any cline-neutral">&nbsp;</span>
508
- <span class="cline-any cline-neutral">&nbsp;</span>
509
- <span class="cline-any cline-neutral">&nbsp;</span>
510
- <span class="cline-any cline-neutral">&nbsp;</span>
511
- <span class="cline-any cline-neutral">&nbsp;</span>
512
- <span class="cline-any cline-neutral">&nbsp;</span>
513
- <span class="cline-any cline-neutral">&nbsp;</span>
514
- <span class="cline-any cline-neutral">&nbsp;</span>
515
- <span class="cline-any cline-neutral">&nbsp;</span>
516
- <span class="cline-any cline-neutral">&nbsp;</span>
517
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
521
- <span class="cline-any cline-yes">2x</span>
522
- <span class="cline-any cline-neutral">&nbsp;</span>
523
- <span class="cline-any cline-neutral">&nbsp;</span>
524
- <span class="cline-any cline-neutral">&nbsp;</span>
525
- <span class="cline-any cline-yes">2x</span>
526
- <span class="cline-any cline-neutral">&nbsp;</span>
527
- <span class="cline-any cline-neutral">&nbsp;</span>
528
- <span class="cline-any cline-neutral">&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-neutral">&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-neutral">&nbsp;</span>
535
- <span class="cline-any cline-neutral">&nbsp;</span>
536
- <span class="cline-any cline-neutral">&nbsp;</span>
537
- <span class="cline-any cline-neutral">&nbsp;</span>
538
- <span class="cline-any cline-neutral">&nbsp;</span>
539
- <span class="cline-any cline-neutral">&nbsp;</span>
540
- <span class="cline-any cline-neutral">&nbsp;</span>
541
- <span class="cline-any cline-neutral">&nbsp;</span>
542
- <span class="cline-any cline-neutral">&nbsp;</span>
543
- <span class="cline-any cline-yes">19x</span>
544
- <span class="cline-any cline-neutral">&nbsp;</span>
545
- <span class="cline-any cline-yes">19x</span>
546
- <span class="cline-any cline-yes">40x</span>
547
- <span class="cline-any cline-yes">40x</span>
548
- <span class="cline-any cline-yes">40x</span>
549
- <span class="cline-any cline-neutral">&nbsp;</span>
550
- <span class="cline-any cline-neutral">&nbsp;</span>
551
- <span class="cline-any cline-neutral">&nbsp;</span>
552
- <span class="cline-any cline-yes">19x</span>
553
- <span class="cline-any cline-neutral">&nbsp;</span>
554
- <span class="cline-any cline-yes">19x</span>
555
- <span class="cline-any cline-neutral">&nbsp;</span>
556
- <span class="cline-any cline-neutral">&nbsp;</span>
557
- <span class="cline-any cline-neutral">&nbsp;</span>
558
- <span class="cline-any cline-neutral">&nbsp;</span>
559
- <span class="cline-any cline-neutral">&nbsp;</span>
560
- <span class="cline-any cline-neutral">&nbsp;</span>
561
- <span class="cline-any cline-yes">40x</span>
562
- <span class="cline-any cline-neutral">&nbsp;</span>
563
- <span class="cline-any cline-yes">40x</span>
564
- <span class="cline-any cline-neutral">&nbsp;</span>
565
- <span class="cline-any cline-neutral">&nbsp;</span>
566
- <span class="cline-any cline-yes">40x</span>
567
- <span class="cline-any cline-yes">1x</span>
568
- <span class="cline-any cline-yes">1x</span>
569
- <span class="cline-any cline-yes">1x</span>
570
- <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-yes">1x</span>
572
- <span class="cline-any cline-yes">1x</span>
573
- <span class="cline-any cline-yes">1x</span>
574
- <span class="cline-any cline-yes">1x</span>
575
- <span class="cline-any cline-yes">1x</span>
576
- <span class="cline-any cline-neutral">&nbsp;</span>
577
- <span class="cline-any cline-neutral">&nbsp;</span>
578
- <span class="cline-any cline-neutral">&nbsp;</span>
579
- <span class="cline-any cline-neutral">&nbsp;</span>
580
- <span class="cline-any cline-neutral">&nbsp;</span>
581
- <span class="cline-any cline-neutral">&nbsp;</span>
582
- <span class="cline-any cline-neutral">&nbsp;</span>
583
- <span class="cline-any cline-neutral">&nbsp;</span>
584
- <span class="cline-any cline-neutral">&nbsp;</span>
585
- <span class="cline-any cline-neutral">&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-yes">39x</span>
589
- <span class="cline-any cline-yes">37x</span>
590
- <span class="cline-any cline-yes">37x</span>
591
- <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-neutral">&nbsp;</span>
593
- <span class="cline-any cline-neutral">&nbsp;</span>
594
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
598
- <span class="cline-any cline-neutral">&nbsp;</span>
599
- <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-yes">2x</span>
601
- <span class="cline-any cline-yes">2x</span>
602
- <span class="cline-any cline-neutral">&nbsp;</span>
603
- <span class="cline-any cline-neutral">&nbsp;</span>
604
- <span class="cline-any cline-neutral">&nbsp;</span>
605
- <span class="cline-any cline-neutral">&nbsp;</span>
606
- <span class="cline-any cline-neutral">&nbsp;</span>
607
- <span class="cline-any cline-neutral">&nbsp;</span>
608
- <span class="cline-any cline-neutral">&nbsp;</span>
609
- <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-neutral">&nbsp;</span>
611
- <span class="cline-any cline-neutral">&nbsp;</span>
612
- <span class="cline-any cline-neutral">&nbsp;</span>
613
- <span class="cline-any cline-neutral">&nbsp;</span>
614
- <span class="cline-any cline-neutral">&nbsp;</span>
615
- <span class="cline-any cline-neutral">&nbsp;</span>
616
- <span class="cline-any cline-yes">259x</span>
617
- <span class="cline-any cline-yes">46x</span>
618
- <span class="cline-any cline-yes">46x</span>
619
- <span class="cline-any cline-yes">46x</span>
620
- <span class="cline-any cline-yes">1x</span>
621
- <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-yes">45x</span>
623
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
627
- <span class="cline-any cline-neutral">&nbsp;</span>
628
- <span class="cline-any cline-neutral">&nbsp;</span>
629
- <span class="cline-any cline-yes">213x</span>
630
- <span class="cline-any cline-yes">1x</span>
631
- <span class="cline-any cline-neutral">&nbsp;</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-neutral">&nbsp;</span>
634
- <span class="cline-any cline-yes">212x</span>
635
- <span class="cline-any cline-yes">23x</span>
636
- <span class="cline-any cline-neutral">&nbsp;</span>
637
- <span class="cline-any cline-neutral">&nbsp;</span>
638
- <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-yes">189x</span>
640
- <span class="cline-any cline-yes">2x</span>
641
- <span class="cline-any cline-yes">1x</span>
642
- <span class="cline-any cline-neutral">&nbsp;</span>
643
- <span class="cline-any cline-yes">1x</span>
644
- <span class="cline-any cline-neutral">&nbsp;</span>
645
- <span class="cline-any cline-yes">187x</span>
646
- <span class="cline-any cline-yes">1x</span>
647
- <span class="cline-any cline-no">&nbsp;</span>
648
- <span class="cline-any cline-neutral">&nbsp;</span>
649
- <span class="cline-any cline-yes">1x</span>
650
- <span class="cline-any cline-neutral">&nbsp;</span>
651
- <span class="cline-any cline-neutral">&nbsp;</span>
652
- <span class="cline-any cline-neutral">&nbsp;</span>
653
- <span class="cline-any cline-yes">186x</span>
654
- <span class="cline-any cline-yes">1x</span>
655
- <span class="cline-any cline-no">&nbsp;</span>
656
- <span class="cline-any cline-neutral">&nbsp;</span>
657
- <span class="cline-any cline-yes">1x</span>
658
- <span class="cline-any cline-neutral">&nbsp;</span>
659
- <span class="cline-any cline-yes">2x</span>
660
- <span class="cline-any cline-neutral">&nbsp;</span>
661
- <span class="cline-any cline-neutral">&nbsp;</span>
662
- <span class="cline-any cline-neutral">&nbsp;</span>
663
- <span class="cline-any cline-neutral">&nbsp;</span>
664
- <span class="cline-any cline-yes">185x</span>
665
- <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-yes">185x</span>
667
- <span class="cline-any cline-neutral">&nbsp;</span>
668
- <span class="cline-any cline-yes">1x</span>
669
- <span class="cline-any cline-no">&nbsp;</span>
670
- <span class="cline-any cline-neutral">&nbsp;</span>
671
- <span class="cline-any cline-yes">1x</span>
672
- <span class="cline-any cline-neutral">&nbsp;</span>
673
- <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-yes">184x</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-neutral">&nbsp;</span>
678
- <span class="cline-any cline-yes">184x</span>
679
- <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-yes">114x</span>
681
- <span class="cline-any cline-yes">114x</span>
682
- <span class="cline-any cline-neutral">&nbsp;</span>
683
- <span class="cline-any cline-yes">38x</span>
684
- <span class="cline-any cline-yes">38x</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-yes">2x</span>
687
- <span class="cline-any cline-yes">2x</span>
688
- <span class="cline-any cline-neutral">&nbsp;</span>
689
- <span class="cline-any cline-yes">2x</span>
690
- <span class="cline-any cline-yes">2x</span>
691
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
695
- <span class="cline-any cline-yes">14x</span>
696
- <span class="cline-any cline-yes">14x</span>
697
- <span class="cline-any cline-neutral">&nbsp;</span>
698
- <span class="cline-any cline-yes">14x</span>
699
- <span class="cline-any cline-yes">14x</span>
700
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
704
- <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-yes">184x</span>
706
- <span class="cline-any cline-yes">1x</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-yes">183x</span>
710
- <span class="cline-any cline-neutral">&nbsp;</span>
711
- <span class="cline-any cline-neutral">&nbsp;</span>
712
- <span class="cline-any cline-neutral">&nbsp;</span>
713
- <span class="cline-any cline-neutral">&nbsp;</span>
714
- <span class="cline-any cline-neutral">&nbsp;</span>
715
- <span class="cline-any cline-neutral">&nbsp;</span>
716
- <span class="cline-any cline-yes">114x</span>
717
- <span class="cline-any cline-yes">41x</span>
718
- <span class="cline-any cline-yes">41x</span>
719
- <span class="cline-any cline-yes">41x</span>
720
- <span class="cline-any cline-neutral">&nbsp;</span>
721
- <span class="cline-any cline-neutral">&nbsp;</span>
722
- <span class="cline-any cline-neutral">&nbsp;</span>
723
- <span class="cline-any cline-yes">73x</span>
724
- <span class="cline-any cline-yes">73x</span>
725
- <span class="cline-any cline-yes">1x</span>
726
- <span class="cline-any cline-neutral">&nbsp;</span>
727
- <span class="cline-any cline-yes">72x</span>
728
- <span class="cline-any cline-yes">72x</span>
729
- <span class="cline-any cline-neutral">&nbsp;</span>
730
- <span class="cline-any cline-yes">73x</span>
731
- <span class="cline-any cline-yes">73x</span>
732
- <span class="cline-any cline-neutral">&nbsp;</span>
733
- <span class="cline-any cline-yes">73x</span>
734
- <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-neutral">&nbsp;</span>
736
- <span class="cline-any cline-neutral">&nbsp;</span>
737
- <span class="cline-any cline-yes">38x</span>
738
- <span class="cline-any cline-yes">38x</span>
739
- <span class="cline-any cline-yes">38x</span>
740
- <span class="cline-any cline-yes">38x</span>
741
- <span class="cline-any cline-yes">38x</span>
742
- <span class="cline-any cline-neutral">&nbsp;</span>
743
- <span class="cline-any cline-neutral">&nbsp;</span>
744
- <span class="cline-any cline-neutral">&nbsp;</span>
745
- <span class="cline-any cline-yes">2x</span>
746
- <span class="cline-any cline-yes">2x</span>
747
- <span class="cline-any cline-yes">2x</span>
748
- <span class="cline-any cline-yes">2x</span>
749
- <span class="cline-any cline-neutral">&nbsp;</span>
750
- <span class="cline-any cline-neutral">&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-yes">14x</span>
754
- <span class="cline-any cline-yes">1x</span>
755
- <span class="cline-any cline-neutral">&nbsp;</span>
756
- <span class="cline-any cline-yes">2x</span>
757
- <span class="cline-any cline-neutral">&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-yes">13x</span>
761
- <span class="cline-any cline-yes">14x</span>
762
- <span class="cline-any cline-yes">14x</span>
763
- <span class="cline-any cline-yes">13x</span>
764
- <span class="cline-any cline-neutral">&nbsp;</span>
765
- <span class="cline-any cline-yes">13x</span>
766
- <span class="cline-any cline-neutral">&nbsp;</span>
767
- <span class="cline-any cline-neutral">&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-yes">14x</span>
771
- <span class="cline-any cline-yes">11x</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-neutral">&nbsp;</span>
775
- <span class="cline-any cline-neutral">&nbsp;</span>
776
- <span class="cline-any cline-neutral">&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-yes">3x</span>
780
- <span class="cline-any cline-yes">2x</span>
781
- <span class="cline-any cline-neutral">&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-yes">1x</span>
785
- <span class="cline-any cline-neutral">&nbsp;</span>
786
- <span class="cline-any cline-neutral">&nbsp;</span>
787
- <span class="cline-any cline-neutral">&nbsp;</span>
788
- <span class="cline-any cline-yes">2x</span>
789
- <span class="cline-any cline-yes">2x</span>
790
- <span class="cline-any cline-neutral">&nbsp;</span>
791
- <span class="cline-any cline-neutral">&nbsp;</span>
792
- <span class="cline-any cline-neutral">&nbsp;</span>
793
- <span class="cline-any cline-neutral">&nbsp;</span>
794
- <span class="cline-any cline-neutral">&nbsp;</span>
795
- <span class="cline-any cline-yes">40x</span>
796
- <span class="cline-any cline-yes">40x</span>
797
- <span class="cline-any cline-yes">40x</span>
798
- <span class="cline-any cline-neutral">&nbsp;</span>
799
- <span class="cline-any cline-yes">40x</span>
800
- <span class="cline-any cline-yes">115x</span>
801
- <span class="cline-any cline-yes">115x</span>
802
- <span class="cline-any cline-neutral">&nbsp;</span>
803
- <span class="cline-any cline-neutral">&nbsp;</span>
804
- <span class="cline-any cline-yes">115x</span>
805
- <span class="cline-any cline-yes">115x</span>
806
- <span class="cline-any cline-yes">115x</span>
807
- <span class="cline-any cline-no">&nbsp;</span>
808
- <span class="cline-any cline-no">&nbsp;</span>
809
- <span class="cline-any cline-no">&nbsp;</span>
810
- <span class="cline-any cline-no">&nbsp;</span>
811
- <span class="cline-any cline-neutral">&nbsp;</span>
812
- <span class="cline-any cline-neutral">&nbsp;</span>
813
- <span class="cline-any cline-neutral">&nbsp;</span>
814
- <span class="cline-any cline-yes">115x</span>
815
- <span class="cline-any cline-neutral">&nbsp;</span>
816
- <span class="cline-any cline-yes">115x</span>
817
- <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-neutral">&nbsp;</span>
819
- <span class="cline-any cline-neutral">&nbsp;</span>
820
- <span class="cline-any cline-neutral">&nbsp;</span>
821
- <span class="cline-any cline-neutral">&nbsp;</span>
822
- <span class="cline-any cline-neutral">&nbsp;</span>
823
- <span class="cline-any cline-neutral">&nbsp;</span>
824
- <span class="cline-any cline-neutral">&nbsp;</span>
825
- <span class="cline-any cline-neutral">&nbsp;</span>
826
- <span class="cline-any cline-neutral">&nbsp;</span>
827
- <span class="cline-any cline-neutral">&nbsp;</span>
828
- <span class="cline-any cline-neutral">&nbsp;</span>
829
- <span class="cline-any cline-yes">40x</span>
830
- <span class="cline-any cline-neutral">&nbsp;</span>
831
- <span class="cline-any cline-neutral">&nbsp;</span>
832
- <span class="cline-any cline-neutral">&nbsp;</span>
833
- <span class="cline-any cline-neutral">&nbsp;</span>
834
- <span class="cline-any cline-neutral">&nbsp;</span>
835
- <span class="cline-any cline-yes">185x</span>
836
- <span class="cline-any cline-neutral">&nbsp;</span>
837
- <span class="cline-any cline-yes">184x</span>
838
- <span class="cline-any cline-yes">183x</span>
839
- <span class="cline-any cline-neutral">&nbsp;</span>
840
- <span class="cline-any cline-neutral">&nbsp;</span>
841
- <span class="cline-any cline-yes">1x</span>
842
- <span class="cline-any cline-yes">1x</span>
843
- <span class="cline-any cline-yes">2x</span>
844
- <span class="cline-any cline-yes">1x</span>
845
- <span class="cline-any cline-yes">1x</span>
846
- <span class="cline-any cline-yes">1x</span>
847
- <span class="cline-any cline-neutral">&nbsp;</span>
848
- <span class="cline-any cline-neutral">&nbsp;</span>
849
- <span class="cline-any cline-no">&nbsp;</span>
850
- <span class="cline-any cline-no">&nbsp;</span>
851
- <span class="cline-any cline-neutral">&nbsp;</span>
852
- <span class="cline-any cline-neutral">&nbsp;</span>
853
- <span class="cline-any cline-no">&nbsp;</span>
854
- <span class="cline-any cline-neutral">&nbsp;</span>
855
- <span class="cline-any cline-neutral">&nbsp;</span>
856
- <span class="cline-any cline-no">&nbsp;</span>
857
- <span class="cline-any cline-neutral">&nbsp;</span>
858
- <span class="cline-any cline-neutral">&nbsp;</span>
859
- <span class="cline-any cline-neutral">&nbsp;</span>
860
- <span class="cline-any cline-yes">4x</span>
861
- <span class="cline-any cline-yes">2x</span>
862
- <span class="cline-any cline-yes">2x</span>
863
- <span class="cline-any cline-neutral">&nbsp;</span>
864
- <span class="cline-any cline-neutral">&nbsp;</span>
865
- <span class="cline-any cline-neutral">&nbsp;</span>
866
- <span class="cline-any cline-yes">2x</span>
867
- <span class="cline-any cline-yes">1x</span>
868
- <span class="cline-any cline-yes">1x</span>
869
- <span class="cline-any cline-neutral">&nbsp;</span>
870
- <span class="cline-any cline-neutral">&nbsp;</span>
871
- <span class="cline-any cline-neutral">&nbsp;</span>
872
- <span class="cline-any cline-yes">40x</span>
873
- <span class="cline-any cline-yes">40x</span>
874
- <span class="cline-any cline-yes">40x</span>
875
- <span class="cline-any cline-neutral">&nbsp;</span>
876
- <span class="cline-any cline-neutral">&nbsp;</span>
877
- <span class="cline-any cline-neutral">&nbsp;</span>
878
- <span class="cline-any cline-neutral">&nbsp;</span>
879
- <span class="cline-any cline-neutral">&nbsp;</span>
880
- <span class="cline-any cline-neutral">&nbsp;</span>
881
- <span class="cline-any cline-neutral">&nbsp;</span>
882
- <span class="cline-any cline-neutral">&nbsp;</span>
883
- <span class="cline-any cline-neutral">&nbsp;</span>
884
- <span class="cline-any cline-neutral">&nbsp;</span>
885
- <span class="cline-any cline-neutral">&nbsp;</span>
886
- <span class="cline-any cline-yes">53x</span>
887
- <span class="cline-any cline-yes">32x</span>
888
- <span class="cline-any cline-neutral">&nbsp;</span>
889
- <span class="cline-any cline-neutral">&nbsp;</span>
890
- <span class="cline-any cline-neutral">&nbsp;</span>
891
- <span class="cline-any cline-yes">21x</span>
892
- <span class="cline-any cline-no">&nbsp;</span>
893
- <span class="cline-any cline-no">&nbsp;</span>
894
- <span class="cline-any cline-neutral">&nbsp;</span>
895
- <span class="cline-any cline-neutral">&nbsp;</span>
896
- <span class="cline-any cline-neutral">&nbsp;</span>
897
- <span class="cline-any cline-neutral">&nbsp;</span>
898
- <span class="cline-any cline-neutral">&nbsp;</span>
899
- <span class="cline-any cline-neutral">&nbsp;</span>
900
- <span class="cline-any cline-no">&nbsp;</span>
901
- <span class="cline-any cline-neutral">&nbsp;</span>
902
- <span class="cline-any cline-neutral">&nbsp;</span>
903
- <span class="cline-any cline-neutral">&nbsp;</span>
904
- <span class="cline-any cline-neutral">&nbsp;</span>
905
- <span class="cline-any cline-neutral">&nbsp;</span>
906
- <span class="cline-any cline-neutral">&nbsp;</span>
907
- <span class="cline-any cline-yes">21x</span>
908
- <span class="cline-any cline-neutral">&nbsp;</span>
909
- <span class="cline-any cline-neutral">&nbsp;</span>
910
- <span class="cline-any cline-neutral">&nbsp;</span>
911
- <span class="cline-any cline-neutral">&nbsp;</span>
912
- <span class="cline-any cline-neutral">&nbsp;</span>
913
- <span class="cline-any cline-neutral">&nbsp;</span>
914
- <span class="cline-any cline-neutral">&nbsp;</span>
915
- <span class="cline-any cline-yes">40x</span>
916
- <span class="cline-any cline-neutral">&nbsp;</span>
917
- <span class="cline-any cline-neutral">&nbsp;</span>
918
- <span class="cline-any cline-neutral">&nbsp;</span>
919
- <span class="cline-any cline-yes">43x</span>
920
- <span class="cline-any cline-neutral">&nbsp;</span>
921
- <span class="cline-any cline-neutral">&nbsp;</span>
922
- <span class="cline-any cline-yes">40x</span>
923
- <span class="cline-any cline-yes">3x</span>
924
- <span class="cline-any cline-neutral">&nbsp;</span>
925
- <span class="cline-any cline-neutral">&nbsp;</span>
926
- <span class="cline-any cline-yes">40x</span>
927
- <span class="cline-any cline-neutral">&nbsp;</span>
928
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { ContractTypeNode, ScalarTypeNode, ModelNode, FieldNode, SourceLocation } from '@contractkit/core';
929
- import type { NormalizedSchema } from './types.js';
930
- import { extractRefName } from './circular-refs.js';
931
- import type { WarningCollector } from './warnings.js';
932
- &nbsp;
933
- // ─── Conversion Context ───────────────────────────────────────────────────
934
- &nbsp;
935
- export interface SchemaContext {
936
- /** Schema names involved in circular references — use lazy() for these. */
937
- circularRefs: Set&lt;string&gt;;
938
- /** Warning collector for unsupported features. */
939
- warnings: WarningCollector;
940
- /** Current JSON pointer path (for warnings). */
941
- path: string;
942
- /** Whether to include descriptions. */
943
- includeComments: boolean;
944
- /** All named schemas (for inline extraction). */
945
- namedSchemas: Record&lt;string, NormalizedSchema&gt;;
946
- /** Extracted inline models (accumulated during conversion). */
947
- extractedModels: ModelNode[];
948
- /** Counter for generating unique names for inline models. */
949
- inlineCounter: number;
950
- }
951
- &nbsp;
952
- const LOC: SourceLocation = { file: '', line: 0 };
953
- &nbsp;
954
- // ─── Format → Scalar Name Mapping ────────────────────────────────────────
955
- &nbsp;
956
- const FORMAT_TO_SCALAR: Record&lt;string, ScalarTypeNode['name']&gt; = {
957
- email: 'email',
958
- uri: 'url',
959
- url: 'url',
960
- uuid: 'uuid',
961
- date: 'date',
962
- 'date-time': 'datetime',
963
- time: 'time',
964
- binary: 'binary',
965
- int64: 'bigint',
966
- };
967
- &nbsp;
968
- // ─── Public API ───────────────────────────────────────────────────────────
969
- &nbsp;
970
- /**
971
- * Convert all named schemas in components/schemas to ModelNodes.
972
- */
973
- export function schemasToModels(schemas: Record&lt;string, NormalizedSchema&gt;, ctx: SchemaContext): ModelNode[] {
974
- const models: ModelNode[] = [];
975
- &nbsp;
976
- for (const [name, schema] of Object.entries(schemas)) {
977
- const modelCtx = { ...ctx, path: `#/components/schemas/${name}` };
978
- const model = schemaToModel(name, schema, modelCtx);
979
- <span class="missing-if-branch" title="else path not taken" >E</span>if (model) models.push(model);
980
- }
981
- &nbsp;
982
- // Append any inline models extracted during conversion
983
- models.push(...ctx.extractedModels);
984
- &nbsp;
985
- return models;
986
- }
987
- &nbsp;
988
- /**
989
- * Convert a named schema to a ModelNode.
990
- */
991
- function schemaToModel(name: string, schema: NormalizedSchema, ctx: SchemaContext): ModelNode | null {
992
- warnUnsupported(schema, ctx);
993
- &nbsp;
994
- const description = ctx.includeComments ? schema.description : undefined;
995
- &nbsp;
996
- // allOf with exactly 2 members, one being a $ref → inheritance
997
- if (schema.allOf &amp;&amp; schema.allOf.length === 2) {
998
- const [first, second] = schema.allOf;
999
- const refMember = first?.$ref ? first : <span class="branch-1 cbranch-no" title="branch not covered" >second?.$ref ? second : null;</span>
1000
- const objectMember = first?.$ref ? second : <span class="branch-1 cbranch-no" title="branch not covered" >first;</span>
1001
- &nbsp;
1002
- <span class="missing-if-branch" title="else path not taken" >E</span>if (refMember?.$ref &amp;&amp; objectMember?.properties) {
1003
- const baseName = extractRefName(refMember.$ref);
1004
- <span class="missing-if-branch" title="else path not taken" >E</span>if (baseName) {
1005
- const fields = schemaPropertiesToFields(objectMember, ctx);
1006
- return {
1007
- kind: 'model',
1008
- name,
1009
- bases: [baseName],
1010
- fields,
1011
- description,
1012
- loc: LOC,
1013
- };
1014
- }
1015
- }
1016
- }
1017
- &nbsp;
1018
- // Object with properties → struct
1019
- if (schema.properties || (schema.type === 'object' &amp;&amp; <span class="branch-2 cbranch-no" title="branch not covered" >!schema.additionalProperties)) {</span>
1020
- const fields = schemaPropertiesToFields(schema, ctx);
1021
- return {
1022
- kind: 'model',
1023
- name,
1024
- fields,
1025
- description,
1026
- loc: LOC,
1027
- };
1028
- }
1029
- &nbsp;
1030
- // Otherwise → type alias
1031
- const typeNode = schemaToTypeNode(schema, ctx);
1032
- return {
1033
- kind: 'model',
1034
- name,
1035
- fields: [],
1036
- type: typeNode,
1037
- description,
1038
- loc: LOC,
1039
- };
1040
- }
1041
- &nbsp;
1042
- /**
1043
- * Convert an OpenAPI schema to a ContractTypeNode.
1044
- */
1045
- export function schemaToTypeNode(schema: NormalizedSchema, ctx: SchemaContext): ContractTypeNode {
1046
- // $ref
1047
- if (schema.$ref) {
1048
- const refName = extractRefName(schema.$ref);
1049
- <span class="missing-if-branch" title="else path not taken" >E</span>if (refName) {
1050
- if (ctx.circularRefs.has(refName)) {
1051
- return { kind: 'lazy', inner: { kind: 'ref', name: refName } };
1052
- }
1053
- return { kind: 'ref', name: refName };
1054
- }
1055
- <span class="cstat-no" title="statement not covered" > ctx.warnings.warn(ctx.path, `Unresolvable $ref: ${schema.$ref}`);</span>
1056
- <span class="cstat-no" title="statement not covered" > return { kind: 'scalar', name: 'unknown' };</span>
1057
- }
1058
- &nbsp;
1059
- // const
1060
- if (schema.const !== undefined) {
1061
- return { kind: 'literal', value: schema.const as string | number | boolean };
1062
- }
1063
- &nbsp;
1064
- // enum
1065
- if (schema.enum) {
1066
- return { kind: 'enum', values: schema.enum.map(String) };
1067
- }
1068
- &nbsp;
1069
- // oneOf / anyOf → union (or discriminatedUnion when discriminator.propertyName is set)
1070
- if (schema.oneOf &amp;&amp; schema.oneOf.length &gt; 0) {
1071
- if (schema.discriminator?.propertyName) {
1072
- return toDiscriminatedUnion(schema.oneOf, schema.discriminator.propertyName, ctx);
1073
- }
1074
- return toUnion(schema.oneOf, ctx);
1075
- }
1076
- if (schema.anyOf &amp;&amp; schema.anyOf.length &gt; 0) {
1077
- <span class="missing-if-branch" title="if path not taken" >I</span>if (schema.discriminator?.propertyName) {
1078
- <span class="cstat-no" title="statement not covered" > return toDiscriminatedUnion(schema.anyOf, schema.discriminator.propertyName, ctx);</span>
1079
- }
1080
- return toUnion(schema.anyOf, ctx);
1081
- }
1082
- &nbsp;
1083
- // allOf → intersection
1084
- if (schema.allOf &amp;&amp; schema.allOf.length &gt; 0) {
1085
- <span class="missing-if-branch" title="if path not taken" >I</span>if (schema.allOf.length === 1) {
1086
- <span class="cstat-no" title="statement not covered" > return schemaToTypeNode(schema.allOf[0]!, ctx);</span>
1087
- }
1088
- return {
1089
- kind: 'intersection',
1090
- members: schema.allOf.map(s =&gt; schemaToTypeNode(s, ctx)),
1091
- };
1092
- }
1093
- &nbsp;
1094
- // Handle nullable type arrays: [string, null] → nullable
1095
- const types = normalizeTypeField(schema);
1096
- &nbsp;
1097
- if (types === null) {
1098
- // No type information at all
1099
- <span class="missing-if-branch" title="if path not taken" >I</span>if (schema.properties) {
1100
- <span class="cstat-no" title="statement not covered" > return schemaToInlineObject(schema, ctx);</span>
1101
- }
1102
- return { kind: 'scalar', name: 'unknown' };
1103
- }
1104
- &nbsp;
1105
- const { baseType, nullable } = types;
1106
- &nbsp;
1107
- let typeNode: ContractTypeNode;
1108
- &nbsp;
1109
- switch (baseType) {
1110
- case 'string':
1111
- typeNode = stringSchemaToType(schema);
1112
- break;
1113
- case 'integer':
1114
- typeNode = integerSchemaToType(schema);
1115
- break;
1116
- case 'number':
1117
- typeNode = numberSchemaToType(schema);
1118
- break;
1119
- case 'boolean':
1120
- typeNode = { kind: 'scalar', name: 'boolean' };
1121
- break;
1122
- <span class="branch-4 cbranch-no" title="branch not covered" > case 'null':</span>
1123
- <span class="cstat-no" title="statement not covered" > typeNode = { kind: 'scalar', name: 'null' };</span>
1124
- <span class="cstat-no" title="statement not covered" > break;</span>
1125
- case 'array':
1126
- typeNode = arraySchemaToType(schema, ctx);
1127
- break;
1128
- case 'object':
1129
- typeNode = objectSchemaToType(schema, ctx);
1130
- break;
1131
- <span class="branch-7 cbranch-no" title="branch not covered" > default:</span>
1132
- <span class="cstat-no" title="statement not covered" > ctx.warnings.warn(ctx.path, `Unknown type: ${baseType}`);</span>
1133
- <span class="cstat-no" title="statement not covered" > typeNode = { kind: 'scalar', name: 'unknown' };</span>
1134
- }
1135
- &nbsp;
1136
- if (nullable) {
1137
- return { kind: 'union', members: [typeNode, { kind: 'scalar', name: 'null' }] };
1138
- }
1139
- &nbsp;
1140
- return typeNode;
1141
- }
1142
- &nbsp;
1143
- // ─── Type-Specific Converters ─────────────────────────────────────────────
1144
- &nbsp;
1145
- function stringSchemaToType(schema: NormalizedSchema): ContractTypeNode {
1146
- // Check format first
1147
- if (schema.format) {
1148
- const scalarName = FORMAT_TO_SCALAR[schema.format];
1149
- <span class="missing-if-branch" title="else path not taken" >E</span>if (scalarName) {
1150
- return { kind: 'scalar', name: scalarName };
1151
- }
1152
- }
1153
- &nbsp;
1154
- const mods: Partial&lt;ScalarTypeNode&gt; = {};
1155
- if (schema.minLength !== undefined &amp;&amp; schema.maxLength !== undefined &amp;&amp; schema.minLength === schema.maxLength) {
1156
- mods.len = schema.minLength;
1157
- } else {
1158
- if (schema.minLength !== undefined) mods.min = schema.minLength;
1159
- if (schema.maxLength !== undefined) mods.max = schema.maxLength;
1160
- }
1161
- if (schema.pattern) mods.regex = `/${schema.pattern}/`;
1162
- <span class="missing-if-branch" title="if path not taken" >I</span>if (schema.format &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >!FORMAT_TO_SCALAR[schema.format]) <span class="cstat-no" title="statement not covered" >m</span>ods.format = schema.format;</span>
1163
- &nbsp;
1164
- return { kind: 'scalar', name: 'string', ...mods };
1165
- }
1166
- &nbsp;
1167
- function integerSchemaToType(schema: NormalizedSchema): ContractTypeNode {
1168
- const name: ScalarTypeNode['name'] = schema.format === 'int64' ? 'bigint' : 'int';
1169
- const mods: Partial&lt;ScalarTypeNode&gt; = {};
1170
- if (schema.minimum !== undefined) mods.min = schema.minimum;
1171
- if (schema.maximum !== undefined) mods.max = schema.maximum;
1172
- return { kind: 'scalar', name, ...mods };
1173
- }
1174
- &nbsp;
1175
- function numberSchemaToType(schema: NormalizedSchema): ContractTypeNode {
1176
- const mods: Partial&lt;ScalarTypeNode&gt; = {};
1177
- <span class="missing-if-branch" title="if path not taken" >I</span>if (schema.minimum !== undefined) <span class="cstat-no" title="statement not covered" >mods.min = schema.minimum;</span>
1178
- <span class="missing-if-branch" title="if path not taken" >I</span>if (schema.maximum !== undefined) <span class="cstat-no" title="statement not covered" >mods.max = schema.maximum;</span>
1179
- return { kind: 'scalar', name: 'number', ...mods };
1180
- }
1181
- &nbsp;
1182
- function arraySchemaToType(schema: NormalizedSchema, ctx: SchemaContext): ContractTypeNode {
1183
- // Tuple: prefixItems (OAS 3.1)
1184
- if (schema.prefixItems &amp;&amp; schema.prefixItems.length &gt; 0) {
1185
- return {
1186
- kind: 'tuple',
1187
- items: schema.prefixItems.map(s =&gt; schemaToTypeNode(s, ctx)),
1188
- };
1189
- }
1190
- &nbsp;
1191
- const item = schema.items ? schemaToTypeNode(schema.items, ctx) : <span class="branch-1 cbranch-no" title="branch not covered" >{ kind: 'scalar' as const, name: 'unknown' as const };</span>
1192
- const mods: { min?: number; max?: number } = {};
1193
- if (schema.minItems !== undefined) mods.min = schema.minItems;
1194
- if (schema.maxItems !== undefined) mods.max = schema.maxItems;
1195
- &nbsp;
1196
- return { kind: 'array', item, ...mods };
1197
- }
1198
- &nbsp;
1199
- function objectSchemaToType(schema: NormalizedSchema, ctx: SchemaContext): ContractTypeNode {
1200
- // Record type: additionalProperties with no named properties
1201
- if (schema.additionalProperties &amp;&amp; typeof schema.additionalProperties === 'object' &amp;&amp; !schema.properties) {
1202
- return {
1203
- kind: 'record',
1204
- key: { kind: 'scalar', name: 'string' },
1205
- value: schemaToTypeNode(schema.additionalProperties, ctx),
1206
- };
1207
- }
1208
- &nbsp;
1209
- // Object with properties → inline object or extracted model
1210
- if (schema.properties) {
1211
- return schemaToInlineObject(schema, ctx);
1212
- }
1213
- &nbsp;
1214
- // Empty object
1215
- return { kind: 'scalar', name: 'object' };
1216
- }
1217
- &nbsp;
1218
- function schemaToInlineObject(schema: NormalizedSchema, ctx: SchemaContext): ContractTypeNode {
1219
- const fields = schemaPropertiesToFields(schema, ctx);
1220
- return { kind: 'inlineObject', fields };
1221
- }
1222
- &nbsp;
1223
- // ─── Field Conversion ─────────────────────────────────────────────────────
1224
- &nbsp;
1225
- function schemaPropertiesToFields(schema: NormalizedSchema, ctx: SchemaContext): FieldNode[] {
1226
- const properties = schema.properties ?? <span class="branch-1 cbranch-no" title="branch not covered" >{};</span>
1227
- const required = new Set(schema.required ?? []);
1228
- const fields: FieldNode[] = [];
1229
- &nbsp;
1230
- for (const [name, propSchema] of Object.entries(properties)) {
1231
- const propCtx = { ...ctx, path: `${ctx.path}/properties/${name}` };
1232
- const fieldType = schemaToTypeNode(propSchema, propCtx);
1233
- &nbsp;
1234
- // Determine nullable from the type (if it's a union with null)
1235
- let nullable = false;
1236
- let effectiveType = fieldType;
1237
- <span class="missing-if-branch" title="if path not taken" >I</span>if (fieldType.kind === 'union') {
1238
- const nonNull = <span class="cstat-no" title="statement not covered" >fieldType.members.filter(<span class="fstat-no" title="function not covered" >m =&gt; <span class="cstat-no" title="statement not covered" >!</span>(m.kind === 'scalar' &amp;&amp; m.name === 'null'))</span>;</span>
1239
- <span class="cstat-no" title="statement not covered" > if (nonNull.length &lt; fieldType.members.length) {</span>
1240
- <span class="cstat-no" title="statement not covered" > nullable = true;</span>
1241
- <span class="cstat-no" title="statement not covered" > effectiveType = nonNull.length === 1 ? nonNull[0]! : { kind: 'union', members: nonNull };</span>
1242
- }
1243
- }
1244
- &nbsp;
1245
- const visibility = propSchema.readOnly ? ('readonly' as const) : propSchema.writeOnly ? (<span class="branch-0 cbranch-no" title="branch not covered" >'writeonly' as const) : ('</span>normal' as const);
1246
- &nbsp;
1247
- fields.push({
1248
- name,
1249
- optional: !required.has(name),
1250
- nullable,
1251
- visibility,
1252
- type: effectiveType,
1253
- default: propSchema.default as string | number | boolean | undefined,
1254
- deprecated: propSchema.deprecated,
1255
- description: ctx.includeComments ? propSchema.description : undefined,
1256
- loc: LOC,
1257
- });
1258
- }
1259
- &nbsp;
1260
- return fields;
1261
- }
1262
- &nbsp;
1263
- // ─── Helpers ──────────────────────────────────────────────────────────────
1264
- &nbsp;
1265
- function normalizeTypeField(schema: NormalizedSchema): { baseType: string; nullable: boolean } | null {
1266
- if (!schema.type) return null;
1267
- &nbsp;
1268
- if (typeof schema.type === 'string') {
1269
- return { baseType: schema.type, nullable: false };
1270
- }
1271
- &nbsp;
1272
- <span class="missing-if-branch" title="else path not taken" >E</span>if (Array.isArray(schema.type)) {
1273
- const types = schema.type as string[];
1274
- const nonNull = types.filter(t =&gt; t !== 'null');
1275
- const nullable = types.includes('null');
1276
- <span class="missing-if-branch" title="else path not taken" >E</span>if (nonNull.length === 1) {
1277
- return { baseType: nonNull[0]!, nullable };
1278
- }
1279
- // Multiple non-null types — unusual but handle gracefully
1280
- <span class="cstat-no" title="statement not covered" > if (nonNull.length === 0) {</span>
1281
- <span class="cstat-no" title="statement not covered" > return { baseType: 'null', nullable: false };</span>
1282
- }
1283
- // Multiple types → treat as unknown
1284
- <span class="cstat-no" title="statement not covered" > return { baseType: nonNull[0]!, nullable };</span>
1285
- }
1286
- &nbsp;
1287
- <span class="cstat-no" title="statement not covered" > return null;</span>
1288
- }
1289
- &nbsp;
1290
- function toUnion(schemas: NormalizedSchema[], ctx: SchemaContext): ContractTypeNode {
1291
- const members = schemas.map(s =&gt; schemaToTypeNode(s, ctx));
1292
- <span class="missing-if-branch" title="if path not taken" >I</span>if (members.length === 1) <span class="cstat-no" title="statement not covered" >return members[0]!;</span>
1293
- return { kind: 'union', members };
1294
- }
1295
- &nbsp;
1296
- function toDiscriminatedUnion(schemas: NormalizedSchema[], discriminator: string, ctx: SchemaContext): ContractTypeNode {
1297
- const members = schemas.map(s =&gt; schemaToTypeNode(s, ctx));
1298
- <span class="missing-if-branch" title="if path not taken" >I</span>if (members.length === 1) <span class="cstat-no" title="statement not covered" >return members[0]!;</span>
1299
- return { kind: 'discriminatedUnion', discriminator, members };
1300
- }
1301
- &nbsp;
1302
- function warnUnsupported(schema: NormalizedSchema, ctx: SchemaContext): void {
1303
- if (schema.xml) ctx.warnings.warn(ctx.path, 'xml metadata is not supported, skipping');
1304
- <span class="missing-if-branch" title="if path not taken" >I</span>if (schema.externalDocs) <span class="cstat-no" title="statement not covered" >ctx.warnings.info(ctx.path, 'externalDocs is not supported, skipping');</span>
1305
- <span class="missing-if-branch" title="if path not taken" >I</span>if (schema.not) <span class="cstat-no" title="statement not covered" >ctx.warnings.warn(ctx.path, 'not keyword is not supported, skipping');</span>
1306
- }
1307
- &nbsp;
1308
- /**
1309
- * Extract a named model from an inline object schema (used for request/response bodies).
1310
- */
1311
- export function extractInlineModel(
1312
- schema: NormalizedSchema,
1313
- suggestedName: string,
1314
- ctx: SchemaContext,
1315
- ): { typeNode: ContractTypeNode; model?: ModelNode } {
1316
- // If it's a $ref, just use the ref
1317
- if (schema.$ref) {
1318
- return { typeNode: schemaToTypeNode(schema, ctx) };
1319
- }
1320
- &nbsp;
1321
- // If it's an object with properties, extract as a named model
1322
- <span class="missing-if-branch" title="if path not taken" >I</span>if (schema.properties || (schema.type === 'object' &amp;&amp; schema.additionalProperties === undefined)) {
1323
- const fields = <span class="cstat-no" title="statement not covered" >schemaPropertiesToFields(schema, ctx);</span>
1324
- const model: ModelNode = <span class="cstat-no" title="statement not covered" >{</span>
1325
- kind: 'model',
1326
- name: suggestedName,
1327
- fields,
1328
- description: ctx.includeComments ? schema.description : undefined,
1329
- loc: LOC,
1330
- };
1331
- <span class="cstat-no" title="statement not covered" > return {</span>
1332
- typeNode: { kind: 'ref', name: suggestedName },
1333
- model,
1334
- };
1335
- }
1336
- &nbsp;
1337
- // Otherwise return the type node directly
1338
- return { typeNode: schemaToTypeNode(schema, ctx) };
1339
- }
1340
- &nbsp;
1341
- /**
1342
- * Sanitize an OpenAPI schema name to a valid .ck identifier (PascalCase).
1343
- */
1344
- export function sanitizeName(name: string, warnings: WarningCollector): string {
1345
- // Replace dots, hyphens, spaces, and other invalid chars with word boundaries
1346
- const cleaned = name
1347
- .replace(/[^a-zA-Z0-9_$]/g, ' ')
1348
- .split(/\s+/)
1349
- .filter(Boolean)
1350
- .map(part =&gt; part.charAt(0).toUpperCase() + part.slice(1))
1351
- .join('');
1352
- &nbsp;
1353
- if (cleaned !== name) {
1354
- warnings.info(`#/components/schemas/${name}`, `Schema name sanitized: "${name}" → "${cleaned}"`);
1355
- }
1356
- &nbsp;
1357
- return cleaned || <span class="branch-1 cbranch-no" title="branch not covered" >'UnnamedSchema';</span>
1358
- }
1359
- &nbsp;</pre></td></tr></table></pre>
1360
-
1361
- <div class='push'></div><!-- for sticky footer -->
1362
- </div><!-- /wrapper -->
1363
- <div class='footer quiet pad2 space-top1 center small'>
1364
- Code coverage generated by
1365
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1366
- at 2026-06-12T19:14:44.390Z
1367
- </div>
1368
- <script src="../prettify.js"></script>
1369
- <script>
1370
- window.onload = function () {
1371
- prettyPrint();
1372
- };
1373
- </script>
1374
- <script src="../sorter.js"></script>
1375
- <script src="../block-navigation.js"></script>
1376
- </body>
1377
- </html>
1378
-