@strapi/strapi 4.10.0 → 4.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/coverage/clover.xml +1613 -0
  2. package/coverage/coverage-final.json +48 -0
  3. package/coverage/lcov-report/base.css +224 -0
  4. package/coverage/lcov-report/block-navigation.js +87 -0
  5. package/coverage/lcov-report/commands/__tests__/data-transfer/shared/index.html +116 -0
  6. package/coverage/lcov-report/commands/__tests__/data-transfer/shared/transfer.test.utils.js.html +133 -0
  7. package/coverage/lcov-report/commands/admin-create.js.html +424 -0
  8. package/coverage/lcov-report/commands/admin-reset.js.html +241 -0
  9. package/coverage/lcov-report/commands/generate-template.js.html +373 -0
  10. package/coverage/lcov-report/commands/index.html +146 -0
  11. package/coverage/lcov-report/commands/transfer/export.js.html +619 -0
  12. package/coverage/lcov-report/commands/transfer/import.js.html +562 -0
  13. package/coverage/lcov-report/commands/transfer/index.html +146 -0
  14. package/coverage/lcov-report/commands/transfer/transfer.js.html +532 -0
  15. package/coverage/lcov-report/commands/utils/helpers.js.html +430 -0
  16. package/coverage/lcov-report/commands/utils/index.html +116 -0
  17. package/coverage/lcov-report/core/registries/custom-fields.js.html +301 -0
  18. package/coverage/lcov-report/core/registries/index.html +116 -0
  19. package/coverage/lcov-report/core-api/controller/collection-type.js.html +418 -0
  20. package/coverage/lcov-report/core-api/controller/index.html +161 -0
  21. package/coverage/lcov-report/core-api/controller/index.js.html +220 -0
  22. package/coverage/lcov-report/core-api/controller/single-type.js.html +274 -0
  23. package/coverage/lcov-report/core-api/controller/transform.js.html +376 -0
  24. package/coverage/lcov-report/core-api/service/collection-type.js.html +325 -0
  25. package/coverage/lcov-report/core-api/service/index.html +161 -0
  26. package/coverage/lcov-report/core-api/service/index.js.html +220 -0
  27. package/coverage/lcov-report/core-api/service/pagination.js.html +460 -0
  28. package/coverage/lcov-report/core-api/service/single-type.js.html +301 -0
  29. package/coverage/lcov-report/favicon.png +0 -0
  30. package/coverage/lcov-report/index.html +386 -0
  31. package/coverage/lcov-report/load/filepath-to-prop-path.js.html +151 -0
  32. package/coverage/lcov-report/load/index.html +116 -0
  33. package/coverage/lcov-report/prettify.css +1 -0
  34. package/coverage/lcov-report/prettify.js +2 -0
  35. package/coverage/lcov-report/services/content-api/index.html +116 -0
  36. package/coverage/lcov-report/services/content-api/index.js.html +307 -0
  37. package/coverage/lcov-report/services/content-api/permissions/engine.js.html +100 -0
  38. package/coverage/lcov-report/services/content-api/permissions/index.html +131 -0
  39. package/coverage/lcov-report/services/content-api/permissions/index.js.html +529 -0
  40. package/coverage/lcov-report/services/content-api/permissions/providers/action.js.html +142 -0
  41. package/coverage/lcov-report/services/content-api/permissions/providers/condition.js.html +142 -0
  42. package/coverage/lcov-report/services/content-api/permissions/providers/index.html +146 -0
  43. package/coverage/lcov-report/services/content-api/permissions/providers/index.js.html +112 -0
  44. package/coverage/lcov-report/services/core-store.js.html +520 -0
  45. package/coverage/lcov-report/services/entity-service/attributes/index.html +131 -0
  46. package/coverage/lcov-report/services/entity-service/attributes/index.js.html +178 -0
  47. package/coverage/lcov-report/services/entity-service/attributes/transforms.js.html +145 -0
  48. package/coverage/lcov-report/services/entity-service/components.js.html +1246 -0
  49. package/coverage/lcov-report/services/entity-service/index.html +146 -0
  50. package/coverage/lcov-report/services/entity-service/index.js.html +1120 -0
  51. package/coverage/lcov-report/services/entity-service/params.js.html +112 -0
  52. package/coverage/lcov-report/services/entity-validator/__tests__/relations/utils/index.html +116 -0
  53. package/coverage/lcov-report/services/entity-validator/__tests__/relations/utils/relations.testdata.js.html +544 -0
  54. package/coverage/lcov-report/services/entity-validator/index.html +131 -0
  55. package/coverage/lcov-report/services/entity-validator/index.js.html +1231 -0
  56. package/coverage/lcov-report/services/entity-validator/validators.js.html +733 -0
  57. package/coverage/lcov-report/services/event-hub.js.html +319 -0
  58. package/coverage/lcov-report/services/fs.js.html +259 -0
  59. package/coverage/lcov-report/services/index.html +161 -0
  60. package/coverage/lcov-report/services/metrics/admin-user-hash.js.html +148 -0
  61. package/coverage/lcov-report/services/metrics/index.html +206 -0
  62. package/coverage/lcov-report/services/metrics/index.js.html +265 -0
  63. package/coverage/lcov-report/services/metrics/is-truthy.js.html +112 -0
  64. package/coverage/lcov-report/services/metrics/middleware.js.html +184 -0
  65. package/coverage/lcov-report/services/metrics/rate-limiter.js.html +166 -0
  66. package/coverage/lcov-report/services/metrics/sender.js.html +394 -0
  67. package/coverage/lcov-report/services/metrics/stringify-deep.js.html +151 -0
  68. package/coverage/lcov-report/services/utils/index.html +116 -0
  69. package/coverage/lcov-report/services/utils/upload-files.js.html +322 -0
  70. package/coverage/lcov-report/services/worker-queue.js.html +262 -0
  71. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  72. package/coverage/lcov-report/sorter.js +196 -0
  73. package/coverage/lcov-report/utils/convert-custom-field-type.js.html +151 -0
  74. package/coverage/lcov-report/utils/index.html +146 -0
  75. package/coverage/lcov-report/utils/machine-id.js.html +127 -0
  76. package/coverage/lcov-report/utils/url-from-segments.js.html +121 -0
  77. package/lib/commands/__tests__/commands.test.js +20 -0
  78. package/lib/commands/__tests__/commands.test.utils.js +16 -0
  79. package/lib/commands/actions/admin/create-user/__tests__/admin.create-user.test.js +450 -0
  80. package/lib/commands/actions/admin/reset-user-password/__tests__/admin.reset-user-password.test.js +145 -0
  81. package/lib/commands/actions/build/action.js +18 -0
  82. package/lib/commands/actions/build/command.js +15 -0
  83. package/lib/commands/actions/export/__tests__/export.test.js +175 -0
  84. package/lib/commands/actions/import/__tests__/import.test.js +143 -0
  85. package/lib/commands/actions/templates/generate/__tests__/templates.generate.js +118 -0
  86. package/lib/commands/actions/transfer/__tests__/transfer.test.js +178 -0
  87. package/lib/core/registries/__tests__/custom-fields.test.js +152 -0
  88. package/lib/core-api/__tests__/controller.test.js +39 -0
  89. package/lib/core-api/controller/__tests__/transform.test.js +226 -0
  90. package/lib/core-api/service/__tests__/index.test.js +127 -0
  91. package/lib/core-api/service/__tests__/pagination.test.js +275 -0
  92. package/lib/load/__tests__/filepath-to-prop-path.test.js +30 -0
  93. package/lib/middlewares/__tests__/errors.test.js +21 -0
  94. package/lib/services/__tests__/content-api-permissions.test.js +291 -0
  95. package/lib/services/__tests__/core-store.test.js +148 -0
  96. package/lib/services/__tests__/event-hub.test.js +126 -0
  97. package/lib/services/__tests__/fs.test.js +78 -0
  98. package/lib/services/__tests__/worker-queue.test.js +47 -0
  99. package/lib/services/entity-service/__tests__/entity-service-events.test.js +117 -0
  100. package/lib/services/entity-service/__tests__/entity-service.test.js +587 -0
  101. package/lib/services/entity-validator/__tests__/biginteger-validators.test.js +220 -0
  102. package/lib/services/entity-validator/__tests__/date-validators.test.js +183 -0
  103. package/lib/services/entity-validator/__tests__/datetime-validators.test.js +183 -0
  104. package/lib/services/entity-validator/__tests__/email-validators.test.js +56 -0
  105. package/lib/services/entity-validator/__tests__/enumeration-validators.test.js +43 -0
  106. package/lib/services/entity-validator/__tests__/float-validators.test.js +278 -0
  107. package/lib/services/entity-validator/__tests__/index.test.js +609 -0
  108. package/lib/services/entity-validator/__tests__/integer-validators.test.js +278 -0
  109. package/lib/services/entity-validator/__tests__/relations/attribute-level.test.js +123 -0
  110. package/lib/services/entity-validator/__tests__/relations/component-level.test.js +275 -0
  111. package/lib/services/entity-validator/__tests__/relations/dynamic-zone-level.test.js +159 -0
  112. package/lib/services/entity-validator/__tests__/relations/media-level.test.js +74 -0
  113. package/lib/services/entity-validator/__tests__/relations/utils/relations.testdata.js +153 -0
  114. package/lib/services/entity-validator/__tests__/string-validators.test.js +374 -0
  115. package/lib/services/entity-validator/__tests__/time-validators.test.js +183 -0
  116. package/lib/services/entity-validator/__tests__/timestamp-validators.test.js +204 -0
  117. package/lib/services/entity-validator/__tests__/uid-validators.test.js +229 -0
  118. package/lib/services/metrics/__tests__/admin-user-hash.test.js +41 -0
  119. package/lib/services/metrics/__tests__/index.test.js +157 -0
  120. package/lib/services/metrics/__tests__/is-truthy.js +33 -0
  121. package/lib/services/metrics/__tests__/middleware.test.js +60 -0
  122. package/lib/services/metrics/__tests__/rate-limiter.test.js +50 -0
  123. package/lib/services/metrics/__tests__/stringify-deep.test.js +27 -0
  124. package/lib/utils/__tests__/convert-custom-field-type.test.js +69 -0
  125. package/lib/utils/__tests__/url-from-segments.test.js +40 -0
  126. package/package.json +15 -15
@@ -0,0 +1,1231 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for services/entity-validator/index.js</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">services/entity-validator</a> index.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">91.61% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>142/155</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">77.17% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>71/92</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>35/35</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">91.33% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>137/150</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
449
+ <span class="cline-any cline-neutral">&nbsp;</span>
450
+ <span class="cline-any cline-neutral">&nbsp;</span>
451
+ <span class="cline-any cline-neutral">&nbsp;</span>
452
+ <span class="cline-any cline-neutral">&nbsp;</span>
453
+ <span class="cline-any cline-neutral">&nbsp;</span>
454
+ <span class="cline-any cline-neutral">&nbsp;</span>
455
+ <span class="cline-any cline-yes">7x</span>
456
+ <span class="cline-any cline-yes">7x</span>
457
+ <span class="cline-any cline-yes">7x</span>
458
+ <span class="cline-any cline-yes">7x</span>
459
+ <span class="cline-any cline-neutral">&nbsp;</span>
460
+ <span class="cline-any cline-yes">7x</span>
461
+ <span class="cline-any cline-yes">7x</span>
462
+ <span class="cline-any cline-yes">7x</span>
463
+ <span class="cline-any cline-neutral">&nbsp;</span>
464
+ <span class="cline-any cline-yes">7x</span>
465
+ <span class="cline-any cline-yes">63x</span>
466
+ <span class="cline-any cline-neutral">&nbsp;</span>
467
+ <span class="cline-any cline-yes">63x</span>
468
+ <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-neutral">&nbsp;</span>
470
+ <span class="cline-any cline-neutral">&nbsp;</span>
471
+ <span class="cline-any cline-no">&nbsp;</span>
472
+ <span class="cline-any cline-neutral">&nbsp;</span>
473
+ <span class="cline-any cline-yes">63x</span>
474
+ <span class="cline-any cline-no">&nbsp;</span>
475
+ <span class="cline-any cline-neutral">&nbsp;</span>
476
+ <span class="cline-any cline-yes">63x</span>
477
+ <span class="cline-any cline-neutral">&nbsp;</span>
478
+ <span class="cline-any cline-neutral">&nbsp;</span>
479
+ <span class="cline-any cline-yes">7x</span>
480
+ <span class="cline-any cline-yes">306x</span>
481
+ <span class="cline-any cline-yes">306x</span>
482
+ <span class="cline-any cline-yes">306x</span>
483
+ <span class="cline-any cline-yes">90x</span>
484
+ <span class="cline-any cline-yes">90x</span>
485
+ <span class="cline-any cline-no">&nbsp;</span>
486
+ <span class="cline-any cline-no">&nbsp;</span>
487
+ <span class="cline-any cline-neutral">&nbsp;</span>
488
+ <span class="cline-any cline-neutral">&nbsp;</span>
489
+ <span class="cline-any cline-yes">216x</span>
490
+ <span class="cline-any cline-neutral">&nbsp;</span>
491
+ <span class="cline-any cline-yes">306x</span>
492
+ <span class="cline-any cline-neutral">&nbsp;</span>
493
+ <span class="cline-any cline-neutral">&nbsp;</span>
494
+ <span class="cline-any cline-neutral">&nbsp;</span>
495
+ <span class="cline-any cline-yes">7x</span>
496
+ <span class="cline-any cline-yes">339x</span>
497
+ <span class="cline-any cline-yes">339x</span>
498
+ <span class="cline-any cline-neutral">&nbsp;</span>
499
+ <span class="cline-any cline-yes">339x</span>
500
+ <span class="cline-any cline-yes">334x</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-yes">63x</span>
505
+ <span class="cline-any cline-neutral">&nbsp;</span>
506
+ <span class="cline-any cline-yes">271x</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-yes">5x</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-yes">339x</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-yes">191x</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-yes">7x</span>
520
+ <span class="cline-any cline-yes">63x</span>
521
+ <span class="cline-any cline-neutral">&nbsp;</span>
522
+ <span class="cline-any cline-neutral">&nbsp;</span>
523
+ <span class="cline-any cline-yes">63x</span>
524
+ <span class="cline-any cline-yes">63x</span>
525
+ <span class="cline-any cline-no">&nbsp;</span>
526
+ <span class="cline-any cline-neutral">&nbsp;</span>
527
+ <span class="cline-any cline-neutral">&nbsp;</span>
528
+ <span class="cline-any cline-yes">63x</span>
529
+ <span class="cline-any cline-yes">32x</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-yes">16x</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-yes">32x</span>
537
+ <span class="cline-any cline-yes">32x</span>
538
+ <span class="cline-any cline-neutral">&nbsp;</span>
539
+ <span class="cline-any cline-yes">31x</span>
540
+ <span class="cline-any cline-yes">31x</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-neutral">&nbsp;</span>
544
+ <span class="cline-any cline-neutral">&nbsp;</span>
545
+ <span class="cline-any cline-yes">63x</span>
546
+ <span class="cline-any cline-neutral">&nbsp;</span>
547
+ <span class="cline-any cline-neutral">&nbsp;</span>
548
+ <span class="cline-any cline-neutral">&nbsp;</span>
549
+ <span class="cline-any cline-yes">7x</span>
550
+ <span class="cline-any cline-yes">31x</span>
551
+ <span class="cline-any cline-neutral">&nbsp;</span>
552
+ <span class="cline-any cline-neutral">&nbsp;</span>
553
+ <span class="cline-any cline-yes">31x</span>
554
+ <span class="cline-any cline-neutral">&nbsp;</span>
555
+ <span class="cline-any cline-yes">14x</span>
556
+ <span class="cline-any cline-yes">14x</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-neutral">&nbsp;</span>
562
+ <span class="cline-any cline-neutral">&nbsp;</span>
563
+ <span class="cline-any cline-yes">14x</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-neutral">&nbsp;</span>
567
+ <span class="cline-any cline-neutral">&nbsp;</span>
568
+ <span class="cline-any cline-yes">31x</span>
569
+ <span class="cline-any cline-yes">31x</span>
570
+ <span class="cline-any cline-neutral">&nbsp;</span>
571
+ <span class="cline-any cline-yes">31x</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-neutral">&nbsp;</span>
574
+ <span class="cline-any cline-neutral">&nbsp;</span>
575
+ <span class="cline-any cline-yes">7x</span>
576
+ <span class="cline-any cline-yes">97x</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-yes">97x</span>
580
+ <span class="cline-any cline-yes">10x</span>
581
+ <span class="cline-any cline-neutral">&nbsp;</span>
582
+ <span class="cline-any cline-yes">87x</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-yes">97x</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-neutral">&nbsp;</span>
589
+ <span class="cline-any cline-yes">97x</span>
590
+ <span class="cline-any cline-neutral">&nbsp;</span>
591
+ <span class="cline-any cline-neutral">&nbsp;</span>
592
+ <span class="cline-any cline-yes">115x</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-yes">115x</span>
596
+ <span class="cline-any cline-yes">113x</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-yes">2x</span>
600
+ <span class="cline-any cline-neutral">&nbsp;</span>
601
+ <span class="cline-any cline-neutral">&nbsp;</span>
602
+ <span class="cline-any cline-yes">115x</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-yes">115x</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-yes">339x</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-yes">339x</span>
613
+ <span class="cline-any cline-yes">33x</span>
614
+ <span class="cline-any cline-yes">306x</span>
615
+ <span class="cline-any cline-yes">115x</span>
616
+ <span class="cline-any cline-neutral">&nbsp;</span>
617
+ <span class="cline-any cline-yes">191x</span>
618
+ <span class="cline-any cline-yes">63x</span>
619
+ <span class="cline-any cline-yes">128x</span>
620
+ <span class="cline-any cline-yes">31x</span>
621
+ <span class="cline-any cline-neutral">&nbsp;</span>
622
+ <span class="cline-any cline-yes">97x</span>
623
+ <span class="cline-any cline-neutral">&nbsp;</span>
624
+ <span class="cline-any cline-neutral">&nbsp;</span>
625
+ <span class="cline-any cline-yes">191x</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-yes">339x</span>
629
+ <span class="cline-any cline-neutral">&nbsp;</span>
630
+ <span class="cline-any cline-yes">339x</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">7x</span>
635
+ <span class="cline-any cline-yes">124x</span>
636
+ <span class="cline-any cline-yes">124x</span>
637
+ <span class="cline-any cline-neutral">&nbsp;</span>
638
+ <span class="cline-any cline-yes">124x</span>
639
+ <span class="cline-any cline-yes">339x</span>
640
+ <span class="cline-any cline-neutral">&nbsp;</span>
641
+ <span class="cline-any cline-neutral">&nbsp;</span>
642
+ <span class="cline-any cline-neutral">&nbsp;</span>
643
+ <span class="cline-any cline-neutral">&nbsp;</span>
644
+ <span class="cline-any cline-neutral">&nbsp;</span>
645
+ <span class="cline-any cline-neutral">&nbsp;</span>
646
+ <span class="cline-any cline-neutral">&nbsp;</span>
647
+ <span class="cline-any cline-neutral">&nbsp;</span>
648
+ <span class="cline-any cline-neutral">&nbsp;</span>
649
+ <span class="cline-any cline-yes">339x</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-yes">124x</span>
653
+ <span class="cline-any cline-neutral">&nbsp;</span>
654
+ <span class="cline-any cline-neutral">&nbsp;</span>
655
+ <span class="cline-any cline-neutral">&nbsp;</span>
656
+ <span class="cline-any cline-yes">7x</span>
657
+ <span class="cline-any cline-yes">14x</span>
658
+ <span class="cline-any cline-yes">63x</span>
659
+ <span class="cline-any cline-no">&nbsp;</span>
660
+ <span class="cline-any cline-neutral">&nbsp;</span>
661
+ <span class="cline-any cline-no">&nbsp;</span>
662
+ <span class="cline-any cline-neutral">&nbsp;</span>
663
+ <span class="cline-any cline-neutral">&nbsp;</span>
664
+ <span class="cline-any cline-neutral">&nbsp;</span>
665
+ <span class="cline-any cline-neutral">&nbsp;</span>
666
+ <span class="cline-any cline-yes">63x</span>
667
+ <span class="cline-any cline-neutral">&nbsp;</span>
668
+ <span class="cline-any cline-neutral">&nbsp;</span>
669
+ <span class="cline-any cline-neutral">&nbsp;</span>
670
+ <span class="cline-any cline-neutral">&nbsp;</span>
671
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
675
+ <span class="cline-any cline-yes">63x</span>
676
+ <span class="cline-any cline-yes">63x</span>
677
+ <span class="cline-any cline-neutral">&nbsp;</span>
678
+ <span class="cline-any cline-yes">16x</span>
679
+ <span class="cline-any cline-neutral">&nbsp;</span>
680
+ <span class="cline-any cline-neutral">&nbsp;</span>
681
+ <span class="cline-any cline-neutral">&nbsp;</span>
682
+ <span class="cline-any cline-neutral">&nbsp;</span>
683
+ <span class="cline-any cline-yes">47x</span>
684
+ <span class="cline-any cline-neutral">&nbsp;</span>
685
+ <span class="cline-any cline-neutral">&nbsp;</span>
686
+ <span class="cline-any cline-neutral">&nbsp;</span>
687
+ <span class="cline-any cline-yes">63x</span>
688
+ <span class="cline-any cline-neutral">&nbsp;</span>
689
+ <span class="cline-any cline-neutral">&nbsp;</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-yes">7x</span>
697
+ <span class="cline-any cline-yes">86x</span>
698
+ <span class="cline-any cline-no">&nbsp;</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-yes">86x</span>
702
+ <span class="cline-any cline-yes">2x</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">84x</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-yes">84x</span>
708
+ <span class="cline-any cline-yes">413x</span>
709
+ <span class="cline-any cline-yes">413x</span>
710
+ <span class="cline-any cline-neutral">&nbsp;</span>
711
+ <span class="cline-any cline-yes">413x</span>
712
+ <span class="cline-any cline-yes">240x</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-yes">173x</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-yes">35x</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-no">&nbsp;</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-neutral">&nbsp;</span>
723
+ <span class="cline-any cline-yes">35x</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-yes">35x</span>
728
+ <span class="cline-any cline-yes">10x</span>
729
+ <span class="cline-any cline-yes">25x</span>
730
+ <span class="cline-any cline-yes">20x</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-yes">5x</span>
733
+ <span class="cline-any cline-neutral">&nbsp;</span>
734
+ <span class="cline-any cline-yes">72x</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-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-yes">35x</span>
739
+ <span class="cline-any cline-yes">35x</span>
740
+ <span class="cline-any cline-yes">35x</span>
741
+ <span class="cline-any cline-neutral">&nbsp;</span>
742
+ <span class="cline-any cline-neutral">&nbsp;</span>
743
+ <span class="cline-any cline-yes">40x</span>
744
+ <span class="cline-any cline-yes">16x</span>
745
+ <span class="cline-any cline-no">&nbsp;</span>
746
+ <span class="cline-any cline-neutral">&nbsp;</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-neutral">&nbsp;</span>
750
+ <span class="cline-any cline-yes">16x</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-neutral">&nbsp;</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-neutral">&nbsp;</span>
756
+ <span class="cline-any cline-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-yes">79x</span>
758
+ <span class="cline-any cline-no">&nbsp;</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-neutral">&nbsp;</span>
761
+ <span class="cline-any cline-neutral">&nbsp;</span>
762
+ <span class="cline-any cline-neutral">&nbsp;</span>
763
+ <span class="cline-any cline-neutral">&nbsp;</span>
764
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
+ <span class="cline-any cline-yes">31x</span>
766
+ <span class="cline-any cline-yes">7x</span>
767
+ <span class="cline-any cline-no">&nbsp;</span>
768
+ <span class="cline-any cline-neutral">&nbsp;</span>
769
+ <span class="cline-any cline-neutral">&nbsp;</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-neutral">&nbsp;</span>
772
+ <span class="cline-any cline-yes">7x</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">45x</span>
780
+ <span class="cline-any cline-no">&nbsp;</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-neutral">&nbsp;</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-yes">67x</span>
788
+ <span class="cline-any cline-neutral">&nbsp;</span>
789
+ <span class="cline-any cline-neutral">&nbsp;</span>
790
+ <span class="cline-any cline-yes">102x</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-neutral">&nbsp;</span>
796
+ <span class="cline-any cline-neutral">&nbsp;</span>
797
+ <span class="cline-any cline-neutral">&nbsp;</span>
798
+ <span class="cline-any cline-yes">7x</span>
799
+ <span class="cline-any cline-yes">63x</span>
800
+ <span class="cline-any cline-neutral">&nbsp;</span>
801
+ <span class="cline-any cline-yes">63x</span>
802
+ <span class="cline-any cline-yes">35x</span>
803
+ <span class="cline-any cline-yes">35x</span>
804
+ <span class="cline-any cline-yes">35x</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-yes">72x</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-neutral">&nbsp;</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-neutral">&nbsp;</span>
812
+ <span class="cline-any cline-yes">35x</span>
813
+ <span class="cline-any cline-yes">16x</span>
814
+ <span class="cline-any cline-neutral">&nbsp;</span>
815
+ <span class="cline-any cline-neutral">&nbsp;</span>
816
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">35x</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-yes">63x</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-yes">7x</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-neutral">&nbsp;</span>
830
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
831
+ * Entity validator
832
+ * Module that will validate input data for entity creation or edition
833
+ */
834
+ &nbsp;
835
+ 'use strict';
836
+ &nbsp;
837
+ const { uniqBy, castArray, isNil, isArray, mergeWith } = require('lodash');
838
+ const { has, assoc, prop, isObject, isEmpty } = require('lodash/fp');
839
+ const strapiUtils = require('@strapi/utils');
840
+ const validators = require('./validators');
841
+ &nbsp;
842
+ const { yup, validateYupSchema } = strapiUtils;
843
+ const { isMediaAttribute, isScalarAttribute, getWritableAttributes } = strapiUtils.contentTypes;
844
+ const { ValidationError } = strapiUtils.errors;
845
+ &nbsp;
846
+ const addMinMax = (validator, { attr, updatedAttribute }) =&gt; {
847
+ let nextValidator = validator;
848
+ &nbsp;
849
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (
850
+ Number.isInteger(attr.min) &amp;&amp;
851
+ (<span class="branch-1 cbranch-no" title="branch not covered" >attr.required </span>|| (<span class="branch-2 cbranch-no" title="branch not covered" >Array.isArray(updatedAttribute.value) </span>&amp;&amp; <span class="branch-3 cbranch-no" title="branch not covered" >updatedAttribute.value.length &gt; 0)</span>)
852
+ ) {
853
+ <span class="cstat-no" title="statement not covered" > nextValidator = nextValidator.min(attr.min);</span>
854
+ }
855
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (Number.isInteger(attr.max)) {
856
+ <span class="cstat-no" title="statement not covered" > nextValidator = nextValidator.max(attr.max);</span>
857
+ }
858
+ return nextValidator;
859
+ };
860
+ &nbsp;
861
+ const addRequiredValidation = (createOrUpdate) =&gt; {
862
+ return (validator, { attr: { required } }) =&gt; {
863
+ let nextValidator = validator;
864
+ if (required) {
865
+ if (createOrUpdate === 'creation') {
866
+ nextValidator = nextValidator.notNil();
867
+ } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (createOrUpdate === 'update') {</span>
868
+ <span class="cstat-no" title="statement not covered" > nextValidator = nextValidator.notNull();</span>
869
+ }
870
+ } else {
871
+ nextValidator = nextValidator.nullable();
872
+ }
873
+ return nextValidator;
874
+ };
875
+ };
876
+ &nbsp;
877
+ const addDefault = (createOrUpdate) =&gt; {
878
+ return (validator, { attr }) =&gt; {
879
+ let nextValidator = validator;
880
+ &nbsp;
881
+ if (createOrUpdate === 'creation') {
882
+ if (
883
+ ((attr.type === 'component' &amp;&amp; attr.repeatable) || attr.type === 'dynamiczone') &amp;&amp;
884
+ !attr.required
885
+ ) {
886
+ nextValidator = nextValidator.default([]);
887
+ } else {
888
+ nextValidator = nextValidator.default(attr.default);
889
+ }
890
+ } else {
891
+ nextValidator = nextValidator.default(undefined);
892
+ }
893
+ &nbsp;
894
+ return nextValidator;
895
+ };
896
+ };
897
+ &nbsp;
898
+ const preventCast = (validator) =&gt; validator.transform((val, originalVal) =&gt; originalVal);
899
+ &nbsp;
900
+ const createComponentValidator =
901
+ (createOrUpdate) =&gt;
902
+ ({ attr, updatedAttribute }, { isDraft }) =&gt; {
903
+ let validator;
904
+ &nbsp;
905
+ const model = strapi.getModel(attr.component);
906
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!model) {
907
+ <span class="cstat-no" title="statement not covered" > throw new Error('Validation failed: Model not found');</span>
908
+ }
909
+ &nbsp;
910
+ if (prop('repeatable', attr) === true) {
911
+ validator = yup
912
+ .array()
913
+ .of(
914
+ yup.lazy((item) =&gt;
915
+ createModelValidator(createOrUpdate)({ model, data: item }, { isDraft }).notNull()
916
+ )
917
+ );
918
+ validator = addRequiredValidation(createOrUpdate)(validator, { attr: { required: true } });
919
+ validator = addMinMax(validator, { attr, updatedAttribute });
920
+ } else {
921
+ validator = createModelValidator(createOrUpdate)({ model, updatedAttribute }, { isDraft });
922
+ validator = addRequiredValidation(createOrUpdate)(validator, {
923
+ attr: { required: !isDraft &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >attr.required </span>},
924
+ });
925
+ }
926
+ &nbsp;
927
+ return validator;
928
+ };
929
+ &nbsp;
930
+ const createDzValidator =
931
+ (createOrUpdate) =&gt;
932
+ ({ attr, updatedAttribute }, { isDraft }) =&gt; {
933
+ let validator;
934
+ &nbsp;
935
+ validator = yup.array().of(
936
+ yup.lazy((item) =&gt; {
937
+ const model = strapi.getModel(prop('__component', item));
938
+ const schema = yup
939
+ .object()
940
+ .shape({
941
+ __component: yup.string().required().oneOf(Object.keys(strapi.components)),
942
+ })
943
+ .notNull();
944
+ &nbsp;
945
+ return model
946
+ ? schema.concat(createModelValidator(createOrUpdate)({ model, data: item }, { isDraft }))
947
+ : <span class="branch-1 cbranch-no" title="branch not covered" >schema;</span>
948
+ })
949
+ );
950
+ validator = addRequiredValidation(createOrUpdate)(validator, { attr: { required: true } });
951
+ validator = addMinMax(validator, { attr, updatedAttribute });
952
+ &nbsp;
953
+ return validator;
954
+ };
955
+ &nbsp;
956
+ const createRelationValidator =
957
+ (createOrUpdate) =&gt;
958
+ ({ attr, updatedAttribute }, { isDraft }) =&gt; {
959
+ let validator;
960
+ &nbsp;
961
+ if (Array.isArray(updatedAttribute.value)) {
962
+ validator = yup.array().of(yup.mixed());
963
+ } else {
964
+ validator = yup.mixed();
965
+ }
966
+ &nbsp;
967
+ validator = addRequiredValidation(createOrUpdate)(validator, {
968
+ attr: { required: !isDraft &amp;&amp; attr.required },
969
+ });
970
+ &nbsp;
971
+ return validator;
972
+ };
973
+ &nbsp;
974
+ const createScalarAttributeValidator = (createOrUpdate) =&gt; (metas, options) =&gt; {
975
+ let validator;
976
+ &nbsp;
977
+ if (has(metas.attr.type, validators)) {
978
+ validator = validators[metas.attr.type](metas, options);
979
+ } else {
980
+ // No validators specified - fall back to mixed
981
+ validator = yup.mixed();
982
+ }
983
+ &nbsp;
984
+ validator = addRequiredValidation(createOrUpdate)(validator, {
985
+ attr: { required: !options.isDraft &amp;&amp; metas.attr.required },
986
+ });
987
+ &nbsp;
988
+ return validator;
989
+ };
990
+ &nbsp;
991
+ const createAttributeValidator = (createOrUpdate) =&gt; (metas, options) =&gt; {
992
+ let validator;
993
+ &nbsp;
994
+ if (isMediaAttribute(metas.attr)) {
995
+ validator = yup.mixed();
996
+ } else if (isScalarAttribute(metas.attr)) {
997
+ validator = createScalarAttributeValidator(createOrUpdate)(metas, options);
998
+ } else {
999
+ if (metas.attr.type === 'component') {
1000
+ validator = createComponentValidator(createOrUpdate)(metas, options);
1001
+ } else if (metas.attr.type === 'dynamiczone') {
1002
+ validator = createDzValidator(createOrUpdate)(metas, options);
1003
+ } else {
1004
+ validator = createRelationValidator(createOrUpdate)(metas, options);
1005
+ }
1006
+ &nbsp;
1007
+ validator = preventCast(validator);
1008
+ }
1009
+ &nbsp;
1010
+ validator = addDefault(createOrUpdate)(validator, metas);
1011
+ &nbsp;
1012
+ return validator;
1013
+ };
1014
+ &nbsp;
1015
+ const createModelValidator =
1016
+ (createOrUpdate) =&gt;
1017
+ ({ model, data, entity }, options) =&gt; {
1018
+ const writableAttributes = model ? getWritableAttributes(model) : <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
1019
+ &nbsp;
1020
+ const schema = writableAttributes.reduce((validators, attributeName) =&gt; {
1021
+ const validator = createAttributeValidator(createOrUpdate)(
1022
+ {
1023
+ attr: model.attributes[attributeName],
1024
+ updatedAttribute: { name: attributeName, value: prop(attributeName, data) },
1025
+ model,
1026
+ entity,
1027
+ },
1028
+ options
1029
+ );
1030
+ &nbsp;
1031
+ return assoc(attributeName, validator)(validators);
1032
+ }, {});
1033
+ &nbsp;
1034
+ return yup.object().shape(schema);
1035
+ };
1036
+ &nbsp;
1037
+ const createValidateEntity =
1038
+ (createOrUpdate) =&gt;
1039
+ async (model, data, { isDraft = false } = {}, entity = null) =&gt; {
1040
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!isObject(data)) {
1041
+ const { displayName } = <span class="cstat-no" title="statement not covered" >model.info;</span>
1042
+ &nbsp;
1043
+ <span class="cstat-no" title="statement not covered" > throw new ValidationError(</span>
1044
+ `Invalid payload submitted for the ${createOrUpdate} of an entity of type ${displayName}. Expected an object, but got ${typeof data}`
1045
+ );
1046
+ }
1047
+ &nbsp;
1048
+ const validator = createModelValidator(createOrUpdate)(
1049
+ {
1050
+ model,
1051
+ data,
1052
+ entity,
1053
+ },
1054
+ { isDraft }
1055
+ )
1056
+ .test('relations-test', 'check that all relations exist', async function (data) {
1057
+ try {
1058
+ await checkRelationsExist(buildRelationsStore({ uid: model.uid, data }));
1059
+ } catch (e) {
1060
+ return this.createError({
1061
+ path: this.path,
1062
+ message: e.message,
1063
+ });
1064
+ }
1065
+ return true;
1066
+ })
1067
+ .required();
1068
+ &nbsp;
1069
+ return validateYupSchema(validator, { strict: false, abortEarly: false })(data);
1070
+ };
1071
+ &nbsp;
1072
+ /**
1073
+ * Builds an object containing all the media and relations being associated with an entity
1074
+ * @param {String} uid of the model
1075
+ * @param {Object} data
1076
+ * @returns {Object}
1077
+ */
1078
+ const buildRelationsStore = ({ uid, data }) =&gt; {
1079
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!uid) {
1080
+ <span class="cstat-no" title="statement not covered" > throw new ValidationError(`Cannot build relations store: "uid" is undefined`);</span>
1081
+ }
1082
+ &nbsp;
1083
+ if (isEmpty(data)) {
1084
+ return {};
1085
+ }
1086
+ &nbsp;
1087
+ const currentModel = strapi.getModel(uid);
1088
+ &nbsp;
1089
+ return Object.keys(currentModel.attributes).reduce((result, attributeName) =&gt; {
1090
+ const attribute = currentModel.attributes[attributeName];
1091
+ const value = data[attributeName];
1092
+ &nbsp;
1093
+ if (isNil(value)) {
1094
+ return result;
1095
+ }
1096
+ &nbsp;
1097
+ switch (attribute.type) {
1098
+ case 'relation':
1099
+ case 'media': {
1100
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (attribute.relation === 'morphToMany' || attribute.relation === 'morphToOne') {
1101
+ // TODO: handle polymorphic relations
1102
+ <span class="cstat-no" title="statement not covered" > break;</span>
1103
+ }
1104
+ &nbsp;
1105
+ const target = attribute.type === 'media' ? 'plugin::upload.file' : attribute.target;
1106
+ // As there are multiple formats supported for associating relations
1107
+ // with an entity, the value here can be an: array, object or number.
1108
+ let source;
1109
+ if (Array.isArray(value)) {
1110
+ source = value;
1111
+ } else if (isObject(value)) {
1112
+ source = value.connect ?? value.set ?? <span class="branch-2 cbranch-no" title="branch not covered" >[];</span>
1113
+ } else {
1114
+ source = castArray(value);
1115
+ }
1116
+ const idArray = source.map((v) =&gt; ({ id: v.id || v }));
1117
+ &nbsp;
1118
+ // Update the relationStore to keep track of all associations being made
1119
+ // with relations and media.
1120
+ result[target] = result[target] || [];
1121
+ result[target].push(...idArray);
1122
+ break;
1123
+ }
1124
+ case 'component': {
1125
+ return castArray(value).reduce((relationsStore, componentValue) =&gt; {
1126
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!attribute.component) {
1127
+ <span class="cstat-no" title="statement not covered" > throw new ValidationError(</span>
1128
+ `Cannot build relations store from component, component identifier is undefined`
1129
+ );
1130
+ }
1131
+ &nbsp;
1132
+ return mergeWith(
1133
+ relationsStore,
1134
+ buildRelationsStore({
1135
+ uid: attribute.component,
1136
+ data: componentValue,
1137
+ }),
1138
+ (objValue, srcValue) =&gt; {
1139
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (isArray(objValue)) {
1140
+ <span class="cstat-no" title="statement not covered" > return objValue.concat(srcValue);</span>
1141
+ }
1142
+ }
1143
+ );
1144
+ }, result);
1145
+ }
1146
+ case 'dynamiczone': {
1147
+ return value.reduce((relationsStore, dzValue) =&gt; {
1148
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!dzValue.__component) {
1149
+ <span class="cstat-no" title="statement not covered" > throw new ValidationError(</span>
1150
+ `Cannot build relations store from dynamiczone, component identifier is undefined`
1151
+ );
1152
+ }
1153
+ &nbsp;
1154
+ return mergeWith(
1155
+ relationsStore,
1156
+ buildRelationsStore({
1157
+ uid: dzValue.__component,
1158
+ data: dzValue,
1159
+ }),
1160
+ (objValue, srcValue) =&gt; {
1161
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (isArray(objValue)) {
1162
+ <span class="cstat-no" title="statement not covered" > return objValue.concat(srcValue);</span>
1163
+ }
1164
+ }
1165
+ );
1166
+ }, result);
1167
+ }
1168
+ default:
1169
+ break;
1170
+ }
1171
+ &nbsp;
1172
+ return result;
1173
+ }, {});
1174
+ };
1175
+ &nbsp;
1176
+ /**
1177
+ * Iterate through the relations store and validates that every relation or media
1178
+ * mentioned exists
1179
+ */
1180
+ const checkRelationsExist = async (relationsStore = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> =&gt; {
1181
+ const promises = [];
1182
+ &nbsp;
1183
+ for (const [key, value] of Object.entries(relationsStore)) {
1184
+ const evaluate = async () =&gt; {
1185
+ const uniqueValues = uniqBy(value, `id`);
1186
+ const count = await strapi.db.query(key).count({
1187
+ where: {
1188
+ id: {
1189
+ $in: uniqueValues.map((v) =&gt; v.id),
1190
+ },
1191
+ },
1192
+ });
1193
+ &nbsp;
1194
+ if (count !== uniqueValues.length) {
1195
+ throw new ValidationError(
1196
+ `${
1197
+ uniqueValues.length - count
1198
+ } relation(s) of type ${key} associated with this entity do not exist`
1199
+ );
1200
+ }
1201
+ };
1202
+ promises.push(evaluate());
1203
+ }
1204
+ &nbsp;
1205
+ return Promise.all(promises);
1206
+ };
1207
+ &nbsp;
1208
+ module.exports = {
1209
+ validateEntityCreation: createValidateEntity('creation'),
1210
+ validateEntityUpdate: createValidateEntity('update'),
1211
+ };
1212
+ &nbsp;</pre></td></tr></table></pre>
1213
+
1214
+ <div class='push'></div><!-- for sticky footer -->
1215
+ </div><!-- /wrapper -->
1216
+ <div class='footer quiet pad2 space-top1 center small'>
1217
+ Code coverage generated by
1218
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1219
+ at 2023-03-15T08:52:47.190Z
1220
+ </div>
1221
+ <script src="../../prettify.js"></script>
1222
+ <script>
1223
+ window.onload = function () {
1224
+ prettyPrint();
1225
+ };
1226
+ </script>
1227
+ <script src="../../sorter.js"></script>
1228
+ <script src="../../block-navigation.js"></script>
1229
+ </body>
1230
+ </html>
1231
+