cdd-cli 3.2.0 → 3.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/CHANGELOG.md +29 -0
- package/SECURITY.md +5 -0
- package/__mocks__/ink.cjs +17 -0
- package/coverage/clover.xml +526 -436
- package/coverage/coverage-final.json +19 -15
- package/coverage/lcov-report/components/ContainerCreationPrompt.jsx.html +376 -0
- package/coverage/lcov-report/components/PromptField.jsx.html +229 -0
- package/coverage/lcov-report/components/SuggestionPanel.jsx.html +244 -0
- package/coverage/lcov-report/components/index.html +146 -0
- package/coverage/lcov-report/helpers/constants.js.html +80 -17
- package/coverage/lcov-report/helpers/containerOptionsBuilder.js.html +41 -8
- 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 +27 -12
- package/coverage/lcov-report/helpers/logger.js.html +19 -19
- package/coverage/lcov-report/helpers/safeCall.js.html +3 -3
- package/coverage/lcov-report/helpers/validationHelpers.js.html +28 -76
- 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 +416 -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 +263 -122
- 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 +67 -52
- package/coverage/lcov.info +991 -805
- package/dist/App.js +11 -11
- package/dist/components/ContainerCreationPrompt.js +31 -10
- package/dist/components/ContainerList.js +3 -3
- package/dist/components/ContainerRow.js +20 -20
- package/dist/components/ContainerSection.js +3 -3
- 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 +44 -0
- package/dist/components/UsageMenu.js +3 -3
- package/dist/helpers/appInfo.js +7 -7
- package/dist/helpers/constants.js +114 -0
- package/dist/helpers/containerOptionsBuilder.js +3 -3
- 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 +9 -9
- package/dist/hooks/creation/useContainerCreation.js +138 -36
- package/dist/hooks/creation/useLogsViewer.js +2 -2
- package/dist/hooks/debug/useDebugLogs.js +4 -4
- package/dist/hooks/useContainerCommandRouter.js +13 -13
- package/dist/hooks/useContainers.js +3 -3
- package/dist/hooks/useControls.js +66 -35
- package/dist/hooks/useEraseConfirmation.js +3 -3
- package/dist/index.js +2 -2
- package/jest.config.cjs +7 -0
- package/package.json +7 -3
- package/src/App.jsx +33 -16
- package/src/components/ContainerCreationPrompt.jsx +43 -9
- package/src/components/ContainerList.jsx +3 -3
- package/src/components/ContainerRow.jsx +19 -16
- package/src/components/ContainerSection.jsx +3 -3
- 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 +53 -0
- package/src/components/UsageMenu.jsx +18 -13
- package/src/helpers/appInfo.js +7 -7
- package/src/helpers/constants.js +30 -9
- package/src/helpers/containerOptionsBuilder.js +16 -5
- 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 -15
- package/src/helpers/safeCall.js +2 -2
- package/src/helpers/validationHelpers.js +13 -29
- package/src/hooks/creation/useContainerActions.js +19 -12
- package/src/hooks/creation/useContainerCreation.js +150 -41
- 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 +115 -68
- package/src/hooks/useEraseConfirmation.js +3 -3
- package/src/hooks/useExitHandler.js +29 -26
- package/src/index.js +4 -4
- package/test/ContainerCreationPrompt.dom.test.js +68 -0
- package/test/SuggestionPanel.dom.test.js +53 -0
- package/test/constants.test.js +34 -0
- package/test/useContainerCreation.dom.test.js +123 -0
- package/test/useControls.dom.test.js +198 -2
|
@@ -99,7 +99,7 @@
|
|
|
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
|
|
@@ -113,7 +113,7 @@ export function safeCall(fn, ...args) {
|
|
|
113
113
|
try {
|
|
114
114
|
return fn(...args);
|
|
115
115
|
} catch (e) {
|
|
116
|
-
logger.error(
|
|
116
|
+
logger.error('safeCall caught error', e);
|
|
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-27T20:17:25.625Z
|
|
128
128
|
</div>
|
|
129
129
|
<script src="../prettify.js"></script>
|
|
130
130
|
<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">97.29% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>36/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">96.77% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>30/31</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
40
|
<span class="strong">100% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>5/5</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
47
|
<span class="strong">100% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>35/35</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -150,23 +150,8 @@
|
|
|
150
150
|
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
151
|
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
152
|
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
-
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
-
<
|
|
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
154
|
+
<span class="cline-any cline-neutral"> </span>
|
|
170
155
|
<span class="cline-any cline-neutral"> </span>
|
|
171
156
|
<span class="cline-any cline-neutral"> </span>
|
|
172
157
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -178,7 +163,10 @@
|
|
|
178
163
|
<span class="cline-any cline-neutral"> </span>
|
|
179
164
|
<span class="cline-any cline-neutral"> </span>
|
|
180
165
|
<span class="cline-any cline-yes">6x</span>
|
|
166
|
+
<span class="cline-any cline-yes">5x</span>
|
|
167
|
+
<span class="cline-any cline-neutral"> </span>
|
|
181
168
|
<span class="cline-any cline-yes">6x</span>
|
|
169
|
+
<span class="cline-any cline-neutral"> </span>
|
|
182
170
|
<span class="cline-any cline-yes">5x</span>
|
|
183
171
|
<span class="cline-any cline-yes">5x</span>
|
|
184
172
|
<span class="cline-any cline-yes">6x</span>
|
|
@@ -195,29 +183,6 @@
|
|
|
195
183
|
<span class="cline-any cline-neutral"> </span>
|
|
196
184
|
<span class="cline-any cline-neutral"> </span>
|
|
197
185
|
<span class="cline-any cline-neutral"> </span>
|
|
198
|
-
<span class="cline-any cline-yes">15x</span>
|
|
199
|
-
<span class="cline-any cline-neutral"> </span>
|
|
200
|
-
<span class="cline-any cline-yes">15x</span>
|
|
201
|
-
<span class="cline-any cline-yes">15x</span>
|
|
202
|
-
<span class="cline-any cline-yes">15x</span>
|
|
203
|
-
<span class="cline-any cline-yes">2x</span>
|
|
204
|
-
<span class="cline-any cline-neutral"> </span>
|
|
205
|
-
<span class="cline-any cline-neutral"> </span>
|
|
206
|
-
<span class="cline-any cline-yes">15x</span>
|
|
207
|
-
<span class="cline-any cline-yes">15x</span>
|
|
208
|
-
<span class="cline-any cline-yes">6x</span>
|
|
209
|
-
<span class="cline-any cline-neutral"> </span>
|
|
210
|
-
<span class="cline-any cline-yes">15x</span>
|
|
211
|
-
<span class="cline-any cline-neutral"> </span>
|
|
212
|
-
<span class="cline-any cline-neutral"> </span>
|
|
213
|
-
<span class="cline-any cline-neutral"> </span>
|
|
214
|
-
<span class="cline-any cline-neutral"> </span>
|
|
215
|
-
<span class="cline-any cline-neutral"> </span>
|
|
216
|
-
<span class="cline-any cline-neutral"> </span>
|
|
217
|
-
<span class="cline-any cline-neutral"> </span>
|
|
218
|
-
<span class="cline-any cline-neutral"> </span>
|
|
219
|
-
<span class="cline-any cline-neutral"> </span>
|
|
220
|
-
<span class="cline-any cline-neutral"> </span>
|
|
221
186
|
<span class="cline-any cline-neutral"> </span>
|
|
222
187
|
<span class="cline-any cline-neutral"> </span>
|
|
223
188
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -232,7 +197,10 @@
|
|
|
232
197
|
<span class="cline-any cline-yes">22x</span>
|
|
233
198
|
<span class="cline-any cline-neutral"> </span>
|
|
234
199
|
<span class="cline-any cline-yes">22x</span>
|
|
200
|
+
<span class="cline-any cline-yes">14x</span>
|
|
201
|
+
<span class="cline-any cline-neutral"> </span>
|
|
235
202
|
<span class="cline-any cline-yes">15x</span>
|
|
203
|
+
<span class="cline-any cline-neutral"> </span>
|
|
236
204
|
<span class="cline-any cline-yes">14x</span>
|
|
237
205
|
<span class="cline-any cline-yes">15x</span>
|
|
238
206
|
<span class="cline-any cline-yes">15x</span>
|
|
@@ -270,6 +238,7 @@
|
|
|
270
238
|
<span class="cline-any cline-yes">15x</span>
|
|
271
239
|
<span class="cline-any cline-neutral"> </span>
|
|
272
240
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">// Reusable validations for ports and environment variables
|
|
241
|
+
import { normalizeImageName } from './imageNameUtils.js';
|
|
273
242
|
|
|
274
243
|
/**
|
|
275
244
|
* Validate a comma-separated list of port mappings in the form "host:container".
|
|
@@ -281,38 +250,18 @@
|
|
|
281
250
|
export function validatePorts(portInput) {
|
|
282
251
|
// Empty or whitespace-only input is considered valid (ports are optional)
|
|
283
252
|
if (!portInput || !portInput.trim()) return true;
|
|
284
|
-
const ports = portInput
|
|
253
|
+
const ports = portInput
|
|
254
|
+
.split(',')
|
|
255
|
+
.map((p) => p.trim())
|
|
256
|
+
.filter(Boolean);
|
|
285
257
|
<span class="missing-if-branch" title="if path not taken" >I</span>if (ports.length === 0) <span class="cstat-no" title="statement not covered" >return true;</span>
|
|
286
|
-
const invalid = ports.find(pair => {
|
|
287
|
-
const [host, cont] = pair.split(
|
|
258
|
+
const invalid = ports.find((pair) => {
|
|
259
|
+
const [host, cont] = pair.split(':');
|
|
288
260
|
return !host || !cont || isNaN(Number(host)) || isNaN(Number(cont));
|
|
289
261
|
});
|
|
290
262
|
return !invalid;
|
|
291
263
|
}
|
|
292
264
|
|
|
293
|
-
/**
|
|
294
|
-
* Normalize an image name to its base name (strips registry prefix and tag).
|
|
295
|
-
* e.g. "docker.io/library/postgres:16-alpine" → "postgres"
|
|
296
|
-
*
|
|
297
|
-
* @param {string} imageName - Raw image name from user
|
|
298
|
-
* @returns {string} Base image name (lowercase)
|
|
299
|
-
*/
|
|
300
|
-
function normalizeImageName(imageName) {
|
|
301
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (!imageName) <span class="cstat-no" title="statement not covered" >return "";</span>
|
|
302
|
-
// Remove registry prefix (anything before the last / when it contains a dot or colon before the /)
|
|
303
|
-
let name = imageName;
|
|
304
|
-
const slashIdx = name.lastIndexOf("/");
|
|
305
|
-
if (slashIdx !== -1) {
|
|
306
|
-
name = name.slice(slashIdx + 1);
|
|
307
|
-
}
|
|
308
|
-
// Remove tag
|
|
309
|
-
const colonIdx = name.indexOf(":");
|
|
310
|
-
if (colonIdx !== -1) {
|
|
311
|
-
name = name.slice(0, colonIdx);
|
|
312
|
-
}
|
|
313
|
-
return name.toLowerCase();
|
|
314
|
-
}
|
|
315
|
-
|
|
316
265
|
/**
|
|
317
266
|
* Validate environment variable input as comma-separated VAR=value pairs.
|
|
318
267
|
*
|
|
@@ -335,9 +284,12 @@ export function validateEnvVars(envInput, imageName, imageProfiles) {
|
|
|
335
284
|
const syntaxErrors = [];
|
|
336
285
|
|
|
337
286
|
if (envInput && envInput.trim()) {
|
|
338
|
-
const vars = envInput
|
|
287
|
+
const vars = envInput
|
|
288
|
+
.split(',')
|
|
289
|
+
.map((v) => v.trim())
|
|
290
|
+
.filter(Boolean);
|
|
339
291
|
for (const v of vars) {
|
|
340
|
-
const eqIdx = v.indexOf(
|
|
292
|
+
const eqIdx = v.indexOf('=');
|
|
341
293
|
if (eqIdx === -1) {
|
|
342
294
|
syntaxErrors.push(`"${v}" is missing an '=' sign`);
|
|
343
295
|
continue;
|
|
@@ -364,7 +316,7 @@ export function validateEnvVars(envInput, imageName, imageProfiles) {
|
|
|
364
316
|
|
|
365
317
|
if (profile && profile.requiredEnv && profile.requiredEnv.length) {
|
|
366
318
|
for (const required of profile.requiredEnv) {
|
|
367
|
-
if (!parsedEnv[required] || parsedEnv[required].trim() ===
|
|
319
|
+
if (!parsedEnv[required] || parsedEnv[required].trim() === '') {
|
|
368
320
|
errors.push(`Missing required env var: ${required}`);
|
|
369
321
|
}
|
|
370
322
|
}
|
|
@@ -379,7 +331,7 @@ export function validateEnvVars(envInput, imageName, imageProfiles) {
|
|
|
379
331
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
380
332
|
Code coverage generated by
|
|
381
333
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
382
|
-
at 2026-04-
|
|
334
|
+
at 2026-04-27T20:17:25.625Z
|
|
383
335
|
</div>
|
|
384
336
|
<script src="../prettify.js"></script>
|
|
385
337
|
<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">69.06% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>96/139</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">75% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>39/52</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">
|
|
40
|
+
<span class="strong">60% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>12/20</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">69.62% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>94/135</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -94,18 +94,18 @@
|
|
|
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 high" data-value="useContainerCreation.js"><a href="useContainerCreation.js.html">useContainerCreation.js</a></td>
|
|
98
|
+
<td data-value="86.4" class="pic high">
|
|
99
|
+
<div class="chart"><div class="cover-fill" style="width: 86%"></div><div class="cover-empty" style="width: 14%"></div></div>
|
|
100
100
|
</td>
|
|
101
|
-
<td data-value="
|
|
102
|
-
<td data-value="
|
|
103
|
-
<td data-value="88" class="pct high">88%</td>
|
|
104
|
-
<td data-value="
|
|
105
|
-
<td data-value="
|
|
106
|
-
<td data-value="
|
|
107
|
-
<td data-value="
|
|
108
|
-
<td data-value="
|
|
101
|
+
<td data-value="86.4" class="pct high">86.4%</td>
|
|
102
|
+
<td data-value="103" class="abs high">89/103</td>
|
|
103
|
+
<td data-value="88.63" class="pct high">88.63%</td>
|
|
104
|
+
<td data-value="44" class="abs high">39/44</td>
|
|
105
|
+
<td data-value="90.9" class="pct high">90.9%</td>
|
|
106
|
+
<td data-value="11" class="abs high">10/11</td>
|
|
107
|
+
<td data-value="87" class="pct high">87%</td>
|
|
108
|
+
<td data-value="100" class="abs high">87/100</td>
|
|
109
109
|
</tr>
|
|
110
110
|
|
|
111
111
|
<tr>
|
|
@@ -131,7 +131,7 @@
|
|
|
131
131
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
132
132
|
Code coverage generated by
|
|
133
133
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
134
|
-
at 2026-04-
|
|
134
|
+
at 2026-04-27T20:17:25.625Z
|
|
135
135
|
</div>
|
|
136
136
|
<script src="../../prettify.js"></script>
|
|
137
137
|
<script>
|
|
@@ -132,7 +132,14 @@
|
|
|
132
132
|
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
133
|
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
134
|
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
-
<a name='L70'></a><a href='#L70'>70</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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
136
143
|
<span class="cline-any cline-neutral"> </span>
|
|
137
144
|
<span class="cline-any cline-neutral"> </span>
|
|
138
145
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -146,8 +153,13 @@
|
|
|
146
153
|
<span class="cline-any cline-neutral"> </span>
|
|
147
154
|
<span class="cline-any cline-neutral"> </span>
|
|
148
155
|
<span class="cline-any cline-neutral"> </span>
|
|
149
|
-
<span class="cline-any cline-
|
|
150
|
-
<span class="cline-any cline-
|
|
156
|
+
<span class="cline-any cline-neutral"> </span>
|
|
157
|
+
<span class="cline-any cline-neutral"> </span>
|
|
158
|
+
<span class="cline-any cline-neutral"> </span>
|
|
159
|
+
<span class="cline-any cline-neutral"> </span>
|
|
160
|
+
<span class="cline-any cline-neutral"> </span>
|
|
161
|
+
<span class="cline-any cline-yes">84x</span>
|
|
162
|
+
<span class="cline-any cline-yes">84x</span>
|
|
151
163
|
<span class="cline-any cline-neutral"> </span>
|
|
152
164
|
<span class="cline-any cline-neutral"> </span>
|
|
153
165
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -176,11 +188,13 @@
|
|
|
176
188
|
<span class="cline-any cline-no"> </span>
|
|
177
189
|
<span class="cline-any cline-neutral"> </span>
|
|
178
190
|
<span class="cline-any cline-no"> </span>
|
|
191
|
+
<span class="cline-any cline-neutral"> </span>
|
|
192
|
+
<span class="cline-any cline-neutral"> </span>
|
|
179
193
|
<span class="cline-any cline-no"> </span>
|
|
180
194
|
<span class="cline-any cline-neutral"> </span>
|
|
181
195
|
<span class="cline-any cline-neutral"> </span>
|
|
182
196
|
<span class="cline-any cline-neutral"> </span>
|
|
183
|
-
<span class="cline-any cline-yes">
|
|
197
|
+
<span class="cline-any cline-yes">84x</span>
|
|
184
198
|
<span class="cline-any cline-neutral"> </span>
|
|
185
199
|
<span class="cline-any cline-neutral"> </span>
|
|
186
200
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -201,9 +215,14 @@
|
|
|
201
215
|
<span class="cline-any cline-neutral"> </span>
|
|
202
216
|
<span class="cline-any cline-neutral"> </span>
|
|
203
217
|
<span class="cline-any cline-neutral"> </span>
|
|
204
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { useState } from
|
|
205
|
-
import { safeCall } from
|
|
206
|
-
import {
|
|
218
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { useState } from 'react';
|
|
219
|
+
import { safeCall } from '../../helpers/safeCall.js';
|
|
220
|
+
import {
|
|
221
|
+
startContainer as svcStartContainer,
|
|
222
|
+
stopContainer as svcStopContainer,
|
|
223
|
+
restartContainer as svcRestartContainer,
|
|
224
|
+
removeContainer as svcRemoveContainer,
|
|
225
|
+
} from '../../helpers/dockerService/serviceComponents/containerActions.js';
|
|
207
226
|
|
|
208
227
|
/**
|
|
209
228
|
* Custom hook to manage container actions (start, stop, restart, remove).
|
|
@@ -215,8 +234,8 @@ import { startContainer as svcStartContainer, stopContainer as svcStopContainer,
|
|
|
215
234
|
* @returns {Object} Action helpers and feedback state
|
|
216
235
|
*/
|
|
217
236
|
export function useContainerActions({ containers, onAction }) {
|
|
218
|
-
const [message, setMessage] = useState(
|
|
219
|
-
const [messageColor, setMessageColor] = useState(
|
|
237
|
+
const [message, setMessage] = useState('');
|
|
238
|
+
const [messageColor, setMessageColor] = useState('yellow');
|
|
220
239
|
|
|
221
240
|
/**
|
|
222
241
|
* Handles a generic container action and sets feedback.
|
|
@@ -232,20 +251,22 @@ export function useContainerActions({ containers, onAction }) {
|
|
|
232
251
|
const checkMsg = <span class="cstat-no" title="statement not covered" >stateCheck(container);</span>
|
|
233
252
|
<span class="cstat-no" title="statement not covered" > if (checkMsg) {</span>
|
|
234
253
|
<span class="cstat-no" title="statement not covered" > setMessage(checkMsg);</span>
|
|
235
|
-
<span class="cstat-no" title="statement not covered" > setMessageColor(
|
|
254
|
+
<span class="cstat-no" title="statement not covered" > setMessageColor('yellow');</span>
|
|
236
255
|
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
237
256
|
}
|
|
238
257
|
}
|
|
239
258
|
<span class="cstat-no" title="statement not covered" > setMessage(`${actionLabel} container...`);</span>
|
|
240
|
-
<span class="cstat-no" title="statement not covered" > setMessageColor(
|
|
259
|
+
<span class="cstat-no" title="statement not covered" > setMessageColor('yellow');</span>
|
|
241
260
|
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
242
261
|
<span class="cstat-no" title="statement not covered" > await actionFn(container.id);</span>
|
|
243
|
-
<span class="cstat-no" title="statement not covered" >
|
|
244
|
-
<span class="cstat-no" title="statement not covered" >
|
|
245
|
-
<span class="cstat-no" title="statement not covered" >
|
|
262
|
+
<span class="cstat-no" title="statement not covered" > setMessage(`${actionLabel} container successful.`);</span>
|
|
263
|
+
<span class="cstat-no" title="statement not covered" > setMessageColor('green');</span>
|
|
264
|
+
<span class="cstat-no" title="statement not covered" > safeCall(onAction);</span>
|
|
246
265
|
} catch (err) {
|
|
247
|
-
<span class="cstat-no" title="statement not covered" > setMessage(
|
|
248
|
-
|
|
266
|
+
<span class="cstat-no" title="statement not covered" > setMessage(</span>
|
|
267
|
+
`Failed to ${actionLabel.toLowerCase()} container: ${err.message}`
|
|
268
|
+
);
|
|
269
|
+
<span class="cstat-no" title="statement not covered" > setMessageColor('red');</span>
|
|
249
270
|
}
|
|
250
271
|
}
|
|
251
272
|
|
|
@@ -277,7 +298,7 @@ export function useContainerActions({ containers, onAction }) {
|
|
|
277
298
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
278
299
|
Code coverage generated by
|
|
279
300
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
280
|
-
at 2026-04-
|
|
301
|
+
at 2026-04-27T20:17:25.625Z
|
|
281
302
|
</div>
|
|
282
303
|
<script src="../../prettify.js"></script>
|
|
283
304
|
<script>
|