cdd-cli 3.2.0 → 4.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/.atl/skill-registry.md +30 -0
- package/.editorconfig +12 -0
- package/.eslintrc.json +1 -1
- package/.prettierignore +4 -0
- package/.prettierrc +8 -0
- package/.~lock.ROADMAP.md# +1 -0
- package/CHANGELOG.md +80 -0
- package/README.es.md +198 -0
- package/README.md +81 -23
- package/ROADMAP.md +647 -0
- package/SECURITY.md +5 -0
- package/__mocks__/ink.cjs +17 -0
- package/coverage/clover.xml +471 -500
- package/coverage/coverage-final.json +16 -16
- package/coverage/lcov-report/ContainerCreationPrompt.jsx.html +400 -0
- package/coverage/lcov-report/ControlsHUD.jsx.html +256 -0
- package/coverage/lcov-report/components/ContainerCreationPrompt.jsx.html +394 -0
- package/coverage/lcov-report/components/PromptField.jsx.html +229 -0
- package/coverage/lcov-report/components/SuggestionPanel.jsx.html +268 -0
- package/coverage/lcov-report/components/index.html +146 -0
- package/coverage/lcov-report/helpers/constants.js.html +139 -22
- package/coverage/lcov-report/helpers/containerOptionsBuilder.js.html +75 -42
- package/coverage/lcov-report/helpers/dockerHubService.js.html +310 -0
- package/coverage/lcov-report/helpers/dockerService/serviceComponents/containerActions.js.html +162 -84
- package/coverage/lcov-report/helpers/dockerService/serviceComponents/containerList.js.html +50 -32
- package/coverage/lcov-report/helpers/dockerService/serviceComponents/index.html +21 -21
- package/coverage/lcov-report/helpers/imageNameUtils.js.html +181 -0
- package/coverage/lcov-report/helpers/index.html +84 -54
- package/coverage/lcov-report/helpers/logger.js.html +68 -68
- package/coverage/lcov-report/helpers/safeCall.js.html +15 -15
- package/coverage/lcov-report/helpers/validationHelpers.js.html +66 -114
- package/coverage/lcov-report/hooks/creation/index.html +20 -20
- package/coverage/lcov-report/hooks/creation/useContainerActions.js.html +38 -17
- package/coverage/lcov-report/hooks/creation/useContainerCreation.js.html +593 -89
- package/coverage/lcov-report/hooks/creation/useLogsViewer.js.html +7 -7
- package/coverage/lcov-report/hooks/debug/index.html +5 -5
- package/coverage/lcov-report/hooks/debug/useDebugLogs.js.html +35 -20
- package/coverage/lcov-report/hooks/index.html +40 -40
- package/coverage/lcov-report/hooks/navigation/index.html +19 -19
- package/coverage/lcov-report/hooks/navigation/useContainerSelection.js.html +38 -29
- package/coverage/lcov-report/hooks/useContainerCommandRouter.js.html +119 -80
- package/coverage/lcov-report/hooks/useControls.js.html +306 -123
- package/coverage/lcov-report/hooks/useEraseConfirmation.js.html +8 -8
- package/coverage/lcov-report/hooks/useExitHandler.js.html +50 -41
- package/coverage/lcov-report/index.html +52 -67
- package/coverage/lcov.info +899 -952
- package/dist/App.js +18 -12
- package/dist/components/ContainerCreationPrompt.js +50 -13
- package/dist/components/ContainerList.js +3 -3
- package/dist/components/ContainerRow.js +20 -20
- package/dist/components/ContainerSection.js +3 -3
- package/dist/components/ControlsHUD.js +106 -0
- package/dist/components/Footer.js +2 -2
- package/dist/components/Header.js +7 -7
- package/dist/components/LogViewer.js +3 -3
- package/dist/components/MessageFeedback.js +2 -2
- package/dist/components/PromptField.js +4 -4
- package/dist/components/StatsBar.js +5 -5
- package/dist/components/SuggestionPanel.js +53 -0
- package/dist/components/UsageMenu.js +3 -3
- package/dist/helpers/appInfo.js +7 -7
- package/dist/helpers/constants.js +154 -1
- package/dist/helpers/containerOptionsBuilder.js +3 -3
- package/dist/helpers/dockerHubService.js +111 -0
- package/dist/helpers/dockerService/dockerService.js +1 -1
- package/dist/helpers/dockerService/serviceComponents/containerActions.js +99 -40
- package/dist/helpers/dockerService/serviceComponents/containerList.js +11 -11
- package/dist/helpers/dockerService/serviceComponents/containerLogs.js +9 -9
- package/dist/helpers/dockerService/serviceComponents/containerStats.js +5 -5
- package/dist/helpers/dockerService/serviceComponents/imageUtils.js +1 -1
- package/dist/helpers/exitWithMessage.js +10 -10
- package/dist/helpers/imageNameUtils.js +32 -0
- package/dist/helpers/logger.js +13 -13
- package/dist/helpers/safeCall.js +2 -2
- package/dist/helpers/validationHelpers.js +76 -21
- package/dist/hooks/creation/useContainerActions.js +28 -11
- package/dist/hooks/creation/useContainerCreation.js +452 -62
- package/dist/hooks/creation/useLogsViewer.js +2 -2
- package/dist/hooks/debug/useDebugLogs.js +4 -4
- package/dist/hooks/useContainerCommandRouter.js +14 -14
- package/dist/hooks/useContainers.js +3 -3
- package/dist/hooks/useControls.js +85 -38
- package/dist/hooks/useEraseConfirmation.js +3 -3
- package/dist/index.js +9 -2
- package/jest.config.cjs +7 -0
- package/package.json +7 -3
- package/src/App.jsx +39 -16
- package/src/components/ContainerCreationPrompt.jsx +54 -10
- package/src/components/ContainerList.jsx +3 -3
- package/src/components/ContainerRow.jsx +19 -16
- package/src/components/ContainerSection.jsx +3 -3
- package/src/components/ControlsHUD.jsx +66 -0
- package/src/components/Footer.jsx +2 -2
- package/src/components/Header.jsx +7 -7
- package/src/components/LogViewer.jsx +5 -3
- package/src/components/MessageFeedback.jsx +2 -2
- package/src/components/PromptField.jsx +4 -4
- package/src/components/StatsBar.jsx +11 -7
- package/src/components/SuggestionPanel.jsx +61 -0
- package/src/components/UsageMenu.jsx +18 -13
- package/src/helpers/appInfo.js +7 -7
- package/src/helpers/constants.js +48 -9
- package/src/helpers/containerOptionsBuilder.js +16 -5
- package/src/helpers/dockerHubService.js +75 -0
- package/src/helpers/dockerService/dockerService.js +1 -1
- package/src/helpers/dockerService/serviceComponents/containerActions.js +87 -61
- package/src/helpers/dockerService/serviceComponents/containerList.js +31 -25
- package/src/helpers/dockerService/serviceComponents/containerLogs.js +41 -26
- package/src/helpers/dockerService/serviceComponents/containerStats.js +13 -11
- package/src/helpers/dockerService/serviceComponents/imageUtils.js +5 -4
- package/src/helpers/exitWithMessage.js +13 -7
- package/src/helpers/imageNameUtils.js +32 -0
- package/src/helpers/logger.js +15 -16
- package/src/helpers/safeCall.js +2 -2
- package/src/helpers/validationHelpers.js +13 -29
- package/src/hooks/creation/useContainerActions.js +32 -12
- package/src/hooks/creation/useContainerCreation.js +293 -47
- package/src/hooks/creation/useLogsViewer.js +2 -2
- package/src/hooks/debug/useDebugLogs.js +15 -10
- package/src/hooks/navigation/useContainerSelection.js +17 -14
- package/src/hooks/useContainerCommandRouter.js +71 -58
- package/src/hooks/useContainers.js +4 -4
- package/src/hooks/useControls.js +135 -72
- package/src/hooks/useEraseConfirmation.js +3 -3
- package/src/hooks/useExitHandler.js +29 -26
- package/src/index.js +8 -4
- package/test/ContainerCreationPrompt.dom.test.js +313 -0
- package/test/ControlsHUD.dom.test.js +125 -0
- package/test/SuggestionPanel.dom.test.js +83 -0
- package/test/constants.test.js +41 -0
- package/test/dockerHubService.test.js +213 -0
- package/test/logger.test.js +58 -0
- package/test/resolveImageTag.test.js +26 -0
- package/test/useContainerCreation.dom.test.js +428 -2
- package/test/useContainerCreationHub.dom.test.js +184 -0
- package/test/useControls.dom.test.js +406 -4
|
@@ -23,30 +23,30 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">52.94% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>81/153</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">45.79% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>49/107</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">
|
|
40
|
+
<span class="strong">53.84% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>14/26</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">55.39% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>77/139</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
</div>
|
|
62
62
|
</template>
|
|
63
63
|
</div>
|
|
64
|
-
<div class='status-line
|
|
64
|
+
<div class='status-line medium'></div>
|
|
65
65
|
<div class="pad1">
|
|
66
66
|
<table class="coverage-summary">
|
|
67
67
|
<thead>
|
|
@@ -84,73 +84,103 @@
|
|
|
84
84
|
<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
|
|
85
85
|
</td>
|
|
86
86
|
<td data-value="100" class="pct high">100%</td>
|
|
87
|
-
<td data-value="
|
|
87
|
+
<td data-value="15" class="abs high">15/15</td>
|
|
88
|
+
<td data-value="85.71" class="pct high">85.71%</td>
|
|
89
|
+
<td data-value="7" class="abs high">6/7</td>
|
|
88
90
|
<td data-value="100" class="pct high">100%</td>
|
|
89
|
-
<td data-value="
|
|
90
|
-
<td data-value="100" class="pct high">100%</td>
|
|
91
|
-
<td data-value="0" class="abs high">0/0</td>
|
|
91
|
+
<td data-value="1" class="abs high">1/1</td>
|
|
92
92
|
<td data-value="100" class="pct high">100%</td>
|
|
93
|
-
<td data-value="
|
|
93
|
+
<td data-value="12" class="abs high">12/12</td>
|
|
94
94
|
</tr>
|
|
95
95
|
|
|
96
96
|
<tr>
|
|
97
|
-
<td class="file
|
|
98
|
-
<td data-value="
|
|
99
|
-
<div class="chart"><div class="cover-fill" style="width:
|
|
97
|
+
<td class="file medium" data-value="containerOptionsBuilder.js"><a href="containerOptionsBuilder.js.html">containerOptionsBuilder.js</a></td>
|
|
98
|
+
<td data-value="54.16" class="pic medium">
|
|
99
|
+
<div class="chart"><div class="cover-fill" style="width: 54%"></div><div class="cover-empty" style="width: 46%"></div></div>
|
|
100
100
|
</td>
|
|
101
|
-
<td data-value="
|
|
102
|
-
<td data-value="24" class="abs
|
|
103
|
-
<td data-value="
|
|
104
|
-
<td data-value="18" class="abs
|
|
105
|
-
<td data-value="
|
|
106
|
-
<td data-value="4" class="abs
|
|
107
|
-
<td data-value="
|
|
108
|
-
<td data-value="
|
|
101
|
+
<td data-value="54.16" class="pct medium">54.16%</td>
|
|
102
|
+
<td data-value="24" class="abs medium">13/24</td>
|
|
103
|
+
<td data-value="44.44" class="pct low">44.44%</td>
|
|
104
|
+
<td data-value="18" class="abs low">8/18</td>
|
|
105
|
+
<td data-value="75" class="pct medium">75%</td>
|
|
106
|
+
<td data-value="4" class="abs medium">3/4</td>
|
|
107
|
+
<td data-value="68.42" class="pct medium">68.42%</td>
|
|
108
|
+
<td data-value="19" class="abs medium">13/19</td>
|
|
109
109
|
</tr>
|
|
110
110
|
|
|
111
111
|
<tr>
|
|
112
|
-
<td class="file
|
|
113
|
-
<td data-value="
|
|
114
|
-
<div class="chart"><div class="cover-fill" style="width:
|
|
112
|
+
<td class="file low" data-value="dockerHubService.js"><a href="dockerHubService.js.html">dockerHubService.js</a></td>
|
|
113
|
+
<td data-value="3.84" class="pic low">
|
|
114
|
+
<div class="chart"><div class="cover-fill" style="width: 3%"></div><div class="cover-empty" style="width: 97%"></div></div>
|
|
115
115
|
</td>
|
|
116
|
-
<td data-value="
|
|
117
|
-
<td data-value="
|
|
118
|
-
<td data-value="
|
|
119
|
-
<td data-value="
|
|
120
|
-
<td data-value="
|
|
121
|
-
<td data-value="
|
|
122
|
-
<td data-value="
|
|
123
|
-
<td data-value="
|
|
116
|
+
<td data-value="3.84" class="pct low">3.84%</td>
|
|
117
|
+
<td data-value="26" class="abs low">1/26</td>
|
|
118
|
+
<td data-value="0" class="pct low">0%</td>
|
|
119
|
+
<td data-value="19" class="abs low">0/19</td>
|
|
120
|
+
<td data-value="0" class="pct low">0%</td>
|
|
121
|
+
<td data-value="3" class="abs low">0/3</td>
|
|
122
|
+
<td data-value="4.16" class="pct low">4.16%</td>
|
|
123
|
+
<td data-value="24" class="abs low">1/24</td>
|
|
124
124
|
</tr>
|
|
125
125
|
|
|
126
126
|
<tr>
|
|
127
|
-
<td class="file high" data-value="
|
|
128
|
-
<td data-value="
|
|
129
|
-
<div class="chart"><div class="cover-fill
|
|
127
|
+
<td class="file high" data-value="imageNameUtils.js"><a href="imageNameUtils.js.html">imageNameUtils.js</a></td>
|
|
128
|
+
<td data-value="80" class="pic high">
|
|
129
|
+
<div class="chart"><div class="cover-fill" style="width: 80%"></div><div class="cover-empty" style="width: 20%"></div></div>
|
|
130
130
|
</td>
|
|
131
|
-
<td data-value="
|
|
132
|
-
<td data-value="
|
|
133
|
-
<td data-value="
|
|
134
|
-
<td data-value="
|
|
131
|
+
<td data-value="80" class="pct high">80%</td>
|
|
132
|
+
<td data-value="10" class="abs high">8/10</td>
|
|
133
|
+
<td data-value="66.66" class="pct medium">66.66%</td>
|
|
134
|
+
<td data-value="6" class="abs medium">4/6</td>
|
|
135
135
|
<td data-value="100" class="pct high">100%</td>
|
|
136
136
|
<td data-value="1" class="abs high">1/1</td>
|
|
137
|
+
<td data-value="88.88" class="pct high">88.88%</td>
|
|
138
|
+
<td data-value="9" class="abs high">8/9</td>
|
|
139
|
+
</tr>
|
|
140
|
+
|
|
141
|
+
<tr>
|
|
142
|
+
<td class="file low" data-value="logger.js"><a href="logger.js.html">logger.js</a></td>
|
|
143
|
+
<td data-value="29.72" class="pic low">
|
|
144
|
+
<div class="chart"><div class="cover-fill" style="width: 29%"></div><div class="cover-empty" style="width: 71%"></div></div>
|
|
145
|
+
</td>
|
|
146
|
+
<td data-value="29.72" class="pct low">29.72%</td>
|
|
147
|
+
<td data-value="37" class="abs low">11/37</td>
|
|
148
|
+
<td data-value="25" class="pct low">25%</td>
|
|
149
|
+
<td data-value="24" class="abs low">6/24</td>
|
|
150
|
+
<td data-value="27.27" class="pct low">27.27%</td>
|
|
151
|
+
<td data-value="11" class="abs low">3/11</td>
|
|
152
|
+
<td data-value="27.77" class="pct low">27.77%</td>
|
|
153
|
+
<td data-value="36" class="abs low">10/36</td>
|
|
154
|
+
</tr>
|
|
155
|
+
|
|
156
|
+
<tr>
|
|
157
|
+
<td class="file medium" data-value="safeCall.js"><a href="safeCall.js.html">safeCall.js</a></td>
|
|
158
|
+
<td data-value="75" class="pic medium">
|
|
159
|
+
<div class="chart"><div class="cover-fill" style="width: 75%"></div><div class="cover-empty" style="width: 25%"></div></div>
|
|
160
|
+
</td>
|
|
161
|
+
<td data-value="75" class="pct medium">75%</td>
|
|
162
|
+
<td data-value="4" class="abs medium">3/4</td>
|
|
163
|
+
<td data-value="50" class="pct medium">50%</td>
|
|
164
|
+
<td data-value="2" class="abs medium">1/2</td>
|
|
137
165
|
<td data-value="100" class="pct high">100%</td>
|
|
138
|
-
<td data-value="
|
|
166
|
+
<td data-value="1" class="abs high">1/1</td>
|
|
167
|
+
<td data-value="75" class="pct medium">75%</td>
|
|
168
|
+
<td data-value="4" class="abs medium">3/4</td>
|
|
139
169
|
</tr>
|
|
140
170
|
|
|
141
171
|
<tr>
|
|
142
172
|
<td class="file high" data-value="validationHelpers.js"><a href="validationHelpers.js.html">validationHelpers.js</a></td>
|
|
143
|
-
<td data-value="
|
|
144
|
-
<div class="chart"><div class="cover-fill" style="width:
|
|
173
|
+
<td data-value="81.08" class="pic high">
|
|
174
|
+
<div class="chart"><div class="cover-fill" style="width: 81%"></div><div class="cover-empty" style="width: 19%"></div></div>
|
|
145
175
|
</td>
|
|
146
|
-
<td data-value="
|
|
147
|
-
<td data-value="
|
|
148
|
-
<td data-value="
|
|
149
|
-
<td data-value="
|
|
150
|
-
<td data-value="100" class="pct high">100%</td>
|
|
151
|
-
<td data-value="6" class="abs high">6/6</td>
|
|
176
|
+
<td data-value="81.08" class="pct high">81.08%</td>
|
|
177
|
+
<td data-value="37" class="abs high">30/37</td>
|
|
178
|
+
<td data-value="77.41" class="pct medium">77.41%</td>
|
|
179
|
+
<td data-value="31" class="abs medium">24/31</td>
|
|
152
180
|
<td data-value="100" class="pct high">100%</td>
|
|
153
|
-
<td data-value="
|
|
181
|
+
<td data-value="5" class="abs high">5/5</td>
|
|
182
|
+
<td data-value="85.71" class="pct high">85.71%</td>
|
|
183
|
+
<td data-value="35" class="abs high">30/35</td>
|
|
154
184
|
</tr>
|
|
155
185
|
|
|
156
186
|
</tbody>
|
|
@@ -161,7 +191,7 @@
|
|
|
161
191
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
162
192
|
Code coverage generated by
|
|
163
193
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
164
|
-
at 2026-04-
|
|
194
|
+
at 2026-04-27T22:13:21.150Z
|
|
165
195
|
</div>
|
|
166
196
|
<script src="../prettify.js"></script>
|
|
167
197
|
<script>
|
|
@@ -23,30 +23,30 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">29.72% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>11/37</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">25% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>6/24</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">
|
|
40
|
+
<span class="strong">27.27% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>3/11</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">27.77% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>10/36</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
</div>
|
|
62
62
|
</template>
|
|
63
63
|
</div>
|
|
64
|
-
<div class='status-line
|
|
64
|
+
<div class='status-line low'></div>
|
|
65
65
|
<pre><table class="coverage">
|
|
66
66
|
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
67
|
<a name='L2'></a><a href='#L2'>2</a>
|
|
@@ -180,7 +180,7 @@
|
|
|
180
180
|
<span class="cline-any cline-neutral"> </span>
|
|
181
181
|
<span class="cline-any cline-neutral"> </span>
|
|
182
182
|
<span class="cline-any cline-neutral"> </span>
|
|
183
|
-
<span class="cline-any cline-yes">
|
|
183
|
+
<span class="cline-any cline-yes">2x</span>
|
|
184
184
|
<span class="cline-any cline-neutral"> </span>
|
|
185
185
|
<span class="cline-any cline-neutral"> </span>
|
|
186
186
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -202,8 +202,8 @@
|
|
|
202
202
|
<span class="cline-any cline-neutral"> </span>
|
|
203
203
|
<span class="cline-any cline-neutral"> </span>
|
|
204
204
|
<span class="cline-any cline-neutral"> </span>
|
|
205
|
-
<span class="cline-any cline-yes">
|
|
206
|
-
<span class="cline-any cline-yes">
|
|
205
|
+
<span class="cline-any cline-yes">4x</span>
|
|
206
|
+
<span class="cline-any cline-yes">4x</span>
|
|
207
207
|
<span class="cline-any cline-neutral"> </span>
|
|
208
208
|
<span class="cline-any cline-no"> </span>
|
|
209
209
|
<span class="cline-any cline-no"> </span>
|
|
@@ -213,42 +213,42 @@
|
|
|
213
213
|
<span class="cline-any cline-neutral"> </span>
|
|
214
214
|
<span class="cline-any cline-neutral"> </span>
|
|
215
215
|
<span class="cline-any cline-neutral"> </span>
|
|
216
|
-
<span class="cline-any cline-yes">
|
|
216
|
+
<span class="cline-any cline-yes">2x</span>
|
|
217
217
|
<span class="cline-any cline-neutral"> </span>
|
|
218
218
|
<span class="cline-any cline-neutral"> </span>
|
|
219
219
|
<span class="cline-any cline-neutral"> </span>
|
|
220
|
-
<span class="cline-any cline-yes">
|
|
220
|
+
<span class="cline-any cline-yes">2x</span>
|
|
221
221
|
<span class="cline-any cline-neutral"> </span>
|
|
222
|
-
<span class="cline-any cline-yes">
|
|
222
|
+
<span class="cline-any cline-yes">2x</span>
|
|
223
223
|
<span class="cline-any cline-neutral"> </span>
|
|
224
224
|
<span class="cline-any cline-neutral"> </span>
|
|
225
|
-
<span class="cline-any cline-
|
|
226
|
-
<span class="cline-any cline-
|
|
225
|
+
<span class="cline-any cline-no"> </span>
|
|
226
|
+
<span class="cline-any cline-no"> </span>
|
|
227
227
|
<span class="cline-any cline-neutral"> </span>
|
|
228
228
|
<span class="cline-any cline-neutral"> </span>
|
|
229
229
|
<span class="cline-any cline-neutral"> </span>
|
|
230
|
-
<span class="cline-any cline-
|
|
231
|
-
<span class="cline-any cline-
|
|
230
|
+
<span class="cline-any cline-no"> </span>
|
|
231
|
+
<span class="cline-any cline-no"> </span>
|
|
232
232
|
<span class="cline-any cline-neutral"> </span>
|
|
233
233
|
<span class="cline-any cline-neutral"> </span>
|
|
234
|
-
<span class="cline-any cline-
|
|
235
|
-
<span class="cline-any cline-
|
|
236
|
-
<span class="cline-any cline-
|
|
237
|
-
<span class="cline-any cline-
|
|
234
|
+
<span class="cline-any cline-no"> </span>
|
|
235
|
+
<span class="cline-any cline-no"> </span>
|
|
236
|
+
<span class="cline-any cline-no"> </span>
|
|
237
|
+
<span class="cline-any cline-no"> </span>
|
|
238
238
|
<span class="cline-any cline-neutral"> </span>
|
|
239
239
|
<span class="cline-any cline-neutral"> </span>
|
|
240
|
-
<span class="cline-any cline-
|
|
240
|
+
<span class="cline-any cline-no"> </span>
|
|
241
241
|
<span class="cline-any cline-neutral"> </span>
|
|
242
|
-
<span class="cline-any cline-
|
|
243
|
-
<span class="cline-any cline-
|
|
244
|
-
<span class="cline-any cline-
|
|
245
|
-
<span class="cline-any cline-
|
|
242
|
+
<span class="cline-any cline-no"> </span>
|
|
243
|
+
<span class="cline-any cline-no"> </span>
|
|
244
|
+
<span class="cline-any cline-no"> </span>
|
|
245
|
+
<span class="cline-any cline-no"> </span>
|
|
246
246
|
<span class="cline-any cline-neutral"> </span>
|
|
247
247
|
<span class="cline-any cline-no"> </span>
|
|
248
248
|
<span class="cline-any cline-neutral"> </span>
|
|
249
249
|
<span class="cline-any cline-neutral"> </span>
|
|
250
250
|
<span class="cline-any cline-neutral"> </span>
|
|
251
|
-
<span class="cline-any cline-
|
|
251
|
+
<span class="cline-any cline-no"> </span>
|
|
252
252
|
<span class="cline-any cline-no"> </span>
|
|
253
253
|
<span class="cline-any cline-no"> </span>
|
|
254
254
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -262,18 +262,18 @@
|
|
|
262
262
|
<span class="cline-any cline-neutral"> </span>
|
|
263
263
|
<span class="cline-any cline-neutral"> </span>
|
|
264
264
|
<span class="cline-any cline-neutral"> </span>
|
|
265
|
-
<span class="cline-any cline-yes">
|
|
265
|
+
<span class="cline-any cline-yes">2x</span>
|
|
266
266
|
<span class="cline-any cline-neutral"> </span>
|
|
267
|
-
<span class="cline-any cline-
|
|
267
|
+
<span class="cline-any cline-no"> </span>
|
|
268
268
|
<span class="cline-any cline-neutral"> </span>
|
|
269
269
|
<span class="cline-any cline-neutral"> </span>
|
|
270
|
-
<span class="cline-any cline-
|
|
270
|
+
<span class="cline-any cline-no"> </span>
|
|
271
271
|
<span class="cline-any cline-neutral"> </span>
|
|
272
272
|
<span class="cline-any cline-neutral"> </span>
|
|
273
273
|
<span class="cline-any cline-no"> </span>
|
|
274
274
|
<span class="cline-any cline-neutral"> </span>
|
|
275
275
|
<span class="cline-any cline-neutral"> </span>
|
|
276
|
-
<span class="cline-any cline-
|
|
276
|
+
<span class="cline-any cline-no"> </span>
|
|
277
277
|
<span class="cline-any cline-neutral"> </span>
|
|
278
278
|
<span class="cline-any cline-neutral"> </span>
|
|
279
279
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -282,11 +282,11 @@
|
|
|
282
282
|
<span class="cline-any cline-neutral"> </span>
|
|
283
283
|
<span class="cline-any cline-neutral"> </span>
|
|
284
284
|
<span class="cline-any cline-neutral"> </span>
|
|
285
|
-
<span class="cline-any cline-yes">
|
|
285
|
+
<span class="cline-any cline-yes">20x</span>
|
|
286
286
|
<span class="cline-any cline-no"> </span>
|
|
287
287
|
<span class="cline-any cline-neutral"> </span>
|
|
288
|
-
<span class="cline-any cline-yes">
|
|
289
|
-
<span class="cline-any cline-yes">
|
|
288
|
+
<span class="cline-any cline-yes">20x</span>
|
|
289
|
+
<span class="cline-any cline-yes">20x</span>
|
|
290
290
|
<span class="cline-any cline-neutral"> </span>
|
|
291
291
|
<span class="cline-any cline-neutral"> </span>
|
|
292
292
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
@@ -297,7 +297,7 @@ const LOG_LEVELS = {
|
|
|
297
297
|
error: 0,
|
|
298
298
|
warn: 1,
|
|
299
299
|
info: 2,
|
|
300
|
-
debug: 3
|
|
300
|
+
debug: 3,
|
|
301
301
|
};
|
|
302
302
|
|
|
303
303
|
/**
|
|
@@ -315,7 +315,7 @@ const LOG_LEVELS = {
|
|
|
315
315
|
*/
|
|
316
316
|
|
|
317
317
|
function parseLevel(value) {
|
|
318
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (typeof value !==
|
|
318
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (typeof value !== 'string') {
|
|
319
319
|
return null;
|
|
320
320
|
}
|
|
321
321
|
const normalized = <span class="cstat-no" title="statement not covered" >value.trim().toLowerCase();</span>
|
|
@@ -330,38 +330,38 @@ const envLevel =
|
|
|
330
330
|
parseLevel(process.env.LOG_LEVEL) ??
|
|
331
331
|
LOG_LEVELS.info;
|
|
332
332
|
|
|
333
|
-
const currentLevel = typeof envLevel ===
|
|
333
|
+
const currentLevel = typeof envLevel === 'number' ? envLevel : <span class="branch-1 cbranch-no" title="branch not covered" >LOG_LEVELS.info;</span>
|
|
334
334
|
|
|
335
335
|
const listeners = new Set();
|
|
336
336
|
|
|
337
|
-
function shouldLog(level) {
|
|
338
|
-
const target = LOG_LEVELS[level]
|
|
339
|
-
return typeof target ===
|
|
337
|
+
function <span class="fstat-no" title="function not covered" >shouldLog(</span>level) {
|
|
338
|
+
const target = <span class="cstat-no" title="statement not covered" >LOG_LEVELS[level];</span>
|
|
339
|
+
<span class="cstat-no" title="statement not covered" > return typeof target === 'number' && target <= currentLevel;</span>
|
|
340
340
|
}
|
|
341
341
|
|
|
342
|
-
function log(level, message, ...args) {
|
|
343
|
-
if (!shouldLog(level)) {
|
|
344
|
-
return
|
|
342
|
+
function <span class="fstat-no" title="function not covered" >log(</span>level, message, ...args) {
|
|
343
|
+
<span class="cstat-no" title="statement not covered" > if (!shouldLog(level)) {</span>
|
|
344
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
345
345
|
}
|
|
346
346
|
|
|
347
|
-
const timestamp = new Date().toISOString()
|
|
348
|
-
const upperLevel = level.toUpperCase()
|
|
349
|
-
const formatted =
|
|
350
|
-
const entry = { level, message, args, timestamp, formatted }
|
|
347
|
+
const timestamp = <span class="cstat-no" title="statement not covered" >new Date().toISOString();</span>
|
|
348
|
+
const upperLevel = <span class="cstat-no" title="statement not covered" >level.toUpperCase();</span>
|
|
349
|
+
const formatted = <span class="cstat-no" title="statement not covered" >`[${timestamp}] [${upperLevel}] ${message}`;</span>
|
|
350
|
+
const entry = <span class="cstat-no" title="statement not covered" >{ level, message, args, timestamp, formatted };</span>
|
|
351
351
|
|
|
352
352
|
const shouldWriteToConsole =
|
|
353
|
-
|
|
353
|
+
<span class="cstat-no" title="statement not covered" > listeners.size === 0 || level === 'error' || level === 'warn';</span>
|
|
354
354
|
|
|
355
|
-
|
|
356
|
-
const method =
|
|
357
|
-
if (typeof console[method] ===
|
|
358
|
-
console[method](formatted, ...args)
|
|
359
|
-
} else
|
|
355
|
+
<span class="cstat-no" title="statement not covered" > if (shouldWriteToConsole) {</span>
|
|
356
|
+
const method = <span class="cstat-no" title="statement not covered" >level === 'debug' ? 'log' : level;</span>
|
|
357
|
+
<span class="cstat-no" title="statement not covered" > if (typeof console[method] === 'function') {</span>
|
|
358
|
+
<span class="cstat-no" title="statement not covered" > console[method](formatted, ...args);</span>
|
|
359
|
+
} else {
|
|
360
360
|
<span class="cstat-no" title="statement not covered" > console.log(formatted, ...args);</span>
|
|
361
361
|
}
|
|
362
362
|
}
|
|
363
363
|
|
|
364
|
-
listeners.forEach(<span class="fstat-no" title="function not covered" >(l</span>istener) => {
|
|
364
|
+
<span class="cstat-no" title="statement not covered" > listeners.forEach(<span class="fstat-no" title="function not covered" >(l</span>istener) => {</span>
|
|
365
365
|
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
366
366
|
<span class="cstat-no" title="statement not covered" > listener(entry);</span>
|
|
367
367
|
} catch (err) {
|
|
@@ -376,31 +376,31 @@ function log(level, message, ...args) {
|
|
|
376
376
|
* log entries (used by the CLI debug panel).
|
|
377
377
|
*/
|
|
378
378
|
export const logger = {
|
|
379
|
-
|
|
380
|
-
log(
|
|
379
|
+
<span class="fstat-no" title="function not covered" > de</span>bug(message, ...args) {
|
|
380
|
+
<span class="cstat-no" title="statement not covered" > log('debug', message, ...args);</span>
|
|
381
381
|
},
|
|
382
|
-
|
|
383
|
-
log(
|
|
382
|
+
<span class="fstat-no" title="function not covered" > in</span>fo(message, ...args) {
|
|
383
|
+
<span class="cstat-no" title="statement not covered" > log('info', message, ...args);</span>
|
|
384
384
|
},
|
|
385
385
|
<span class="fstat-no" title="function not covered" > wa</span>rn(message, ...args) {
|
|
386
|
-
<span class="cstat-no" title="statement not covered" > log(
|
|
386
|
+
<span class="cstat-no" title="statement not covered" > log('warn', message, ...args);</span>
|
|
387
387
|
},
|
|
388
|
-
|
|
389
|
-
log(
|
|
388
|
+
<span class="fstat-no" title="function not covered" > er</span>ror(message, ...args) {
|
|
389
|
+
<span class="cstat-no" title="statement not covered" > log('error', message, ...args);</span>
|
|
390
390
|
},
|
|
391
391
|
/**
|
|
392
392
|
* Subscribe to log events.
|
|
393
393
|
*
|
|
394
|
-
|
|
395
|
-
|
|
394
|
+
* @param {LogListener} listener Listener invoked for every log entry that passes the current level filter.
|
|
395
|
+
* @returns {function(): void} Cleanup function that removes the listener when called.
|
|
396
396
|
*/
|
|
397
397
|
subscribe(listener) {
|
|
398
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (typeof listener !==
|
|
398
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (typeof listener !== 'function') {
|
|
399
399
|
<span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >()</span> => {};</span>
|
|
400
400
|
}
|
|
401
401
|
listeners.add(listener);
|
|
402
402
|
return () => listeners.delete(listener);
|
|
403
|
-
}
|
|
403
|
+
},
|
|
404
404
|
};
|
|
405
405
|
</pre></td></tr></table></pre>
|
|
406
406
|
|
|
@@ -409,7 +409,7 @@ export const logger = {
|
|
|
409
409
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
410
410
|
Code coverage generated by
|
|
411
411
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
412
|
-
at 2026-04-
|
|
412
|
+
at 2026-04-27T22:13:21.150Z
|
|
413
413
|
</div>
|
|
414
414
|
<script src="../prettify.js"></script>
|
|
415
415
|
<script>
|
|
@@ -23,16 +23,16 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">75% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>3/4</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">50% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>1/2</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">75% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>3/4</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
</div>
|
|
62
62
|
</template>
|
|
63
63
|
</div>
|
|
64
|
-
<div class='status-line
|
|
64
|
+
<div class='status-line medium'></div>
|
|
65
65
|
<pre><table class="coverage">
|
|
66
66
|
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
67
|
<a name='L2'></a><a href='#L2'>2</a>
|
|
@@ -91,15 +91,15 @@
|
|
|
91
91
|
<span class="cline-any cline-neutral"> </span>
|
|
92
92
|
<span class="cline-any cline-neutral"> </span>
|
|
93
93
|
<span class="cline-any cline-neutral"> </span>
|
|
94
|
-
<span class="cline-any cline-yes">
|
|
95
|
-
<span class="cline-any cline-yes">
|
|
96
|
-
<span class="cline-any cline-yes">
|
|
94
|
+
<span class="cline-any cline-yes">6x</span>
|
|
95
|
+
<span class="cline-any cline-yes">6x</span>
|
|
96
|
+
<span class="cline-any cline-yes">6x</span>
|
|
97
97
|
<span class="cline-any cline-neutral"> </span>
|
|
98
|
-
<span class="cline-any cline-
|
|
98
|
+
<span class="cline-any cline-no"> </span>
|
|
99
99
|
<span class="cline-any cline-neutral"> </span>
|
|
100
100
|
<span class="cline-any cline-neutral"> </span>
|
|
101
101
|
<span class="cline-any cline-neutral"> </span>
|
|
102
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { logger } from
|
|
102
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { logger } from './logger.js';
|
|
103
103
|
|
|
104
104
|
/**
|
|
105
105
|
* Call a function safely: if it's a function call it with provided args and
|
|
@@ -109,11 +109,11 @@
|
|
|
109
109
|
* @param {...any} args
|
|
110
110
|
*/
|
|
111
111
|
export function safeCall(fn, ...args) {
|
|
112
|
-
if (typeof fn === 'function') {
|
|
112
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (typeof fn === 'function') {
|
|
113
113
|
try {
|
|
114
114
|
return fn(...args);
|
|
115
115
|
} catch (e) {
|
|
116
|
-
logger.error(
|
|
116
|
+
<span class="cstat-no" title="statement not covered" > logger.error('safeCall caught error', e);</span>
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
}
|
|
@@ -124,7 +124,7 @@ export function safeCall(fn, ...args) {
|
|
|
124
124
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
125
125
|
Code coverage generated by
|
|
126
126
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
127
|
-
at 2026-04-
|
|
127
|
+
at 2026-04-27T22:13:21.150Z
|
|
128
128
|
</div>
|
|
129
129
|
<script src="../prettify.js"></script>
|
|
130
130
|
<script>
|