cdd-cli 3.1.9 → 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.
Files changed (130) hide show
  1. package/.atl/skill-registry.md +30 -0
  2. package/.editorconfig +12 -0
  3. package/.eslintrc.json +1 -1
  4. package/.prettierignore +4 -0
  5. package/.prettierrc +8 -0
  6. package/CHANGELOG.md +46 -0
  7. package/SECURITY.md +5 -0
  8. package/__mocks__/ink.cjs +17 -0
  9. package/coverage/clover.xml +694 -0
  10. package/coverage/coverage-final.json +21 -0
  11. package/coverage/lcov-report/base.css +224 -0
  12. package/coverage/lcov-report/block-navigation.js +87 -0
  13. package/coverage/lcov-report/components/ContainerCreationPrompt.jsx.html +376 -0
  14. package/coverage/lcov-report/components/PromptField.jsx.html +229 -0
  15. package/coverage/lcov-report/components/SuggestionPanel.jsx.html +244 -0
  16. package/coverage/lcov-report/components/index.html +146 -0
  17. package/coverage/lcov-report/favicon.png +0 -0
  18. package/coverage/lcov-report/helpers/constants.js.html +298 -0
  19. package/coverage/lcov-report/helpers/containerOptionsBuilder.js.html +244 -0
  20. package/coverage/lcov-report/helpers/dockerService/serviceComponents/containerActions.js.html +931 -0
  21. package/coverage/lcov-report/helpers/dockerService/serviceComponents/containerList.js.html +307 -0
  22. package/coverage/lcov-report/helpers/dockerService/serviceComponents/index.html +131 -0
  23. package/coverage/lcov-report/helpers/imageNameUtils.js.html +181 -0
  24. package/coverage/lcov-report/helpers/index.html +191 -0
  25. package/coverage/lcov-report/helpers/logger.js.html +424 -0
  26. package/coverage/lcov-report/helpers/safeCall.js.html +139 -0
  27. package/coverage/lcov-report/helpers/validationHelpers.js.html +346 -0
  28. package/coverage/lcov-report/hooks/creation/index.html +146 -0
  29. package/coverage/lcov-report/hooks/creation/useContainerActions.js.html +313 -0
  30. package/coverage/lcov-report/hooks/creation/useContainerCreation.js.html +805 -0
  31. package/coverage/lcov-report/hooks/creation/useLogsViewer.js.html +238 -0
  32. package/coverage/lcov-report/hooks/debug/index.html +116 -0
  33. package/coverage/lcov-report/hooks/debug/useDebugLogs.js.html +187 -0
  34. package/coverage/lcov-report/hooks/index.html +161 -0
  35. package/coverage/lcov-report/hooks/navigation/index.html +116 -0
  36. package/coverage/lcov-report/hooks/navigation/useContainerSelection.js.html +169 -0
  37. package/coverage/lcov-report/hooks/useContainerCommandRouter.js.html +454 -0
  38. package/coverage/lcov-report/hooks/useControls.js.html +826 -0
  39. package/coverage/lcov-report/hooks/useEraseConfirmation.js.html +202 -0
  40. package/coverage/lcov-report/hooks/useExitHandler.js.html +292 -0
  41. package/coverage/lcov-report/index.html +206 -0
  42. package/coverage/lcov-report/prettify.css +1 -0
  43. package/coverage/lcov-report/prettify.js +2 -0
  44. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  45. package/coverage/lcov-report/sorter.js +210 -0
  46. package/coverage/lcov.info +1402 -0
  47. package/dist/App.js +11 -11
  48. package/dist/components/ContainerCreationPrompt.js +31 -10
  49. package/dist/components/ContainerList.js +3 -3
  50. package/dist/components/ContainerRow.js +20 -20
  51. package/dist/components/ContainerSection.js +3 -3
  52. package/dist/components/Footer.js +2 -2
  53. package/dist/components/Header.js +7 -7
  54. package/dist/components/LogViewer.js +3 -3
  55. package/dist/components/MessageFeedback.js +2 -2
  56. package/dist/components/PromptField.js +4 -4
  57. package/dist/components/StatsBar.js +5 -5
  58. package/dist/components/SuggestionPanel.js +44 -0
  59. package/dist/components/UsageMenu.js +3 -3
  60. package/dist/helpers/appInfo.js +7 -7
  61. package/dist/helpers/constants.js +114 -0
  62. package/dist/helpers/containerOptionsBuilder.js +3 -3
  63. package/dist/helpers/dockerService/dockerService.js +1 -1
  64. package/dist/helpers/dockerService/serviceComponents/containerActions.js +99 -40
  65. package/dist/helpers/dockerService/serviceComponents/containerList.js +11 -11
  66. package/dist/helpers/dockerService/serviceComponents/containerLogs.js +9 -9
  67. package/dist/helpers/dockerService/serviceComponents/containerStats.js +5 -5
  68. package/dist/helpers/dockerService/serviceComponents/imageUtils.js +1 -1
  69. package/dist/helpers/exitWithMessage.js +10 -10
  70. package/dist/helpers/imageNameUtils.js +32 -0
  71. package/dist/helpers/logger.js +13 -13
  72. package/dist/helpers/safeCall.js +2 -2
  73. package/dist/helpers/validationHelpers.js +76 -21
  74. package/dist/hooks/creation/useContainerActions.js +9 -9
  75. package/dist/hooks/creation/useContainerCreation.js +138 -36
  76. package/dist/hooks/creation/useLogsViewer.js +2 -2
  77. package/dist/hooks/debug/useDebugLogs.js +4 -4
  78. package/dist/hooks/useContainerCommandRouter.js +13 -13
  79. package/dist/hooks/useContainers.js +3 -3
  80. package/dist/hooks/useControls.js +66 -35
  81. package/dist/hooks/useEraseConfirmation.js +3 -3
  82. package/dist/index.js +2 -2
  83. package/jest.config.cjs +7 -0
  84. package/package.json +7 -3
  85. package/src/App.jsx +33 -16
  86. package/src/components/ContainerCreationPrompt.jsx +43 -9
  87. package/src/components/ContainerList.jsx +3 -3
  88. package/src/components/ContainerRow.jsx +19 -16
  89. package/src/components/ContainerSection.jsx +3 -3
  90. package/src/components/Footer.jsx +2 -2
  91. package/src/components/Header.jsx +7 -7
  92. package/src/components/LogViewer.jsx +5 -3
  93. package/src/components/MessageFeedback.jsx +2 -2
  94. package/src/components/PromptField.jsx +4 -4
  95. package/src/components/StatsBar.jsx +11 -7
  96. package/src/components/SuggestionPanel.jsx +53 -0
  97. package/src/components/UsageMenu.jsx +18 -13
  98. package/src/helpers/appInfo.js +7 -7
  99. package/src/helpers/constants.js +41 -0
  100. package/src/helpers/containerOptionsBuilder.js +16 -5
  101. package/src/helpers/dockerService/dockerService.js +1 -1
  102. package/src/helpers/dockerService/serviceComponents/containerActions.js +116 -43
  103. package/src/helpers/dockerService/serviceComponents/containerList.js +31 -25
  104. package/src/helpers/dockerService/serviceComponents/containerLogs.js +41 -26
  105. package/src/helpers/dockerService/serviceComponents/containerStats.js +13 -11
  106. package/src/helpers/dockerService/serviceComponents/imageUtils.js +5 -4
  107. package/src/helpers/exitWithMessage.js +13 -7
  108. package/src/helpers/imageNameUtils.js +32 -0
  109. package/src/helpers/logger.js +15 -15
  110. package/src/helpers/safeCall.js +2 -2
  111. package/src/helpers/validationHelpers.js +62 -21
  112. package/src/hooks/creation/useContainerActions.js +19 -12
  113. package/src/hooks/creation/useContainerCreation.js +161 -37
  114. package/src/hooks/creation/useLogsViewer.js +2 -2
  115. package/src/hooks/debug/useDebugLogs.js +15 -10
  116. package/src/hooks/navigation/useContainerSelection.js +17 -14
  117. package/src/hooks/useContainerCommandRouter.js +71 -58
  118. package/src/hooks/useContainers.js +4 -4
  119. package/src/hooks/useControls.js +120 -68
  120. package/src/hooks/useEraseConfirmation.js +3 -3
  121. package/src/hooks/useExitHandler.js +29 -26
  122. package/src/index.js +4 -4
  123. package/test/ContainerCreationPrompt.dom.test.js +68 -0
  124. package/test/SuggestionPanel.dom.test.js +53 -0
  125. package/test/constants.test.js +34 -0
  126. package/test/containerActions.test.js +104 -13
  127. package/test/containerOptionsBuilder.test.js +36 -0
  128. package/test/useContainerCreation.dom.test.js +166 -2
  129. package/test/useControls.dom.test.js +313 -0
  130. package/test/validationHelpers.test.js +51 -0
@@ -1,10 +1,13 @@
1
1
  let validatePorts;
2
2
  let validateEnvVars;
3
+ let IMAGE_PROFILES;
3
4
 
4
5
  beforeAll(async () => {
5
6
  const mod = await import('../src/helpers/validationHelpers.js');
6
7
  validatePorts = mod.validatePorts;
7
8
  validateEnvVars = mod.validateEnvVars;
9
+ const constants = await import('../src/helpers/constants.js');
10
+ IMAGE_PROFILES = constants.IMAGE_PROFILES;
8
11
  });
9
12
 
10
13
  describe('validatePorts', () => {
@@ -58,3 +61,51 @@ describe('validateEnvVars', () => {
58
61
  expect(validateEnvVars('MY-VAR=value')).toBe(false);
59
62
  });
60
63
  });
64
+
65
+ describe('validateEnvVars — contextual validation with IMAGE_PROFILES', () => {
66
+ test('mysql:8 — missing MYSQL_ROOT_PASSWORD is invalid', () => {
67
+ const result = validateEnvVars('FOO=bar', 'mysql:8', IMAGE_PROFILES);
68
+ expect(result.valid).toBe(false);
69
+ expect(result.errors.some(e => e.includes('MYSQL_ROOT_PASSWORD'))).toBe(true);
70
+ });
71
+
72
+ test('mysql:8 — with MYSQL_ROOT_PASSWORD is valid', () => {
73
+ const result = validateEnvVars('MYSQL_ROOT_PASSWORD=secret', 'mysql:8', IMAGE_PROFILES);
74
+ expect(result.valid).toBe(true);
75
+ expect(result.errors).toHaveLength(0);
76
+ });
77
+
78
+ test('docker.io/library/postgres:16 — missing POSTGRES_PASSWORD is invalid', () => {
79
+ const result = validateEnvVars('', 'docker.io/library/postgres:16', IMAGE_PROFILES);
80
+ expect(result.valid).toBe(false);
81
+ expect(result.errors.some(e => e.includes('POSTGRES_PASSWORD'))).toBe(true);
82
+ });
83
+
84
+ test('docker.io/library/postgres:16 — with POSTGRES_PASSWORD is valid', () => {
85
+ const result = validateEnvVars('POSTGRES_PASSWORD=pass', 'docker.io/library/postgres:16', IMAGE_PROFILES);
86
+ expect(result.valid).toBe(true);
87
+ });
88
+
89
+ test('TOKEN=a=b is preserved (split on first = only)', () => {
90
+ const result = validateEnvVars('TOKEN=a=b', 'nginx', IMAGE_PROFILES);
91
+ expect(result.valid).toBe(true);
92
+ expect(result.parsedEnv['TOKEN']).toBe('a=b');
93
+ });
94
+
95
+ test('image not in profiles — only syntactic validation applies', () => {
96
+ const result = validateEnvVars('FOO=bar', 'nginx', IMAGE_PROFILES);
97
+ expect(result.valid).toBe(true);
98
+ expect(result.parsedEnv['FOO']).toBe('bar');
99
+ });
100
+
101
+ test('empty input for image not in profiles — valid', () => {
102
+ const result = validateEnvVars('', 'nginx', IMAGE_PROFILES);
103
+ expect(result.valid).toBe(true);
104
+ expect(result.parsedEnv).toEqual({});
105
+ });
106
+
107
+ test('syntactically invalid var is still rejected', () => {
108
+ const result = validateEnvVars('INVALID-VAR=x', 'nginx', IMAGE_PROFILES);
109
+ expect(result.valid).toBe(false);
110
+ });
111
+ });