cdd-cli 3.2.2 → 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.
Files changed (74) hide show
  1. package/.~lock.ROADMAP.md# +1 -0
  2. package/CHANGELOG.md +51 -0
  3. package/README.es.md +198 -0
  4. package/README.md +81 -23
  5. package/ROADMAP.md +647 -0
  6. package/coverage/clover.xml +400 -519
  7. package/coverage/coverage-final.json +16 -20
  8. package/coverage/lcov-report/ContainerCreationPrompt.jsx.html +400 -0
  9. package/coverage/lcov-report/ControlsHUD.jsx.html +256 -0
  10. package/coverage/lcov-report/components/ContainerCreationPrompt.jsx.html +31 -13
  11. package/coverage/lcov-report/components/PromptField.jsx.html +4 -4
  12. package/coverage/lcov-report/components/SuggestionPanel.jsx.html +37 -13
  13. package/coverage/lcov-report/components/index.html +14 -14
  14. package/coverage/lcov-report/helpers/constants.js.html +87 -33
  15. package/coverage/lcov-report/helpers/containerOptionsBuilder.js.html +40 -40
  16. package/coverage/lcov-report/helpers/dockerHubService.js.html +310 -0
  17. package/coverage/lcov-report/helpers/dockerService/serviceComponents/containerActions.js.html +1 -1
  18. package/coverage/lcov-report/helpers/dockerService/serviceComponents/containerList.js.html +1 -1
  19. package/coverage/lcov-report/helpers/dockerService/serviceComponents/index.html +1 -1
  20. package/coverage/lcov-report/helpers/imageNameUtils.js.html +18 -18
  21. package/coverage/lcov-report/helpers/index.html +77 -62
  22. package/coverage/lcov-report/helpers/logger.js.html +60 -60
  23. package/coverage/lcov-report/helpers/safeCall.js.html +14 -14
  24. package/coverage/lcov-report/helpers/validationHelpers.js.html +52 -52
  25. package/coverage/lcov-report/hooks/creation/index.html +19 -19
  26. package/coverage/lcov-report/hooks/creation/useContainerActions.js.html +4 -4
  27. package/coverage/lcov-report/hooks/creation/useContainerCreation.js.html +225 -48
  28. package/coverage/lcov-report/hooks/creation/useLogsViewer.js.html +5 -5
  29. package/coverage/lcov-report/hooks/debug/index.html +1 -1
  30. package/coverage/lcov-report/hooks/debug/useDebugLogs.js.html +7 -7
  31. package/coverage/lcov-report/hooks/index.html +15 -15
  32. package/coverage/lcov-report/hooks/navigation/index.html +1 -1
  33. package/coverage/lcov-report/hooks/navigation/useContainerSelection.js.html +6 -6
  34. package/coverage/lcov-report/hooks/useContainerCommandRouter.js.html +13 -13
  35. package/coverage/lcov-report/hooks/useControls.js.html +82 -40
  36. package/coverage/lcov-report/hooks/useEraseConfirmation.js.html +5 -5
  37. package/coverage/lcov-report/hooks/useExitHandler.js.html +6 -6
  38. package/coverage/lcov-report/index.html +38 -68
  39. package/coverage/lcov.info +742 -981
  40. package/dist/App.js +7 -1
  41. package/dist/components/ContainerCreationPrompt.js +26 -10
  42. package/dist/components/ControlsHUD.js +106 -0
  43. package/dist/components/SuggestionPanel.js +16 -7
  44. package/dist/helpers/constants.js +60 -21
  45. package/dist/helpers/dockerHubService.js +111 -0
  46. package/dist/helpers/logger.js +1 -1
  47. package/dist/hooks/creation/useContainerActions.js +22 -5
  48. package/dist/hooks/creation/useContainerCreation.js +395 -107
  49. package/dist/hooks/useContainerCommandRouter.js +1 -1
  50. package/dist/hooks/useControls.js +23 -7
  51. package/dist/index.js +7 -0
  52. package/package.json +1 -1
  53. package/src/App.jsx +6 -0
  54. package/src/components/ContainerCreationPrompt.jsx +15 -5
  55. package/src/components/ControlsHUD.jsx +66 -0
  56. package/src/components/SuggestionPanel.jsx +10 -2
  57. package/src/helpers/constants.js +38 -20
  58. package/src/helpers/dockerHubService.js +75 -0
  59. package/src/helpers/logger.js +1 -2
  60. package/src/hooks/creation/useContainerActions.js +19 -6
  61. package/src/hooks/creation/useContainerCreation.js +224 -87
  62. package/src/hooks/useContainerCommandRouter.js +1 -1
  63. package/src/hooks/useControls.js +24 -8
  64. package/src/index.js +4 -0
  65. package/test/ContainerCreationPrompt.dom.test.js +245 -0
  66. package/test/ControlsHUD.dom.test.js +125 -0
  67. package/test/SuggestionPanel.dom.test.js +30 -0
  68. package/test/constants.test.js +7 -0
  69. package/test/dockerHubService.test.js +213 -0
  70. package/test/logger.test.js +58 -0
  71. package/test/resolveImageTag.test.js +26 -0
  72. package/test/useContainerCreation.dom.test.js +306 -3
  73. package/test/useContainerCreationHub.dom.test.js +184 -0
  74. package/test/useControls.dom.test.js +212 -6
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">97.29% </span>
26
+ <span class="strong">81.08% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>36/37</span>
28
+ <span class='fraction'>30/37</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">96.77% </span>
33
+ <span class="strong">77.41% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>30/31</span>
35
+ <span class='fraction'>24/31</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">100% </span>
47
+ <span class="strong">85.71% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>35/35</span>
49
+ <span class='fraction'>30/35</span>
50
50
  </div>
51
51
 
52
52
 
@@ -162,18 +162,17 @@
162
162
  <span class="cline-any cline-neutral">&nbsp;</span>
163
163
  <span class="cline-any cline-neutral">&nbsp;</span>
164
164
  <span class="cline-any cline-neutral">&nbsp;</span>
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">&nbsp;</span>
168
- <span class="cline-any cline-yes">6x</span>
165
+ <span class="cline-any cline-yes">1x</span>
166
+ <span class="cline-any cline-yes">1x</span>
169
167
  <span class="cline-any cline-neutral">&nbsp;</span>
170
- <span class="cline-any cline-yes">5x</span>
171
- <span class="cline-any cline-yes">5x</span>
172
- <span class="cline-any cline-yes">6x</span>
173
- <span class="cline-any cline-yes">6x</span>
168
+ <span class="cline-any cline-yes">1x</span>
174
169
  <span class="cline-any cline-neutral">&nbsp;</span>
175
- <span class="cline-any cline-yes">5x</span>
170
+ <span class="cline-any cline-yes">1x</span>
171
+ <span class="cline-any cline-yes">1x</span>
172
+ <span class="cline-any cline-yes">1x</span>
173
+ <span class="cline-any cline-yes">1x</span>
176
174
  <span class="cline-any cline-neutral">&nbsp;</span>
175
+ <span class="cline-any cline-yes">1x</span>
177
176
  <span class="cline-any cline-neutral">&nbsp;</span>
178
177
  <span class="cline-any cline-neutral">&nbsp;</span>
179
178
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -190,52 +189,53 @@
190
189
  <span class="cline-any cline-neutral">&nbsp;</span>
191
190
  <span class="cline-any cline-neutral">&nbsp;</span>
192
191
  <span class="cline-any cline-neutral">&nbsp;</span>
193
- <span class="cline-any cline-yes">22x</span>
194
192
  <span class="cline-any cline-neutral">&nbsp;</span>
193
+ <span class="cline-any cline-yes">7x</span>
195
194
  <span class="cline-any cline-neutral">&nbsp;</span>
196
- <span class="cline-any cline-yes">22x</span>
197
- <span class="cline-any cline-yes">22x</span>
198
195
  <span class="cline-any cline-neutral">&nbsp;</span>
199
- <span class="cline-any cline-yes">22x</span>
200
- <span class="cline-any cline-yes">14x</span>
196
+ <span class="cline-any cline-yes">7x</span>
197
+ <span class="cline-any cline-yes">7x</span>
201
198
  <span class="cline-any cline-neutral">&nbsp;</span>
202
- <span class="cline-any cline-yes">15x</span>
199
+ <span class="cline-any cline-yes">7x</span>
200
+ <span class="cline-any cline-yes">2x</span>
203
201
  <span class="cline-any cline-neutral">&nbsp;</span>
204
- <span class="cline-any cline-yes">14x</span>
205
- <span class="cline-any cline-yes">15x</span>
206
- <span class="cline-any cline-yes">15x</span>
207
- <span class="cline-any cline-yes">1x</span>
208
- <span class="cline-any cline-yes">1x</span>
202
+ <span class="cline-any cline-yes">2x</span>
209
203
  <span class="cline-any cline-neutral">&nbsp;</span>
210
- <span class="cline-any cline-yes">14x</span>
211
- <span class="cline-any cline-yes">14x</span>
212
- <span class="cline-any cline-yes">14x</span>
213
- <span class="cline-any cline-yes">3x</span>
214
- <span class="cline-any cline-yes">3x</span>
204
+ <span class="cline-any cline-yes">2x</span>
205
+ <span class="cline-any cline-yes">2x</span>
206
+ <span class="cline-any cline-yes">2x</span>
207
+ <span class="cline-any cline-no">&nbsp;</span>
208
+ <span class="cline-any cline-no">&nbsp;</span>
215
209
  <span class="cline-any cline-neutral">&nbsp;</span>
216
- <span class="cline-any cline-yes">11x</span>
210
+ <span class="cline-any cline-yes">2x</span>
211
+ <span class="cline-any cline-yes">2x</span>
212
+ <span class="cline-any cline-yes">2x</span>
213
+ <span class="cline-any cline-no">&nbsp;</span>
214
+ <span class="cline-any cline-no">&nbsp;</span>
217
215
  <span class="cline-any cline-neutral">&nbsp;</span>
216
+ <span class="cline-any cline-yes">2x</span>
218
217
  <span class="cline-any cline-neutral">&nbsp;</span>
219
218
  <span class="cline-any cline-neutral">&nbsp;</span>
220
- <span class="cline-any cline-yes">22x</span>
221
219
  <span class="cline-any cline-neutral">&nbsp;</span>
222
220
  <span class="cline-any cline-yes">7x</span>
223
221
  <span class="cline-any cline-neutral">&nbsp;</span>
222
+ <span class="cline-any cline-no">&nbsp;</span>
224
223
  <span class="cline-any cline-neutral">&nbsp;</span>
225
224
  <span class="cline-any cline-neutral">&nbsp;</span>
226
- <span class="cline-any cline-yes">15x</span>
227
- <span class="cline-any cline-yes">15x</span>
228
- <span class="cline-any cline-yes">15x</span>
229
225
  <span class="cline-any cline-neutral">&nbsp;</span>
230
- <span class="cline-any cline-yes">15x</span>
231
- <span class="cline-any cline-yes">6x</span>
232
- <span class="cline-any cline-yes">6x</span>
233
- <span class="cline-any cline-yes">3x</span>
226
+ <span class="cline-any cline-yes">7x</span>
227
+ <span class="cline-any cline-yes">7x</span>
228
+ <span class="cline-any cline-yes">7x</span>
234
229
  <span class="cline-any cline-neutral">&nbsp;</span>
230
+ <span class="cline-any cline-yes">7x</span>
231
+ <span class="cline-any cline-yes">2x</span>
232
+ <span class="cline-any cline-yes">2x</span>
233
+ <span class="cline-any cline-yes">1x</span>
235
234
  <span class="cline-any cline-neutral">&nbsp;</span>
236
235
  <span class="cline-any cline-neutral">&nbsp;</span>
237
236
  <span class="cline-any cline-neutral">&nbsp;</span>
238
- <span class="cline-any cline-yes">15x</span>
237
+ <span class="cline-any cline-neutral">&nbsp;</span>
238
+ <span class="cline-any cline-yes">7x</span>
239
239
  <span class="cline-any cline-neutral">&nbsp;</span>
240
240
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Reusable validations for ports and environment variables
241
241
  import { normalizeImageName } from './imageNameUtils.js';
@@ -249,7 +249,7 @@ import { normalizeImageName } from './imageNameUtils.js';
249
249
  */
250
250
  export function validatePorts(portInput) {
251
251
  // Empty or whitespace-only input is considered valid (ports are optional)
252
- if (!portInput || !portInput.trim()) return true;
252
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!portInput || !portInput.trim()) <span class="cstat-no" title="statement not covered" >return true;</span>
253
253
  const ports = portInput
254
254
  .split(',')
255
255
  .map((p) =&gt; p.trim())
@@ -257,7 +257,7 @@ export function validatePorts(portInput) {
257
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>
258
258
  const invalid = ports.find((pair) =&gt; {
259
259
  const [host, cont] = pair.split(':');
260
- return !host || !cont || isNaN(Number(host)) || isNaN(Number(cont));
260
+ return !host || !cont || <span class="branch-2 cbranch-no" title="branch not covered" >isNaN(Number(host)) </span>|| <span class="branch-3 cbranch-no" title="branch not covered" >isNaN(Number(cont));</span>
261
261
  });
262
262
  return !invalid;
263
263
  }
@@ -290,23 +290,23 @@ export function validateEnvVars(envInput, imageName, imageProfiles) {
290
290
  .filter(Boolean);
291
291
  for (const v of vars) {
292
292
  const eqIdx = v.indexOf('=');
293
- if (eqIdx === -1) {
294
- syntaxErrors.push(`"${v}" is missing an '=' sign`);
295
- continue;
293
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (eqIdx === -1) {
294
+ <span class="cstat-no" title="statement not covered" > syntaxErrors.push(`"${v}" is missing an '=' sign`);</span>
295
+ <span class="cstat-no" title="statement not covered" > continue;</span>
296
296
  }
297
297
  const varName = v.slice(0, eqIdx).trim();
298
298
  const varValue = v.slice(eqIdx + 1);
299
- if (!/^[A-Z_][A-Z0-9_]*$/i.test(varName)) {
300
- syntaxErrors.push(`"${varName}" is not a valid variable name`);
301
- continue;
299
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!/^[A-Z_][A-Z0-9_]*$/i.test(varName)) {
300
+ <span class="cstat-no" title="statement not covered" > syntaxErrors.push(`"${varName}" is not a valid variable name`);</span>
301
+ <span class="cstat-no" title="statement not covered" > continue;</span>
302
302
  }
303
303
  parsedEnv[varName] = varValue;
304
304
  }
305
305
  }
306
306
  &nbsp;
307
- if (!contextual) {
307
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!contextual) {
308
308
  // Legacy: return boolean
309
- return syntaxErrors.length === 0;
309
+ <span class="cstat-no" title="statement not covered" > return syntaxErrors.length === 0;</span>
310
310
  }
311
311
  &nbsp;
312
312
  // Contextual: also check required env vars from the profile
@@ -331,7 +331,7 @@ export function validateEnvVars(envInput, imageName, imageProfiles) {
331
331
  <div class='footer quiet pad2 space-top1 center small'>
332
332
  Code coverage generated by
333
333
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
334
- at 2026-04-27T20:17:25.625Z
334
+ at 2026-04-27T22:13:21.150Z
335
335
  </div>
336
336
  <script src="../prettify.js"></script>
337
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">69.06% </span>
26
+ <span class="strong">73.09% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>96/139</span>
28
+ <span class='fraction'>125/171</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">75% </span>
33
+ <span class="strong">75.8% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>39/52</span>
35
+ <span class='fraction'>47/62</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">60% </span>
40
+ <span class="strong">61.9% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>12/20</span>
42
+ <span class='fraction'>13/21</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">69.62% </span>
47
+ <span class="strong">73.61% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>94/135</span>
49
+ <span class='fraction'>120/163</span>
50
50
  </div>
51
51
 
52
52
 
@@ -95,17 +95,17 @@
95
95
 
96
96
  <tr>
97
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>
98
+ <td data-value="87.4" class="pic high">
99
+ <div class="chart"><div class="cover-fill" style="width: 87%"></div><div class="cover-empty" style="width: 13%"></div></div>
100
100
  </td>
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>
101
+ <td data-value="87.4" class="pct high">87.4%</td>
102
+ <td data-value="135" class="abs high">118/135</td>
103
+ <td data-value="87.03" class="pct high">87.03%</td>
104
+ <td data-value="54" class="abs high">47/54</td>
105
+ <td data-value="91.66" class="pct high">91.66%</td>
106
+ <td data-value="12" class="abs high">11/12</td>
107
+ <td data-value="88.28" class="pct high">88.28%</td>
108
+ <td data-value="128" class="abs high">113/128</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-27T20:17:25.625Z
134
+ at 2026-04-27T22:13:21.150Z
135
135
  </div>
136
136
  <script src="../../prettify.js"></script>
137
137
  <script>
@@ -158,8 +158,8 @@
158
158
  <span class="cline-any cline-neutral">&nbsp;</span>
159
159
  <span class="cline-any cline-neutral">&nbsp;</span>
160
160
  <span class="cline-any cline-neutral">&nbsp;</span>
161
- <span class="cline-any cline-yes">84x</span>
162
- <span class="cline-any cline-yes">84x</span>
161
+ <span class="cline-any cline-yes">96x</span>
162
+ <span class="cline-any cline-yes">96x</span>
163
163
  <span class="cline-any cline-neutral">&nbsp;</span>
164
164
  <span class="cline-any cline-neutral">&nbsp;</span>
165
165
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -194,7 +194,7 @@
194
194
  <span class="cline-any cline-neutral">&nbsp;</span>
195
195
  <span class="cline-any cline-neutral">&nbsp;</span>
196
196
  <span class="cline-any cline-neutral">&nbsp;</span>
197
- <span class="cline-any cline-yes">84x</span>
197
+ <span class="cline-any cline-yes">96x</span>
198
198
  <span class="cline-any cline-neutral">&nbsp;</span>
199
199
  <span class="cline-any cline-neutral">&nbsp;</span>
200
200
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -298,7 +298,7 @@ export function useContainerActions({ containers, onAction }) {
298
298
  <div class='footer quiet pad2 space-top1 center small'>
299
299
  Code coverage generated by
300
300
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
301
- at 2026-04-27T20:17:25.625Z
301
+ at 2026-04-27T22:13:21.150Z
302
302
  </div>
303
303
  <script src="../../prettify.js"></script>
304
304
  <script>