takos-actions-engine 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +3477 -0
- package/coverage/coverage-final.json +20 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +176 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/context/base.ts.html +1792 -0
- package/coverage/src/context/env.ts.html +1243 -0
- package/coverage/src/context/index.html +161 -0
- package/coverage/src/context/index.ts.html +229 -0
- package/coverage/src/context/secrets.ts.html +1276 -0
- package/coverage/src/index.html +131 -0
- package/coverage/src/index.ts.html +502 -0
- package/coverage/src/parser/expression.ts.html +2854 -0
- package/coverage/src/parser/index.html +161 -0
- package/coverage/src/parser/index.ts.html +163 -0
- package/coverage/src/parser/validator.ts.html +1588 -0
- package/coverage/src/parser/workflow.ts.html +616 -0
- package/coverage/src/scheduler/dependency.ts.html +1138 -0
- package/coverage/src/scheduler/index.html +221 -0
- package/coverage/src/scheduler/index.ts.html +214 -0
- package/coverage/src/scheduler/job-context.ts.html +265 -0
- package/coverage/src/scheduler/job-policy.ts.html +559 -0
- package/coverage/src/scheduler/job.ts.html +1816 -0
- package/coverage/src/scheduler/listener-registry.ts.html +199 -0
- package/coverage/src/scheduler/step.ts.html +2206 -0
- package/coverage/src/scheduler/steps-context.ts.html +217 -0
- package/coverage/src/types.ts.html +1897 -0
- package/coverage/src/utils/index.html +116 -0
- package/coverage/src/utils/needs.ts.html +127 -0
- package/dist/__tests__/context/env.test.d.ts +2 -0
- package/dist/__tests__/context/env.test.d.ts.map +1 -0
- package/dist/__tests__/context/env.test.js +28 -0
- package/dist/__tests__/context/env.test.js.map +1 -0
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/index.test.js +50 -0
- package/dist/__tests__/index.test.js.map +1 -0
- package/dist/__tests__/parser/expression.test.d.ts +2 -0
- package/dist/__tests__/parser/expression.test.d.ts.map +1 -0
- package/dist/__tests__/parser/expression.test.js +116 -0
- package/dist/__tests__/parser/expression.test.js.map +1 -0
- package/dist/__tests__/parser/workflow.test.d.ts +2 -0
- package/dist/__tests__/parser/workflow.test.d.ts.map +1 -0
- package/dist/__tests__/parser/workflow.test.js +134 -0
- package/dist/__tests__/parser/workflow.test.js.map +1 -0
- package/dist/__tests__/scheduler/dependency.test.d.ts +2 -0
- package/dist/__tests__/scheduler/dependency.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler/dependency.test.js +41 -0
- package/dist/__tests__/scheduler/dependency.test.js.map +1 -0
- package/dist/__tests__/scheduler/job-context.test.d.ts +2 -0
- package/dist/__tests__/scheduler/job-context.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler/job-context.test.js +108 -0
- package/dist/__tests__/scheduler/job-context.test.js.map +1 -0
- package/dist/__tests__/scheduler/job-policy.test.d.ts +2 -0
- package/dist/__tests__/scheduler/job-policy.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler/job-policy.test.js +159 -0
- package/dist/__tests__/scheduler/job-policy.test.js.map +1 -0
- package/dist/__tests__/scheduler/job.test.d.ts +2 -0
- package/dist/__tests__/scheduler/job.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler/job.test.js +826 -0
- package/dist/__tests__/scheduler/job.test.js.map +1 -0
- package/dist/__tests__/scheduler/listener-registry.test.d.ts +2 -0
- package/dist/__tests__/scheduler/listener-registry.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler/listener-registry.test.js +79 -0
- package/dist/__tests__/scheduler/listener-registry.test.js.map +1 -0
- package/dist/__tests__/scheduler/step.test.d.ts +2 -0
- package/dist/__tests__/scheduler/step.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler/step.test.js +209 -0
- package/dist/__tests__/scheduler/step.test.js.map +1 -0
- package/dist/__tests__/scheduler/steps-context.test.d.ts +2 -0
- package/dist/__tests__/scheduler/steps-context.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler/steps-context.test.js +43 -0
- package/dist/__tests__/scheduler/steps-context.test.js.map +1 -0
- package/dist/constants.d.ts +47 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +53 -0
- package/dist/constants.js.map +1 -0
- package/dist/context.d.ts +37 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +105 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/evaluator-builtins.d.ts +14 -0
- package/dist/parser/evaluator-builtins.d.ts.map +1 -0
- package/dist/parser/evaluator-builtins.js +258 -0
- package/dist/parser/evaluator-builtins.js.map +1 -0
- package/dist/parser/evaluator.d.ts +38 -0
- package/dist/parser/evaluator.d.ts.map +1 -0
- package/dist/parser/evaluator.js +257 -0
- package/dist/parser/evaluator.js.map +1 -0
- package/dist/parser/expression.d.ts +20 -0
- package/dist/parser/expression.d.ts.map +1 -0
- package/dist/parser/expression.js +128 -0
- package/dist/parser/expression.js.map +1 -0
- package/dist/parser/tokenizer.d.ts +26 -0
- package/dist/parser/tokenizer.d.ts.map +1 -0
- package/dist/parser/tokenizer.js +162 -0
- package/dist/parser/tokenizer.js.map +1 -0
- package/dist/parser/validator.d.ts +13 -0
- package/dist/parser/validator.d.ts.map +1 -0
- package/dist/parser/validator.js +383 -0
- package/dist/parser/validator.js.map +1 -0
- package/dist/parser/workflow.d.ts +30 -0
- package/dist/parser/workflow.d.ts.map +1 -0
- package/dist/parser/workflow.js +152 -0
- package/dist/parser/workflow.js.map +1 -0
- package/dist/scheduler/dependency.d.ts +37 -0
- package/dist/scheduler/dependency.d.ts.map +1 -0
- package/dist/scheduler/dependency.js +133 -0
- package/dist/scheduler/dependency.js.map +1 -0
- package/dist/scheduler/job-policy.d.ts +23 -0
- package/dist/scheduler/job-policy.d.ts.map +1 -0
- package/dist/scheduler/job-policy.js +117 -0
- package/dist/scheduler/job-policy.js.map +1 -0
- package/dist/scheduler/job.d.ts +151 -0
- package/dist/scheduler/job.d.ts.map +1 -0
- package/dist/scheduler/job.js +348 -0
- package/dist/scheduler/job.js.map +1 -0
- package/dist/scheduler/step-output-parser.d.ts +14 -0
- package/dist/scheduler/step-output-parser.d.ts.map +1 -0
- package/dist/scheduler/step-output-parser.js +70 -0
- package/dist/scheduler/step-output-parser.js.map +1 -0
- package/dist/scheduler/step.d.ts +74 -0
- package/dist/scheduler/step.d.ts.map +1 -0
- package/dist/scheduler/step.js +387 -0
- package/dist/scheduler/step.js.map +1 -0
- package/dist/types.d.ts +499 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/workflow-models.d.ts +504 -0
- package/dist/workflow-models.d.ts.map +1 -0
- package/dist/workflow-models.js +5 -0
- package/dist/workflow-models.js.map +1 -0
- package/package.json +29 -0
- package/src/__tests__/context/env.test.ts +38 -0
- package/src/__tests__/index.test.ts +55 -0
- package/src/__tests__/parser/expression.test.ts +151 -0
- package/src/__tests__/parser/workflow.test.ts +151 -0
- package/src/__tests__/scheduler/dependency.test.ts +51 -0
- package/src/__tests__/scheduler/job-context.test.ts +119 -0
- package/src/__tests__/scheduler/job-policy.test.ts +195 -0
- package/src/__tests__/scheduler/job.test.ts +1014 -0
- package/src/__tests__/scheduler/listener-registry.test.ts +95 -0
- package/src/__tests__/scheduler/step.test.ts +258 -0
- package/src/__tests__/scheduler/steps-context.test.ts +49 -0
- package/src/constants.ts +61 -0
- package/src/context.ts +153 -0
- package/src/index.ts +64 -0
- package/src/parser/evaluator-builtins.ts +315 -0
- package/src/parser/evaluator.ts +333 -0
- package/src/parser/expression.ts +154 -0
- package/src/parser/tokenizer.ts +191 -0
- package/src/parser/validator.ts +444 -0
- package/src/parser/workflow.ts +176 -0
- package/src/scheduler/dependency.ts +180 -0
- package/src/scheduler/job-policy.ts +198 -0
- package/src/scheduler/job.ts +523 -0
- package/src/scheduler/step-output-parser.ts +94 -0
- package/src/scheduler/step.ts +543 -0
- package/src/workflow-models.ts +593 -0
- package/tsconfig.json +14 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,1138 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/scheduler/dependency.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/scheduler</a> dependency.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">36.9% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>86/233</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">69.23% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>18/26</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">30.76% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>4/13</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">36.9% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>86/233</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line low'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
418
|
+
<span class="cline-any cline-neutral"> </span>
|
|
419
|
+
<span class="cline-any cline-neutral"> </span>
|
|
420
|
+
<span class="cline-any cline-neutral"> </span>
|
|
421
|
+
<span class="cline-any cline-neutral"> </span>
|
|
422
|
+
<span class="cline-any cline-neutral"> </span>
|
|
423
|
+
<span class="cline-any cline-neutral"> </span>
|
|
424
|
+
<span class="cline-any cline-neutral"> </span>
|
|
425
|
+
<span class="cline-any cline-neutral"> </span>
|
|
426
|
+
<span class="cline-any cline-yes">1x</span>
|
|
427
|
+
<span class="cline-any cline-yes">1x</span>
|
|
428
|
+
<span class="cline-any cline-no"> </span>
|
|
429
|
+
<span class="cline-any cline-no"> </span>
|
|
430
|
+
<span class="cline-any cline-no"> </span>
|
|
431
|
+
<span class="cline-any cline-no"> </span>
|
|
432
|
+
<span class="cline-any cline-no"> </span>
|
|
433
|
+
<span class="cline-any cline-no"> </span>
|
|
434
|
+
<span class="cline-any cline-yes">1x</span>
|
|
435
|
+
<span class="cline-any cline-neutral"> </span>
|
|
436
|
+
<span class="cline-any cline-neutral"> </span>
|
|
437
|
+
<span class="cline-any cline-neutral"> </span>
|
|
438
|
+
<span class="cline-any cline-neutral"> </span>
|
|
439
|
+
<span class="cline-any cline-neutral"> </span>
|
|
440
|
+
<span class="cline-any cline-neutral"> </span>
|
|
441
|
+
<span class="cline-any cline-neutral"> </span>
|
|
442
|
+
<span class="cline-any cline-neutral"> </span>
|
|
443
|
+
<span class="cline-any cline-neutral"> </span>
|
|
444
|
+
<span class="cline-any cline-neutral"> </span>
|
|
445
|
+
<span class="cline-any cline-neutral"> </span>
|
|
446
|
+
<span class="cline-any cline-neutral"> </span>
|
|
447
|
+
<span class="cline-any cline-neutral"> </span>
|
|
448
|
+
<span class="cline-any cline-neutral"> </span>
|
|
449
|
+
<span class="cline-any cline-neutral"> </span>
|
|
450
|
+
<span class="cline-any cline-neutral"> </span>
|
|
451
|
+
<span class="cline-any cline-yes">1x</span>
|
|
452
|
+
<span class="cline-any cline-yes">20x</span>
|
|
453
|
+
<span class="cline-any cline-yes">20x</span>
|
|
454
|
+
<span class="cline-any cline-yes">20x</span>
|
|
455
|
+
<span class="cline-any cline-neutral"> </span>
|
|
456
|
+
<span class="cline-any cline-neutral"> </span>
|
|
457
|
+
<span class="cline-any cline-yes">20x</span>
|
|
458
|
+
<span class="cline-any cline-yes">28x</span>
|
|
459
|
+
<span class="cline-any cline-yes">28x</span>
|
|
460
|
+
<span class="cline-any cline-yes">28x</span>
|
|
461
|
+
<span class="cline-any cline-yes">28x</span>
|
|
462
|
+
<span class="cline-any cline-neutral"> </span>
|
|
463
|
+
<span class="cline-any cline-neutral"> </span>
|
|
464
|
+
<span class="cline-any cline-yes">20x</span>
|
|
465
|
+
<span class="cline-any cline-yes">28x</span>
|
|
466
|
+
<span class="cline-any cline-yes">28x</span>
|
|
467
|
+
<span class="cline-any cline-yes">5x</span>
|
|
468
|
+
<span class="cline-any cline-no"> </span>
|
|
469
|
+
<span class="cline-any cline-no"> </span>
|
|
470
|
+
<span class="cline-any cline-no"> </span>
|
|
471
|
+
<span class="cline-any cline-no"> </span>
|
|
472
|
+
<span class="cline-any cline-no"> </span>
|
|
473
|
+
<span class="cline-any cline-yes">5x</span>
|
|
474
|
+
<span class="cline-any cline-yes">5x</span>
|
|
475
|
+
<span class="cline-any cline-yes">5x</span>
|
|
476
|
+
<span class="cline-any cline-yes">28x</span>
|
|
477
|
+
<span class="cline-any cline-neutral"> </span>
|
|
478
|
+
<span class="cline-any cline-yes">20x</span>
|
|
479
|
+
<span class="cline-any cline-yes">20x</span>
|
|
480
|
+
<span class="cline-any cline-neutral"> </span>
|
|
481
|
+
<span class="cline-any cline-neutral"> </span>
|
|
482
|
+
<span class="cline-any cline-neutral"> </span>
|
|
483
|
+
<span class="cline-any cline-neutral"> </span>
|
|
484
|
+
<span class="cline-any cline-neutral"> </span>
|
|
485
|
+
<span class="cline-any cline-yes">1x</span>
|
|
486
|
+
<span class="cline-any cline-yes">38x</span>
|
|
487
|
+
<span class="cline-any cline-yes">38x</span>
|
|
488
|
+
<span class="cline-any cline-yes">38x</span>
|
|
489
|
+
<span class="cline-any cline-neutral"> </span>
|
|
490
|
+
<span class="cline-any cline-yes">38x</span>
|
|
491
|
+
<span class="cline-any cline-yes">58x</span>
|
|
492
|
+
<span class="cline-any cline-yes">58x</span>
|
|
493
|
+
<span class="cline-any cline-yes">58x</span>
|
|
494
|
+
<span class="cline-any cline-neutral"> </span>
|
|
495
|
+
<span class="cline-any cline-yes">58x</span>
|
|
496
|
+
<span class="cline-any cline-yes">58x</span>
|
|
497
|
+
<span class="cline-any cline-yes">14x</span>
|
|
498
|
+
<span class="cline-any cline-no"> </span>
|
|
499
|
+
<span class="cline-any cline-no"> </span>
|
|
500
|
+
<span class="cline-any cline-yes">14x</span>
|
|
501
|
+
<span class="cline-any cline-neutral"> </span>
|
|
502
|
+
<span class="cline-any cline-no"> </span>
|
|
503
|
+
<span class="cline-any cline-no"> </span>
|
|
504
|
+
<span class="cline-any cline-no"> </span>
|
|
505
|
+
<span class="cline-any cline-yes">14x</span>
|
|
506
|
+
<span class="cline-any cline-neutral"> </span>
|
|
507
|
+
<span class="cline-any cline-yes">58x</span>
|
|
508
|
+
<span class="cline-any cline-yes">58x</span>
|
|
509
|
+
<span class="cline-any cline-yes">58x</span>
|
|
510
|
+
<span class="cline-any cline-yes">58x</span>
|
|
511
|
+
<span class="cline-any cline-neutral"> </span>
|
|
512
|
+
<span class="cline-any cline-yes">38x</span>
|
|
513
|
+
<span class="cline-any cline-yes">58x</span>
|
|
514
|
+
<span class="cline-any cline-yes">58x</span>
|
|
515
|
+
<span class="cline-any cline-yes">58x</span>
|
|
516
|
+
<span class="cline-any cline-yes">58x</span>
|
|
517
|
+
<span class="cline-any cline-yes">58x</span>
|
|
518
|
+
<span class="cline-any cline-neutral"> </span>
|
|
519
|
+
<span class="cline-any cline-yes">38x</span>
|
|
520
|
+
<span class="cline-any cline-yes">38x</span>
|
|
521
|
+
<span class="cline-any cline-neutral"> </span>
|
|
522
|
+
<span class="cline-any cline-neutral"> </span>
|
|
523
|
+
<span class="cline-any cline-neutral"> </span>
|
|
524
|
+
<span class="cline-any cline-neutral"> </span>
|
|
525
|
+
<span class="cline-any cline-yes">1x</span>
|
|
526
|
+
<span class="cline-any cline-no"> </span>
|
|
527
|
+
<span class="cline-any cline-no"> </span>
|
|
528
|
+
<span class="cline-any cline-no"> </span>
|
|
529
|
+
<span class="cline-any cline-no"> </span>
|
|
530
|
+
<span class="cline-any cline-no"> </span>
|
|
531
|
+
<span class="cline-any cline-neutral"> </span>
|
|
532
|
+
<span class="cline-any cline-no"> </span>
|
|
533
|
+
<span class="cline-any cline-no"> </span>
|
|
534
|
+
<span class="cline-any cline-no"> </span>
|
|
535
|
+
<span class="cline-any cline-no"> </span>
|
|
536
|
+
<span class="cline-any cline-no"> </span>
|
|
537
|
+
<span class="cline-any cline-no"> </span>
|
|
538
|
+
<span class="cline-any cline-no"> </span>
|
|
539
|
+
<span class="cline-any cline-no"> </span>
|
|
540
|
+
<span class="cline-any cline-neutral"> </span>
|
|
541
|
+
<span class="cline-any cline-no"> </span>
|
|
542
|
+
<span class="cline-any cline-no"> </span>
|
|
543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
544
|
+
<span class="cline-any cline-neutral"> </span>
|
|
545
|
+
<span class="cline-any cline-neutral"> </span>
|
|
546
|
+
<span class="cline-any cline-neutral"> </span>
|
|
547
|
+
<span class="cline-any cline-yes">1x</span>
|
|
548
|
+
<span class="cline-any cline-no"> </span>
|
|
549
|
+
<span class="cline-any cline-no"> </span>
|
|
550
|
+
<span class="cline-any cline-no"> </span>
|
|
551
|
+
<span class="cline-any cline-no"> </span>
|
|
552
|
+
<span class="cline-any cline-no"> </span>
|
|
553
|
+
<span class="cline-any cline-neutral"> </span>
|
|
554
|
+
<span class="cline-any cline-no"> </span>
|
|
555
|
+
<span class="cline-any cline-no"> </span>
|
|
556
|
+
<span class="cline-any cline-no"> </span>
|
|
557
|
+
<span class="cline-any cline-no"> </span>
|
|
558
|
+
<span class="cline-any cline-no"> </span>
|
|
559
|
+
<span class="cline-any cline-no"> </span>
|
|
560
|
+
<span class="cline-any cline-no"> </span>
|
|
561
|
+
<span class="cline-any cline-no"> </span>
|
|
562
|
+
<span class="cline-any cline-neutral"> </span>
|
|
563
|
+
<span class="cline-any cline-no"> </span>
|
|
564
|
+
<span class="cline-any cline-no"> </span>
|
|
565
|
+
<span class="cline-any cline-neutral"> </span>
|
|
566
|
+
<span class="cline-any cline-neutral"> </span>
|
|
567
|
+
<span class="cline-any cline-neutral"> </span>
|
|
568
|
+
<span class="cline-any cline-neutral"> </span>
|
|
569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
570
|
+
<span class="cline-any cline-yes">1x</span>
|
|
571
|
+
<span class="cline-any cline-neutral"> </span>
|
|
572
|
+
<span class="cline-any cline-no"> </span>
|
|
573
|
+
<span class="cline-any cline-no"> </span>
|
|
574
|
+
<span class="cline-any cline-no"> </span>
|
|
575
|
+
<span class="cline-any cline-no"> </span>
|
|
576
|
+
<span class="cline-any cline-no"> </span>
|
|
577
|
+
<span class="cline-any cline-no"> </span>
|
|
578
|
+
<span class="cline-any cline-no"> </span>
|
|
579
|
+
<span class="cline-any cline-neutral"> </span>
|
|
580
|
+
<span class="cline-any cline-no"> </span>
|
|
581
|
+
<span class="cline-any cline-no"> </span>
|
|
582
|
+
<span class="cline-any cline-neutral"> </span>
|
|
583
|
+
<span class="cline-any cline-no"> </span>
|
|
584
|
+
<span class="cline-any cline-no"> </span>
|
|
585
|
+
<span class="cline-any cline-no"> </span>
|
|
586
|
+
<span class="cline-any cline-neutral"> </span>
|
|
587
|
+
<span class="cline-any cline-neutral"> </span>
|
|
588
|
+
<span class="cline-any cline-no"> </span>
|
|
589
|
+
<span class="cline-any cline-no"> </span>
|
|
590
|
+
<span class="cline-any cline-no"> </span>
|
|
591
|
+
<span class="cline-any cline-no"> </span>
|
|
592
|
+
<span class="cline-any cline-neutral"> </span>
|
|
593
|
+
<span class="cline-any cline-no"> </span>
|
|
594
|
+
<span class="cline-any cline-no"> </span>
|
|
595
|
+
<span class="cline-any cline-neutral"> </span>
|
|
596
|
+
<span class="cline-any cline-no"> </span>
|
|
597
|
+
<span class="cline-any cline-no"> </span>
|
|
598
|
+
<span class="cline-any cline-no"> </span>
|
|
599
|
+
<span class="cline-any cline-neutral"> </span>
|
|
600
|
+
<span class="cline-any cline-no"> </span>
|
|
601
|
+
<span class="cline-any cline-no"> </span>
|
|
602
|
+
<span class="cline-any cline-neutral"> </span>
|
|
603
|
+
<span class="cline-any cline-neutral"> </span>
|
|
604
|
+
<span class="cline-any cline-neutral"> </span>
|
|
605
|
+
<span class="cline-any cline-neutral"> </span>
|
|
606
|
+
<span class="cline-any cline-neutral"> </span>
|
|
607
|
+
<span class="cline-any cline-yes">1x</span>
|
|
608
|
+
<span class="cline-any cline-neutral"> </span>
|
|
609
|
+
<span class="cline-any cline-yes">19x</span>
|
|
610
|
+
<span class="cline-any cline-yes">19x</span>
|
|
611
|
+
<span class="cline-any cline-no"> </span>
|
|
612
|
+
<span class="cline-any cline-no"> </span>
|
|
613
|
+
<span class="cline-any cline-no"> </span>
|
|
614
|
+
<span class="cline-any cline-no"> </span>
|
|
615
|
+
<span class="cline-any cline-no"> </span>
|
|
616
|
+
<span class="cline-any cline-neutral"> </span>
|
|
617
|
+
<span class="cline-any cline-yes">19x</span>
|
|
618
|
+
<span class="cline-any cline-yes">19x</span>
|
|
619
|
+
<span class="cline-any cline-neutral"> </span>
|
|
620
|
+
<span class="cline-any cline-yes">19x</span>
|
|
621
|
+
<span class="cline-any cline-yes">26x</span>
|
|
622
|
+
<span class="cline-any cline-neutral"> </span>
|
|
623
|
+
<span class="cline-any cline-yes">26x</span>
|
|
624
|
+
<span class="cline-any cline-yes">44x</span>
|
|
625
|
+
<span class="cline-any cline-neutral"> </span>
|
|
626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
627
|
+
<span class="cline-any cline-yes">44x</span>
|
|
628
|
+
<span class="cline-any cline-yes">44x</span>
|
|
629
|
+
<span class="cline-any cline-yes">44x</span>
|
|
630
|
+
<span class="cline-any cline-yes">14x</span>
|
|
631
|
+
<span class="cline-any cline-yes">7x</span>
|
|
632
|
+
<span class="cline-any cline-yes">7x</span>
|
|
633
|
+
<span class="cline-any cline-yes">7x</span>
|
|
634
|
+
<span class="cline-any cline-yes">14x</span>
|
|
635
|
+
<span class="cline-any cline-neutral"> </span>
|
|
636
|
+
<span class="cline-any cline-yes">44x</span>
|
|
637
|
+
<span class="cline-any cline-yes">29x</span>
|
|
638
|
+
<span class="cline-any cline-yes">29x</span>
|
|
639
|
+
<span class="cline-any cline-yes">44x</span>
|
|
640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
641
|
+
<span class="cline-any cline-yes">26x</span>
|
|
642
|
+
<span class="cline-any cline-neutral"> </span>
|
|
643
|
+
<span class="cline-any cline-no"> </span>
|
|
644
|
+
<span class="cline-any cline-no"> </span>
|
|
645
|
+
<span class="cline-any cline-neutral"> </span>
|
|
646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
647
|
+
<span class="cline-any cline-yes">26x</span>
|
|
648
|
+
<span class="cline-any cline-yes">26x</span>
|
|
649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
650
|
+
<span class="cline-any cline-yes">26x</span>
|
|
651
|
+
<span class="cline-any cline-yes">29x</span>
|
|
652
|
+
<span class="cline-any cline-yes">29x</span>
|
|
653
|
+
<span class="cline-any cline-yes">26x</span>
|
|
654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
655
|
+
<span class="cline-any cline-yes">19x</span>
|
|
656
|
+
<span class="cline-any cline-yes">19x</span>
|
|
657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
659
|
+
<span class="cline-any cline-neutral"> </span>
|
|
660
|
+
<span class="cline-any cline-neutral"> </span>
|
|
661
|
+
<span class="cline-any cline-yes">1x</span>
|
|
662
|
+
<span class="cline-any cline-no"> </span>
|
|
663
|
+
<span class="cline-any cline-neutral"> </span>
|
|
664
|
+
<span class="cline-any cline-no"> </span>
|
|
665
|
+
<span class="cline-any cline-no"> </span>
|
|
666
|
+
<span class="cline-any cline-no"> </span>
|
|
667
|
+
<span class="cline-any cline-no"> </span>
|
|
668
|
+
<span class="cline-any cline-no"> </span>
|
|
669
|
+
<span class="cline-any cline-no"> </span>
|
|
670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
671
|
+
<span class="cline-any cline-no"> </span>
|
|
672
|
+
<span class="cline-any cline-no"> </span>
|
|
673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
674
|
+
<span class="cline-any cline-neutral"> </span>
|
|
675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
677
|
+
<span class="cline-any cline-yes">1x</span>
|
|
678
|
+
<span class="cline-any cline-no"> </span>
|
|
679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
680
|
+
<span class="cline-any cline-no"> </span>
|
|
681
|
+
<span class="cline-any cline-no"> </span>
|
|
682
|
+
<span class="cline-any cline-no"> </span>
|
|
683
|
+
<span class="cline-any cline-no"> </span>
|
|
684
|
+
<span class="cline-any cline-no"> </span>
|
|
685
|
+
<span class="cline-any cline-no"> </span>
|
|
686
|
+
<span class="cline-any cline-neutral"> </span>
|
|
687
|
+
<span class="cline-any cline-no"> </span>
|
|
688
|
+
<span class="cline-any cline-no"> </span>
|
|
689
|
+
<span class="cline-any cline-neutral"> </span>
|
|
690
|
+
<span class="cline-any cline-neutral"> </span>
|
|
691
|
+
<span class="cline-any cline-neutral"> </span>
|
|
692
|
+
<span class="cline-any cline-neutral"> </span>
|
|
693
|
+
<span class="cline-any cline-yes">1x</span>
|
|
694
|
+
<span class="cline-any cline-no"> </span>
|
|
695
|
+
<span class="cline-any cline-no"> </span>
|
|
696
|
+
<span class="cline-any cline-no"> </span>
|
|
697
|
+
<span class="cline-any cline-no"> </span>
|
|
698
|
+
<span class="cline-any cline-no"> </span>
|
|
699
|
+
<span class="cline-any cline-no"> </span>
|
|
700
|
+
<span class="cline-any cline-no"> </span>
|
|
701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
704
|
+
<span class="cline-any cline-neutral"> </span>
|
|
705
|
+
<span class="cline-any cline-yes">1x</span>
|
|
706
|
+
<span class="cline-any cline-no"> </span>
|
|
707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
708
|
+
<span class="cline-any cline-no"> </span>
|
|
709
|
+
<span class="cline-any cline-no"> </span>
|
|
710
|
+
<span class="cline-any cline-no"> </span>
|
|
711
|
+
<span class="cline-any cline-no"> </span>
|
|
712
|
+
<span class="cline-any cline-neutral"> </span>
|
|
713
|
+
<span class="cline-any cline-no"> </span>
|
|
714
|
+
<span class="cline-any cline-no"> </span>
|
|
715
|
+
<span class="cline-any cline-no"> </span>
|
|
716
|
+
<span class="cline-any cline-no"> </span>
|
|
717
|
+
<span class="cline-any cline-no"> </span>
|
|
718
|
+
<span class="cline-any cline-neutral"> </span>
|
|
719
|
+
<span class="cline-any cline-no"> </span>
|
|
720
|
+
<span class="cline-any cline-no"> </span>
|
|
721
|
+
<span class="cline-any cline-no"> </span>
|
|
722
|
+
<span class="cline-any cline-no"> </span>
|
|
723
|
+
<span class="cline-any cline-no"> </span>
|
|
724
|
+
<span class="cline-any cline-no"> </span>
|
|
725
|
+
<span class="cline-any cline-no"> </span>
|
|
726
|
+
<span class="cline-any cline-neutral"> </span>
|
|
727
|
+
<span class="cline-any cline-no"> </span>
|
|
728
|
+
<span class="cline-any cline-no"> </span>
|
|
729
|
+
<span class="cline-any cline-no"> </span>
|
|
730
|
+
<span class="cline-any cline-no"> </span>
|
|
731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
733
|
+
<span class="cline-any cline-no"> </span>
|
|
734
|
+
<span class="cline-any cline-no"> </span>
|
|
735
|
+
<span class="cline-any cline-neutral"> </span>
|
|
736
|
+
<span class="cline-any cline-no"> </span>
|
|
737
|
+
<span class="cline-any cline-no"> </span>
|
|
738
|
+
<span class="cline-any cline-no"> </span>
|
|
739
|
+
<span class="cline-any cline-no"> </span>
|
|
740
|
+
<span class="cline-any cline-no"> </span>
|
|
741
|
+
<span class="cline-any cline-no"> </span>
|
|
742
|
+
<span class="cline-any cline-neutral"> </span>
|
|
743
|
+
<span class="cline-any cline-no"> </span>
|
|
744
|
+
<span class="cline-any cline-no"> </span>
|
|
745
|
+
<span class="cline-any cline-neutral"> </span>
|
|
746
|
+
<span class="cline-any cline-neutral"> </span>
|
|
747
|
+
<span class="cline-any cline-neutral"> </span>
|
|
748
|
+
<span class="cline-any cline-neutral"> </span>
|
|
749
|
+
<span class="cline-any cline-yes">1x</span>
|
|
750
|
+
<span class="cline-any cline-no"> </span>
|
|
751
|
+
<span class="cline-any cline-no"> </span>
|
|
752
|
+
<span class="cline-any cline-neutral"> </span>
|
|
753
|
+
<span class="cline-any cline-no"> </span>
|
|
754
|
+
<span class="cline-any cline-no"> </span>
|
|
755
|
+
<span class="cline-any cline-neutral"> </span>
|
|
756
|
+
<span class="cline-any cline-no"> </span>
|
|
757
|
+
<span class="cline-any cline-no"> </span>
|
|
758
|
+
<span class="cline-any cline-no"> </span>
|
|
759
|
+
<span class="cline-any cline-no"> </span>
|
|
760
|
+
<span class="cline-any cline-no"> </span>
|
|
761
|
+
<span class="cline-any cline-no"> </span>
|
|
762
|
+
<span class="cline-any cline-no"> </span>
|
|
763
|
+
<span class="cline-any cline-no"> </span>
|
|
764
|
+
<span class="cline-any cline-no"> </span>
|
|
765
|
+
<span class="cline-any cline-neutral"> </span>
|
|
766
|
+
<span class="cline-any cline-no"> </span>
|
|
767
|
+
<span class="cline-any cline-no"> </span>
|
|
768
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
769
|
+
* Dependency resolution using DAG (Directed Acyclic Graph)
|
|
770
|
+
*/
|
|
771
|
+
import type { Workflow } from '../types.js';
|
|
772
|
+
import { normalizeNeedsInput } from '../utils/needs.js';
|
|
773
|
+
|
|
774
|
+
/**
|
|
775
|
+
* Error thrown when dependency resolution fails
|
|
776
|
+
*/
|
|
777
|
+
export class DependencyError extends Error {
|
|
778
|
+
<span class="fstat-no" title="function not covered" > constructor(</span>
|
|
779
|
+
<span class="cstat-no" title="statement not covered" > message: string,</span>
|
|
780
|
+
<span class="cstat-no" title="statement not covered" > public readonly jobs?: string[]</span>
|
|
781
|
+
<span class="cstat-no" title="statement not covered" > ) {</span>
|
|
782
|
+
<span class="cstat-no" title="statement not covered" > super(message);</span>
|
|
783
|
+
<span class="cstat-no" title="statement not covered" > this.name = 'DependencyError';</span>
|
|
784
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
/**
|
|
788
|
+
* Dependency graph representation
|
|
789
|
+
*/
|
|
790
|
+
export interface DependencyGraph {
|
|
791
|
+
/** All nodes (job IDs) */
|
|
792
|
+
nodes: Set<string>;
|
|
793
|
+
/** Edges: key depends on values */
|
|
794
|
+
edges: Map<string, Set<string>>;
|
|
795
|
+
/** Reverse edges: key is required by values */
|
|
796
|
+
reverseEdges: Map<string, Set<string>>;
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
/**
|
|
800
|
+
* Build dependency graph from workflow
|
|
801
|
+
*/
|
|
802
|
+
export function buildDependencyGraph(workflow: Workflow): DependencyGraph {
|
|
803
|
+
const nodes = new Set<string>();
|
|
804
|
+
const edges = new Map<string, Set<string>>();
|
|
805
|
+
const reverseEdges = new Map<string, Set<string>>();
|
|
806
|
+
|
|
807
|
+
// Initialize all nodes
|
|
808
|
+
for (const jobId of Object.keys(workflow.jobs)) {
|
|
809
|
+
nodes.add(jobId);
|
|
810
|
+
edges.set(jobId, new Set());
|
|
811
|
+
reverseEdges.set(jobId, new Set());
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
// Build edges from 'needs' declarations
|
|
815
|
+
for (const [jobId, job] of Object.entries(workflow.jobs)) {
|
|
816
|
+
const needs = normalizeNeedsInput(job.needs);
|
|
817
|
+
for (const need of needs) {
|
|
818
|
+
if (!nodes.has(need)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
819
|
+
<span class="cstat-no" title="statement not covered" > throw new DependencyError(</span>
|
|
820
|
+
<span class="cstat-no" title="statement not covered" > `Job "${jobId}" depends on unknown job "${need}"`,</span>
|
|
821
|
+
<span class="cstat-no" title="statement not covered" > [jobId, need]</span>
|
|
822
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
823
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
824
|
+
edges.get(jobId)!.add(need);
|
|
825
|
+
reverseEdges.get(need)!.add(jobId);
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
return { nodes, edges, reverseEdges };
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
/**
|
|
833
|
+
* Detect circular dependencies in graph
|
|
834
|
+
* Returns the cycle path if found, empty array otherwise
|
|
835
|
+
*/
|
|
836
|
+
export function detectCycle(graph: DependencyGraph): string[] {
|
|
837
|
+
const visited = new Set<string>();
|
|
838
|
+
const recursionStack = new Set<string>();
|
|
839
|
+
const path: string[] = [];
|
|
840
|
+
|
|
841
|
+
function dfs(node: string): string[] | null {
|
|
842
|
+
visited.add(node);
|
|
843
|
+
recursionStack.add(node);
|
|
844
|
+
path.push(node);
|
|
845
|
+
|
|
846
|
+
const dependencies = graph.edges.get(node<span class="branch-0 cbranch-no" title="branch not covered" >) || new Set();</span>
|
|
847
|
+
for (const dep of dependencies) {
|
|
848
|
+
if (!visited.has(dep)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
849
|
+
<span class="cstat-no" title="statement not covered" > const cycle = dfs(dep);</span>
|
|
850
|
+
<span class="cstat-no" title="statement not covered" > if (cycle) return cycle;</span>
|
|
851
|
+
} else if (recursionStack.has(dep)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
852
|
+
// Found cycle - return the cycle path
|
|
853
|
+
<span class="cstat-no" title="statement not covered" > const cycleStart = path.indexOf(dep);</span>
|
|
854
|
+
<span class="cstat-no" title="statement not covered" > return [...path.slice(cycleStart), dep];</span>
|
|
855
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
path.pop();
|
|
859
|
+
recursionStack.delete(node);
|
|
860
|
+
return null;
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
for (const node of graph.nodes) {
|
|
864
|
+
if (!visited.has(node)) {
|
|
865
|
+
const cycle = dfs(node);
|
|
866
|
+
if (cycle) <span class="branch-0 cbranch-no" title="branch not covered" >return cycle;</span>
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
return [];
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
/**
|
|
874
|
+
* Get all dependencies of a job (recursive)
|
|
875
|
+
*/
|
|
876
|
+
export <span class="fstat-no" title="function not covered" >function getAllDependencies(</span>
|
|
877
|
+
<span class="cstat-no" title="statement not covered" > graph: DependencyGraph,</span>
|
|
878
|
+
<span class="cstat-no" title="statement not covered" > jobId: string</span>
|
|
879
|
+
<span class="cstat-no" title="statement not covered" >): Set<string> {</span>
|
|
880
|
+
<span class="cstat-no" title="statement not covered" > const result = new Set<string>();</span>
|
|
881
|
+
<span class="cstat-no" title="statement not covered" > const queue = [...(graph.edges.get(jobId) || [])];</span>
|
|
882
|
+
|
|
883
|
+
<span class="cstat-no" title="statement not covered" > while (queue.length > 0) {</span>
|
|
884
|
+
<span class="cstat-no" title="statement not covered" > const current = queue.shift()!;</span>
|
|
885
|
+
<span class="cstat-no" title="statement not covered" > if (!result.has(current)) {</span>
|
|
886
|
+
<span class="cstat-no" title="statement not covered" > result.add(current);</span>
|
|
887
|
+
<span class="cstat-no" title="statement not covered" > const deps = graph.edges.get(current) || new Set();</span>
|
|
888
|
+
<span class="cstat-no" title="statement not covered" > queue.push(...deps);</span>
|
|
889
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
890
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
891
|
+
|
|
892
|
+
<span class="cstat-no" title="statement not covered" > return result;</span>
|
|
893
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
894
|
+
|
|
895
|
+
/**
|
|
896
|
+
* Get all dependents of a job (jobs that depend on this job)
|
|
897
|
+
*/
|
|
898
|
+
export <span class="fstat-no" title="function not covered" >function getAllDependents(</span>
|
|
899
|
+
<span class="cstat-no" title="statement not covered" > graph: DependencyGraph,</span>
|
|
900
|
+
<span class="cstat-no" title="statement not covered" > jobId: string</span>
|
|
901
|
+
<span class="cstat-no" title="statement not covered" >): Set<string> {</span>
|
|
902
|
+
<span class="cstat-no" title="statement not covered" > const result = new Set<string>();</span>
|
|
903
|
+
<span class="cstat-no" title="statement not covered" > const queue = [...(graph.reverseEdges.get(jobId) || [])];</span>
|
|
904
|
+
|
|
905
|
+
<span class="cstat-no" title="statement not covered" > while (queue.length > 0) {</span>
|
|
906
|
+
<span class="cstat-no" title="statement not covered" > const current = queue.shift()!;</span>
|
|
907
|
+
<span class="cstat-no" title="statement not covered" > if (!result.has(current)) {</span>
|
|
908
|
+
<span class="cstat-no" title="statement not covered" > result.add(current);</span>
|
|
909
|
+
<span class="cstat-no" title="statement not covered" > const dependents = graph.reverseEdges.get(current) || new Set();</span>
|
|
910
|
+
<span class="cstat-no" title="statement not covered" > queue.push(...dependents);</span>
|
|
911
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
912
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
913
|
+
|
|
914
|
+
<span class="cstat-no" title="statement not covered" > return result;</span>
|
|
915
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
916
|
+
|
|
917
|
+
/**
|
|
918
|
+
* Topological sort of jobs
|
|
919
|
+
* Returns jobs in execution order (dependencies before dependents)
|
|
920
|
+
*/
|
|
921
|
+
export <span class="fstat-no" title="function not covered" >function topologicalSort(graph: DependencyGraph): string[] {</span>
|
|
922
|
+
// Check for cycles first
|
|
923
|
+
<span class="cstat-no" title="statement not covered" > const cycle = detectCycle(graph);</span>
|
|
924
|
+
<span class="cstat-no" title="statement not covered" > if (cycle.length > 0) {</span>
|
|
925
|
+
<span class="cstat-no" title="statement not covered" > throw new DependencyError(</span>
|
|
926
|
+
<span class="cstat-no" title="statement not covered" > `Circular dependency detected: ${cycle.join(' -> ')}`,</span>
|
|
927
|
+
<span class="cstat-no" title="statement not covered" > cycle</span>
|
|
928
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
929
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
930
|
+
|
|
931
|
+
<span class="cstat-no" title="statement not covered" > const result: string[] = [];</span>
|
|
932
|
+
<span class="cstat-no" title="statement not covered" > const visited = new Set<string>();</span>
|
|
933
|
+
|
|
934
|
+
<span class="cstat-no" title="statement not covered" > function visit(node: string): void {</span>
|
|
935
|
+
<span class="cstat-no" title="statement not covered" > if (visited.has(node)) return;</span>
|
|
936
|
+
<span class="cstat-no" title="statement not covered" > visited.add(node);</span>
|
|
937
|
+
|
|
938
|
+
// Visit dependencies first
|
|
939
|
+
<span class="cstat-no" title="statement not covered" > const dependencies = graph.edges.get(node) || new Set();</span>
|
|
940
|
+
<span class="cstat-no" title="statement not covered" > for (const dep of dependencies) {</span>
|
|
941
|
+
<span class="cstat-no" title="statement not covered" > visit(dep);</span>
|
|
942
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
943
|
+
|
|
944
|
+
<span class="cstat-no" title="statement not covered" > result.push(node);</span>
|
|
945
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
946
|
+
|
|
947
|
+
<span class="cstat-no" title="statement not covered" > for (const node of graph.nodes) {</span>
|
|
948
|
+
<span class="cstat-no" title="statement not covered" > visit(node);</span>
|
|
949
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
950
|
+
|
|
951
|
+
<span class="cstat-no" title="statement not covered" > return result;</span>
|
|
952
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
953
|
+
|
|
954
|
+
/**
|
|
955
|
+
* Group jobs into parallel execution phases
|
|
956
|
+
* Jobs in the same phase can run in parallel
|
|
957
|
+
*/
|
|
958
|
+
export function groupIntoPhases(graph: DependencyGraph): string[][] {
|
|
959
|
+
// Check for cycles first
|
|
960
|
+
const cycle = detectCycle(graph);
|
|
961
|
+
if (cycle.length > 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
962
|
+
<span class="cstat-no" title="statement not covered" > throw new DependencyError(</span>
|
|
963
|
+
<span class="cstat-no" title="statement not covered" > `Circular dependency detected: ${cycle.join(' -> ')}`,</span>
|
|
964
|
+
<span class="cstat-no" title="statement not covered" > cycle</span>
|
|
965
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
966
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
967
|
+
|
|
968
|
+
const phases: string[][] = [];
|
|
969
|
+
const assigned = new Set<string>();
|
|
970
|
+
|
|
971
|
+
while (assigned.size < graph.nodes.size) {
|
|
972
|
+
const phase: string[] = [];
|
|
973
|
+
|
|
974
|
+
for (const node of graph.nodes) {
|
|
975
|
+
if (assigned.has(node)) continue;
|
|
976
|
+
|
|
977
|
+
// Check if all dependencies are assigned
|
|
978
|
+
const dependencies = graph.edges.get(node<span class="branch-0 cbranch-no" title="branch not covered" >) || new Set();</span>
|
|
979
|
+
let canAdd = true;
|
|
980
|
+
for (const dep of dependencies) {
|
|
981
|
+
if (!assigned.has(dep)) {
|
|
982
|
+
canAdd = false;
|
|
983
|
+
break;
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
if (canAdd) {
|
|
988
|
+
phase.push(node);
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
if (phase.length === 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
993
|
+
// This should not happen if cycle detection works
|
|
994
|
+
<span class="cstat-no" title="statement not covered" > throw new DependencyError('Unable to resolve dependencies');</span>
|
|
995
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
996
|
+
|
|
997
|
+
// Sort phase for deterministic order
|
|
998
|
+
phase.sort();
|
|
999
|
+
phases.push(phase);
|
|
1000
|
+
|
|
1001
|
+
for (const node of phase) {
|
|
1002
|
+
assigned.add(node);
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
return phases;
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
/**
|
|
1010
|
+
* Get jobs that have no dependencies (can start immediately)
|
|
1011
|
+
*/
|
|
1012
|
+
export <span class="fstat-no" title="function not covered" >function getRootJobs(graph: DependencyGraph): string[] {</span>
|
|
1013
|
+
<span class="cstat-no" title="statement not covered" > const roots: string[] = [];</span>
|
|
1014
|
+
|
|
1015
|
+
<span class="cstat-no" title="statement not covered" > for (const node of graph.nodes) {</span>
|
|
1016
|
+
<span class="cstat-no" title="statement not covered" > const dependencies = graph.edges.get(node) || new Set();</span>
|
|
1017
|
+
<span class="cstat-no" title="statement not covered" > if (dependencies.size === 0) {</span>
|
|
1018
|
+
<span class="cstat-no" title="statement not covered" > roots.push(node);</span>
|
|
1019
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1020
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1021
|
+
|
|
1022
|
+
<span class="cstat-no" title="statement not covered" > return roots.sort();</span>
|
|
1023
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1024
|
+
|
|
1025
|
+
/**
|
|
1026
|
+
* Get jobs that have no dependents (leaf jobs)
|
|
1027
|
+
*/
|
|
1028
|
+
export <span class="fstat-no" title="function not covered" >function getLeafJobs(graph: DependencyGraph): string[] {</span>
|
|
1029
|
+
<span class="cstat-no" title="statement not covered" > const leaves: string[] = [];</span>
|
|
1030
|
+
|
|
1031
|
+
<span class="cstat-no" title="statement not covered" > for (const node of graph.nodes) {</span>
|
|
1032
|
+
<span class="cstat-no" title="statement not covered" > const dependents = graph.reverseEdges.get(node) || new Set();</span>
|
|
1033
|
+
<span class="cstat-no" title="statement not covered" > if (dependents.size === 0) {</span>
|
|
1034
|
+
<span class="cstat-no" title="statement not covered" > leaves.push(node);</span>
|
|
1035
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1036
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1037
|
+
|
|
1038
|
+
<span class="cstat-no" title="statement not covered" > return leaves.sort();</span>
|
|
1039
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1040
|
+
|
|
1041
|
+
/**
|
|
1042
|
+
* Check if job A depends on job B (directly or indirectly)
|
|
1043
|
+
*/
|
|
1044
|
+
export <span class="fstat-no" title="function not covered" >function dependsOn(</span>
|
|
1045
|
+
<span class="cstat-no" title="statement not covered" > graph: DependencyGraph,</span>
|
|
1046
|
+
<span class="cstat-no" title="statement not covered" > jobA: string,</span>
|
|
1047
|
+
<span class="cstat-no" title="statement not covered" > jobB: string</span>
|
|
1048
|
+
<span class="cstat-no" title="statement not covered" >): boolean {</span>
|
|
1049
|
+
<span class="cstat-no" title="statement not covered" > const dependencies = getAllDependencies(graph, jobA);</span>
|
|
1050
|
+
<span class="cstat-no" title="statement not covered" > return dependencies.has(jobB);</span>
|
|
1051
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1052
|
+
|
|
1053
|
+
/**
|
|
1054
|
+
* Get the critical path (longest chain of dependencies)
|
|
1055
|
+
*/
|
|
1056
|
+
export <span class="fstat-no" title="function not covered" >function getCriticalPath(graph: DependencyGraph): string[] {</span>
|
|
1057
|
+
<span class="cstat-no" title="statement not covered" > const memo = new Map<string, string[]>();</span>
|
|
1058
|
+
|
|
1059
|
+
<span class="cstat-no" title="statement not covered" > function longestPath(node: string): string[] {</span>
|
|
1060
|
+
<span class="cstat-no" title="statement not covered" > if (memo.has(node)) {</span>
|
|
1061
|
+
<span class="cstat-no" title="statement not covered" > return memo.get(node)!;</span>
|
|
1062
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1063
|
+
|
|
1064
|
+
<span class="cstat-no" title="statement not covered" > const dependents = graph.reverseEdges.get(node) || new Set();</span>
|
|
1065
|
+
<span class="cstat-no" title="statement not covered" > if (dependents.size === 0) {</span>
|
|
1066
|
+
<span class="cstat-no" title="statement not covered" > memo.set(node, [node]);</span>
|
|
1067
|
+
<span class="cstat-no" title="statement not covered" > return [node];</span>
|
|
1068
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1069
|
+
|
|
1070
|
+
<span class="cstat-no" title="statement not covered" > let longest: string[] = [];</span>
|
|
1071
|
+
<span class="cstat-no" title="statement not covered" > for (const dep of dependents) {</span>
|
|
1072
|
+
<span class="cstat-no" title="statement not covered" > const path = longestPath(dep);</span>
|
|
1073
|
+
<span class="cstat-no" title="statement not covered" > if (path.length > longest.length) {</span>
|
|
1074
|
+
<span class="cstat-no" title="statement not covered" > longest = path;</span>
|
|
1075
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1076
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1077
|
+
|
|
1078
|
+
<span class="cstat-no" title="statement not covered" > const result = [node, ...longest];</span>
|
|
1079
|
+
<span class="cstat-no" title="statement not covered" > memo.set(node, result);</span>
|
|
1080
|
+
<span class="cstat-no" title="statement not covered" > return result;</span>
|
|
1081
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1082
|
+
|
|
1083
|
+
// Find the longest path starting from any root
|
|
1084
|
+
<span class="cstat-no" title="statement not covered" > const roots = getRootJobs(graph);</span>
|
|
1085
|
+
<span class="cstat-no" title="statement not covered" > let criticalPath: string[] = [];</span>
|
|
1086
|
+
|
|
1087
|
+
<span class="cstat-no" title="statement not covered" > for (const root of roots) {</span>
|
|
1088
|
+
<span class="cstat-no" title="statement not covered" > const path = longestPath(root);</span>
|
|
1089
|
+
<span class="cstat-no" title="statement not covered" > if (path.length > criticalPath.length) {</span>
|
|
1090
|
+
<span class="cstat-no" title="statement not covered" > criticalPath = path;</span>
|
|
1091
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1092
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1093
|
+
|
|
1094
|
+
<span class="cstat-no" title="statement not covered" > return criticalPath;</span>
|
|
1095
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1096
|
+
|
|
1097
|
+
/**
|
|
1098
|
+
* Validate that all dependencies exist
|
|
1099
|
+
*/
|
|
1100
|
+
export <span class="fstat-no" title="function not covered" >function validateDependencies(workflow: Workflow): string[] {</span>
|
|
1101
|
+
<span class="cstat-no" title="statement not covered" > const errors: string[] = [];</span>
|
|
1102
|
+
<span class="cstat-no" title="statement not covered" > const jobNames = new Set(Object.keys(workflow.jobs));</span>
|
|
1103
|
+
|
|
1104
|
+
<span class="cstat-no" title="statement not covered" > for (const [jobId, job] of Object.entries(workflow.jobs)) {</span>
|
|
1105
|
+
<span class="cstat-no" title="statement not covered" > const needs = normalizeNeedsInput(job.needs);</span>
|
|
1106
|
+
|
|
1107
|
+
<span class="cstat-no" title="statement not covered" > for (const need of needs) {</span>
|
|
1108
|
+
<span class="cstat-no" title="statement not covered" > if (!jobNames.has(need)) {</span>
|
|
1109
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`Job "${jobId}" depends on unknown job "${need}"`);</span>
|
|
1110
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1111
|
+
<span class="cstat-no" title="statement not covered" > if (need === jobId) {</span>
|
|
1112
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`Job "${jobId}" cannot depend on itself`);</span>
|
|
1113
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1114
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1115
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1116
|
+
|
|
1117
|
+
<span class="cstat-no" title="statement not covered" > return errors;</span>
|
|
1118
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1119
|
+
</pre></td></tr></table></pre>
|
|
1120
|
+
|
|
1121
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1122
|
+
</div><!-- /wrapper -->
|
|
1123
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1124
|
+
Code coverage generated by
|
|
1125
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1126
|
+
at 2026-02-27T18:23:31.775Z
|
|
1127
|
+
</div>
|
|
1128
|
+
<script src="../../prettify.js"></script>
|
|
1129
|
+
<script>
|
|
1130
|
+
window.onload = function () {
|
|
1131
|
+
prettyPrint();
|
|
1132
|
+
};
|
|
1133
|
+
</script>
|
|
1134
|
+
<script src="../../sorter.js"></script>
|
|
1135
|
+
<script src="../../block-navigation.js"></script>
|
|
1136
|
+
</body>
|
|
1137
|
+
</html>
|
|
1138
|
+
|