cdd-cli 3.0.0 → 3.1.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 (66) hide show
  1. package/.github/workflows/ci.yml +29 -0
  2. package/CHANGELOG.md +27 -0
  3. package/CODE_OF_CONDUCT.md +12 -0
  4. package/CONTRIBUTING.md +22 -0
  5. package/LICENSE +23 -0
  6. package/README.md +73 -161
  7. package/SECURITY.md +5 -0
  8. package/babel.config.cjs +6 -0
  9. package/dist/App.js +38 -24
  10. package/dist/cdd.bundle.js +8 -0
  11. package/dist/components/ContainerCreationPrompt.js +48 -0
  12. package/dist/components/ContainerCreator.js +81 -0
  13. package/dist/components/ContainerList.js +24 -4
  14. package/dist/components/ContainerRow.js +66 -13
  15. package/dist/components/ContainerSection.js +14 -0
  16. package/dist/components/Footer.js +10 -0
  17. package/dist/components/PromptField.js +20 -0
  18. package/dist/components/UsageMenu.js +8 -0
  19. package/dist/helpers/actionHelpers.js +0 -1
  20. package/dist/helpers/dockerActions.js +13 -0
  21. package/dist/helpers/dockerService/dockerService.js +5 -0
  22. package/dist/helpers/dockerService/serviceComponents/containerActions.js +163 -0
  23. package/dist/helpers/dockerService/serviceComponents/containerList.js +57 -0
  24. package/dist/helpers/dockerService/serviceComponents/containerLogs.js +24 -0
  25. package/dist/helpers/dockerService/serviceComponents/containerStats.js +50 -0
  26. package/dist/helpers/dockerService/serviceComponents/imageUtils.js +52 -0
  27. package/dist/helpers/dockerService.js +111 -0
  28. package/dist/helpers/validationHelpers.js +26 -0
  29. package/dist/hooks/creation/useContainerActions.js +171 -0
  30. package/dist/hooks/creation/useContainerCreation.js +141 -0
  31. package/dist/hooks/creation/useLogsViewer.js +62 -0
  32. package/dist/hooks/useContainers.js +11 -1
  33. package/dist/hooks/useControls.js +298 -78
  34. package/dist/hooks/useLogsStream.js +1 -1
  35. package/dist/index.js +11 -0
  36. package/esbuild.config.cjs +11 -0
  37. package/jest.config.cjs +6 -0
  38. package/package.json +10 -6
  39. package/src/App.jsx +43 -26
  40. package/src/components/ContainerCreationPrompt.jsx +37 -0
  41. package/src/components/ContainerList.jsx +23 -6
  42. package/src/components/ContainerRow.jsx +36 -19
  43. package/src/components/ContainerSection.jsx +10 -0
  44. package/src/components/Footer.jsx +10 -0
  45. package/src/components/PromptField.jsx +18 -0
  46. package/src/components/UsageMenu.jsx +17 -0
  47. package/src/helpers/actionHelpers.js +0 -1
  48. package/src/helpers/dockerService/dockerService.js +3 -0
  49. package/src/helpers/dockerService/serviceComponents/containerActions.js +52 -0
  50. package/src/helpers/dockerService/serviceComponents/containerList.js +26 -0
  51. package/src/helpers/dockerService/serviceComponents/containerLogs.js +19 -0
  52. package/src/helpers/dockerService/serviceComponents/containerStats.js +34 -0
  53. package/src/helpers/dockerService/serviceComponents/imageUtils.js +21 -0
  54. package/src/helpers/validationHelpers.js +16 -0
  55. package/src/hooks/creation/useContainerActions.js +68 -0
  56. package/src/hooks/creation/useContainerCreation.js +104 -0
  57. package/src/hooks/creation/useLogsViewer.js +50 -0
  58. package/src/hooks/useContainers.js +11 -1
  59. package/src/hooks/useControls.js +176 -55
  60. package/src/hooks/useLogsStream.js +1 -1
  61. package/src/index.js +13 -0
  62. package/test/validationHelpers.test.js +28 -0
  63. package/PLAN_KEYBINDINGS_Y_REALTIME.md +0 -260
  64. package/src/components/StatsViewer.jsx +0 -0
  65. package/src/helpers/dockerActions.js +0 -39
  66. package/src/helpers/dockerService.js +0 -88
@@ -0,0 +1,81 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7
+ import React from "react";
8
+ import { Box, Text } from "ink";
9
+ import { createContainer } from "../helpers/dockerService.js";
10
+ export default function ContainerCreator(_ref) {
11
+ var onClose = _ref.onClose;
12
+ var _React$useState = React.useState(""),
13
+ _React$useState2 = _slicedToArray(_React$useState, 2),
14
+ imageName = _React$useState2[0],
15
+ setImageName = _React$useState2[1];
16
+ var _React$useState3 = React.useState(""),
17
+ _React$useState4 = _slicedToArray(_React$useState3, 2),
18
+ message = _React$useState4[0],
19
+ setMessage = _React$useState4[1];
20
+ var handleInput = function handleInput(data) {
21
+ var _char = String(data);
22
+ if (_char === "\r") {
23
+ // Enter key
24
+ if (imageName.trim() === "") {
25
+ setMessage("Image name cannot be empty.");
26
+ return;
27
+ }
28
+ createContainer(imageName.trim()).then(function (id) {
29
+ setMessage("Container created with ID: ".concat(id));
30
+ setTimeout(onClose, 2000);
31
+ })["catch"](function (err) {
32
+ setMessage("Error: ".concat(err.message));
33
+ });
34
+ } else if (_char === "\x03") {
35
+ // Ctrl+C
36
+ onClose();
37
+ } else if (_char === "\x7F") {
38
+ // Backspace
39
+ setImageName(function (prev) {
40
+ return prev.slice(0, -1);
41
+ });
42
+ } else {
43
+ setImageName(function (prev) {
44
+ return prev + _char;
45
+ });
46
+ }
47
+ };
48
+ React.useEffect(function () {
49
+ process.stdin.setRawMode(true);
50
+ process.stdin.resume();
51
+ process.stdin.on("data", handleInput);
52
+ return function () {
53
+ process.stdin.setRawMode(false);
54
+ process.stdin.pause();
55
+ process.stdin.removeListener("data", handleInput);
56
+ };
57
+ }, [imageName]);
58
+ return /*#__PURE__*/React.createElement(Box, {
59
+ flexDirection: "column",
60
+ borderStyle: "round",
61
+ borderColor: "yellow",
62
+ padding: 1
63
+ }, /*#__PURE__*/React.createElement(Text, null, "Enter Docker Image Name:"), /*#__PURE__*/React.createElement(Text, {
64
+ color: "cyan"
65
+ }, imageName, "_"), message && /*#__PURE__*/React.createElement(Text, {
66
+ color: "green"
67
+ }, message), /*#__PURE__*/React.createElement(Text, {
68
+ dimColor: true
69
+ }, "Press Enter to create or Ctrl+C to cancel"));
70
+ }
71
+
72
+ /**
73
+ * Docker service helper functions.
74
+ * Funciones auxiliares para el servicio Docker.
75
+ *
76
+ * @module dockerService
77
+ * @example
78
+ * // EN: Create a new container
79
+ * // ES: Crear un nuevo contenedor
80
+ * const containerId = await createContainer("my-image");
81
+ * */
@@ -1,6 +1,19 @@
1
+ /**
2
+ * List component for Docker containers.
3
+ * Componente de lista para contenedores Docker.
4
+ *
5
+ * @component
6
+ * @param {Object} props - Component props / Props del componente
7
+ * @param {Array} props.containers - Containers to display / Contenedores a mostrar
8
+ * @returns {JSX.Element} Rendered list / Lista renderizada
9
+ * @example
10
+ * // EN: Render with containers
11
+ * // ES: Renderizar con contenedores
12
+ * <ContainerList containers={containers} />
13
+ */
1
14
  import React from "react";
2
15
  import { Box, Text } from "ink";
3
- import ContainerRow from "./ContainerRow.js";
16
+ import ContainerRow from "./ContainerRow.jsx";
4
17
  export default function ContainerList(_ref) {
5
18
  var containers = _ref.containers,
6
19
  selected = _ref.selected;
@@ -8,12 +21,19 @@ export default function ContainerList(_ref) {
8
21
  return /*#__PURE__*/React.createElement(Box, {
9
22
  key: container.id,
10
23
  flexDirection: "row",
11
- alignItems: "center"
24
+ alignItems: "flex-start"
25
+ }, /*#__PURE__*/React.createElement(Box, {
26
+ width: 2,
27
+ minWidth: 2,
28
+ justifyContent: "flex-end"
12
29
  }, /*#__PURE__*/React.createElement(Text, {
13
30
  color: i === selected ? "green" : undefined
14
- }, i === selected ? "➤" : " "), /*#__PURE__*/React.createElement(ContainerRow, {
31
+ }, i === selected ? "➤" : " ")), /*#__PURE__*/React.createElement(Box, {
32
+ flexGrow: 1,
33
+ paddingLeft: 1
34
+ }, /*#__PURE__*/React.createElement(ContainerRow, {
15
35
  container: container,
16
36
  isSelected: i === selected
17
- }));
37
+ })));
18
38
  }));
19
39
  }
@@ -10,14 +10,25 @@ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" !=
10
10
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
11
11
  import React, { useState, useEffect } from "react";
12
12
  import { Box, Text } from "ink";
13
- import chalk from "chalk";
14
- import { getStats } from "../helpers/dockerService.js";
15
- import StatsBar from "./StatsBar.js";
16
- var colorByState = function colorByState(state) {
17
- if (state === "running") return chalk.greenBright("🟢 RUNNING");
18
- if (state === "exited") return chalk.redBright("🔴 EXITED");
19
- if (state === "paused") return chalk.yellowBright("🟠 PAUSED");
20
- return chalk.gray(state.toUpperCase());
13
+ import { getStats } from "../helpers/dockerService/serviceComponents/containerStats.js";
14
+ import StatsBar from "./StatsBar.jsx";
15
+ var stateText = function stateText(state) {
16
+ if (state === "running") return {
17
+ text: "🟢 RUNNING",
18
+ color: "green"
19
+ };
20
+ if (state === "exited") return {
21
+ text: "🔴 EXITED",
22
+ color: "red"
23
+ };
24
+ if (state === "paused") return {
25
+ text: "🟠 PAUSED",
26
+ color: "yellow"
27
+ };
28
+ return {
29
+ text: state.toUpperCase(),
30
+ color: "gray"
31
+ };
21
32
  };
22
33
  export default function ContainerRow(_ref) {
23
34
  var container = _ref.container;
@@ -36,23 +47,54 @@ export default function ContainerRow(_ref) {
36
47
  _useState2 = _slicedToArray(_useState, 2),
37
48
  stats = _useState2[0],
38
49
  setStats = _useState2[1];
50
+
51
+ // Formatear puertos
52
+ var formatPorts = function formatPorts(ports) {
53
+ if (!ports || ports.length === 0) return "";
54
+ if (Array.isArray(ports)) {
55
+ return ports.map(function (p, i) {
56
+ return " \uD83D\uDD17 ".concat(p);
57
+ }).join(" ");
58
+ }
59
+ return " \uD83D\uDD17 ".concat(ports);
60
+ };
61
+ var _useState3 = useState(""),
62
+ _useState4 = _slicedToArray(_useState3, 2),
63
+ statsError = _useState4[0],
64
+ setStatsError = _useState4[1];
39
65
  useEffect(function () {
40
66
  if (state !== "running") return;
41
67
  var fetchStats = /*#__PURE__*/function () {
42
68
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
43
- var s;
69
+ var s, _t;
44
70
  return _regenerator().w(function (_context) {
45
- while (1) switch (_context.n) {
71
+ while (1) switch (_context.p = _context.n) {
46
72
  case 0:
73
+ _context.p = 0;
47
74
  _context.n = 1;
48
75
  return getStats(id);
49
76
  case 1:
50
77
  s = _context.v;
51
78
  setStats(s);
79
+ setStatsError("");
80
+ _context.n = 3;
81
+ break;
52
82
  case 2:
83
+ _context.p = 2;
84
+ _t = _context.v;
85
+ setStats({
86
+ cpuPercent: 0,
87
+ memPercent: 0,
88
+ netIO: {
89
+ rx: 0,
90
+ tx: 0
91
+ }
92
+ });
93
+ setStatsError("Error fetching stats");
94
+ case 3:
53
95
  return _context.a(2);
54
96
  }
55
- }, _callee);
97
+ }, _callee, null, [[0, 2]]);
56
98
  }));
57
99
  return function fetchStats() {
58
100
  return _ref2.apply(this, arguments);
@@ -64,11 +106,22 @@ export default function ContainerRow(_ref) {
64
106
  return clearInterval(timer);
65
107
  };
66
108
  }, [id, state]);
109
+ var stateInfo = stateText(state);
67
110
  return /*#__PURE__*/React.createElement(Box, {
68
111
  flexDirection: "column",
69
112
  marginBottom: 1
70
- }, /*#__PURE__*/React.createElement(Text, null, chalk.cyan(name.padEnd(20)), " ", chalk.gray(image.padEnd(20)), " ", state === "running" ? chalk.greenBright("🟢 RUNNING") : chalk.redBright("\uD83D\uDD34 ".concat(state.toUpperCase())), " ", chalk.yellow(container.ports), " ", state === "running" && /*#__PURE__*/React.createElement(StatsBar, {
113
+ }, /*#__PURE__*/React.createElement(Box, null, /*#__PURE__*/React.createElement(Text, {
114
+ color: "cyan"
115
+ }, name.padEnd(20)), /*#__PURE__*/React.createElement(Text, {
116
+ color: "gray"
117
+ }, image.padEnd(20)), /*#__PURE__*/React.createElement(Text, {
118
+ color: stateInfo.color
119
+ }, stateInfo.text), /*#__PURE__*/React.createElement(Text, {
120
+ color: "yellow"
121
+ }, formatPorts(container.ports)), state === "running" && /*#__PURE__*/React.createElement(Text, null, " "), state === "running" && /*#__PURE__*/React.createElement(StatsBar, {
71
122
  cpu: parseFloat(stats.cpuPercent),
72
123
  mem: parseFloat(stats.memPercent)
73
- })));
124
+ }), state === "running" && statsError && /*#__PURE__*/React.createElement(Text, {
125
+ color: "red"
126
+ }, statsError)));
74
127
  }
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import { Text } from "ink";
3
+ import ContainerList from "./ContainerList.jsx";
4
+ export default function ContainerSection(_ref) {
5
+ var containers = _ref.containers,
6
+ selected = _ref.selected;
7
+ if (containers.length === 0) {
8
+ return /*#__PURE__*/React.createElement(Text, null, "No containers found");
9
+ }
10
+ return /*#__PURE__*/React.createElement(ContainerList, {
11
+ containers: containers,
12
+ selected: selected
13
+ });
14
+ }
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ export default function Footer() {
4
+ return /*#__PURE__*/React.createElement(Box, {
5
+ justifyContent: "flex-end",
6
+ width: "100%"
7
+ }, /*#__PURE__*/React.createElement(Text, {
8
+ dimColor: true
9
+ }, "Crafted by Carlos Cochero \u2022 2025"));
10
+ }
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import { Text } from "ink";
3
+ export function PromptField(_ref) {
4
+ var label = _ref.label,
5
+ value = _ref.value,
6
+ required = _ref.required;
7
+ // If the field is required and empty, show in red
8
+ var isEmpty = required && !value.trim();
9
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Text, null, label), /*#__PURE__*/React.createElement(Text, {
10
+ color: isEmpty ? "red" : "cyan"
11
+ }, value, "_"));
12
+ }
13
+ export function PromptMessage(_ref2) {
14
+ var message = _ref2.message,
15
+ color = _ref2.color;
16
+ if (!message) return null;
17
+ return /*#__PURE__*/React.createElement(Text, {
18
+ color: color || "yellow"
19
+ }, message);
20
+ }
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ export default function UsageMenu() {
4
+ return /*#__PURE__*/React.createElement(Box, {
5
+ flexDirection: "column",
6
+ marginTop: 1
7
+ }, /*#__PURE__*/React.createElement(Text, null, "Use \u2191/\u2193 for navigation"), /*#__PURE__*/React.createElement(Text, null, "\u2022I to initiate selected container"), /*#__PURE__*/React.createElement(Text, null, "\u2022P to stop selected container"), /*#__PURE__*/React.createElement(Text, null, "\u2022R to restart selected container"), /*#__PURE__*/React.createElement(Text, null, "\u2022C to create a container"), /*#__PURE__*/React.createElement(Text, null, "\u2022L to view logs of selected container"), /*#__PURE__*/React.createElement(Text, null, "\u2022E to remove selected container"), /*#__PURE__*/React.createElement(Text, null, "\u2022Q to quit"));
8
+ }
@@ -2,7 +2,6 @@ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present,
2
2
  function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
3
3
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
4
4
  function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
5
- // Helper para manejar acciones docker con feedback visual y validación
6
5
  export function handleAction(_x) {
7
6
  return _handleAction.apply(this, arguments);
8
7
  }
@@ -1,3 +1,16 @@
1
+ /**
2
+ * Run a Docker action by name (start, stop, remove).
3
+ * Ejecuta una acción Docker por nombre (start, stop, remove).
4
+ *
5
+ * @param {string} action - Action to perform / Acción a realizar
6
+ * @param {string} container - Container name / Nombre del contenedor
7
+ * @returns {Promise<boolean>} True if successful / True si es exitoso
8
+ * @throws {Error} If Docker is not running / Si Docker no está corriendo
9
+ * @example
10
+ * // EN: Start a container
11
+ * // ES: Iniciar un contenedor
12
+ * await runDockerAction('start', 'my_container');
13
+ */
1
14
  import { spawn } from "child_process";
2
15
 
3
16
  /**
@@ -0,0 +1,5 @@
1
+ import Docker from "dockerode";
2
+ var docker = new Docker({
3
+ socketPath: "/var/run/docker.sock"
4
+ });
5
+ export { docker };
@@ -0,0 +1,163 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
6
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
8
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
9
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
10
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
11
+ export function removeContainer(_x) {
12
+ return _removeContainer.apply(this, arguments);
13
+ }
14
+ function _removeContainer() {
15
+ _removeContainer = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(containerId) {
16
+ var container, _t;
17
+ return _regenerator().w(function (_context) {
18
+ while (1) switch (_context.p = _context.n) {
19
+ case 0:
20
+ container = docker.getContainer(containerId);
21
+ _context.p = 1;
22
+ _context.n = 2;
23
+ return container.remove({
24
+ force: true
25
+ });
26
+ case 2:
27
+ _context.n = 4;
28
+ break;
29
+ case 3:
30
+ _context.p = 3;
31
+ _t = _context.v;
32
+ throw new Error('Error removing container: ' + _t.message);
33
+ case 4:
34
+ return _context.a(2);
35
+ }
36
+ }, _callee, null, [[1, 3]]);
37
+ }));
38
+ return _removeContainer.apply(this, arguments);
39
+ }
40
+ import { docker } from "../dockerService.js";
41
+ import { imageExists, pullImage } from "./imageUtils.js";
42
+ export function createContainer(_x2) {
43
+ return _createContainer.apply(this, arguments);
44
+ }
45
+ function _createContainer() {
46
+ _createContainer = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(imageName) {
47
+ var options,
48
+ exists,
49
+ createOpts,
50
+ container,
51
+ _args2 = arguments,
52
+ _t2,
53
+ _t3,
54
+ _t4;
55
+ return _regenerator().w(function (_context2) {
56
+ while (1) switch (_context2.p = _context2.n) {
57
+ case 0:
58
+ options = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : {};
59
+ _context2.p = 1;
60
+ _context2.n = 2;
61
+ return imageExists(imageName);
62
+ case 2:
63
+ exists = _context2.v;
64
+ _context2.n = 4;
65
+ break;
66
+ case 3:
67
+ _context2.p = 3;
68
+ _t2 = _context2.v;
69
+ throw new Error('Error listing local images: ' + _t2.message);
70
+ case 4:
71
+ if (exists) {
72
+ _context2.n = 8;
73
+ break;
74
+ }
75
+ _context2.p = 5;
76
+ _context2.n = 6;
77
+ return pullImage(imageName);
78
+ case 6:
79
+ _context2.n = 8;
80
+ break;
81
+ case 7:
82
+ _context2.p = 7;
83
+ _t3 = _context2.v;
84
+ throw new Error('Could not pull image: ' + _t3.message);
85
+ case 8:
86
+ createOpts = _objectSpread({
87
+ Image: imageName,
88
+ Tty: true
89
+ }, options);
90
+ _context2.p = 9;
91
+ _context2.n = 10;
92
+ return docker.createContainer(createOpts);
93
+ case 10:
94
+ container = _context2.v;
95
+ return _context2.a(2, container.id || container.Id);
96
+ case 11:
97
+ _context2.p = 11;
98
+ _t4 = _context2.v;
99
+ throw new Error('Error creating container: ' + _t4.message);
100
+ case 12:
101
+ return _context2.a(2);
102
+ }
103
+ }, _callee2, null, [[9, 11], [5, 7], [1, 3]]);
104
+ }));
105
+ return _createContainer.apply(this, arguments);
106
+ }
107
+ export function startContainer(_x3) {
108
+ return _startContainer.apply(this, arguments);
109
+ }
110
+ function _startContainer() {
111
+ _startContainer = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(containerId) {
112
+ var container;
113
+ return _regenerator().w(function (_context3) {
114
+ while (1) switch (_context3.n) {
115
+ case 0:
116
+ container = docker.getContainer(containerId);
117
+ _context3.n = 1;
118
+ return container.start();
119
+ case 1:
120
+ return _context3.a(2);
121
+ }
122
+ }, _callee3);
123
+ }));
124
+ return _startContainer.apply(this, arguments);
125
+ }
126
+ export function stopContainer(_x4) {
127
+ return _stopContainer.apply(this, arguments);
128
+ }
129
+ function _stopContainer() {
130
+ _stopContainer = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(containerId) {
131
+ var container;
132
+ return _regenerator().w(function (_context4) {
133
+ while (1) switch (_context4.n) {
134
+ case 0:
135
+ container = docker.getContainer(containerId);
136
+ _context4.n = 1;
137
+ return container.stop();
138
+ case 1:
139
+ return _context4.a(2);
140
+ }
141
+ }, _callee4);
142
+ }));
143
+ return _stopContainer.apply(this, arguments);
144
+ }
145
+ export function restartContainer(_x5) {
146
+ return _restartContainer.apply(this, arguments);
147
+ }
148
+ function _restartContainer() {
149
+ _restartContainer = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(containerId) {
150
+ var container;
151
+ return _regenerator().w(function (_context5) {
152
+ while (1) switch (_context5.n) {
153
+ case 0:
154
+ container = docker.getContainer(containerId);
155
+ _context5.n = 1;
156
+ return container.restart();
157
+ case 1:
158
+ return _context5.a(2);
159
+ }
160
+ }, _callee5);
161
+ }));
162
+ return _restartContainer.apply(this, arguments);
163
+ }
@@ -0,0 +1,57 @@
1
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
2
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
3
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
4
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
5
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
6
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
7
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
8
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
9
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
10
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
11
+ import { docker } from "../dockerService.js";
12
+ export function getContainers() {
13
+ return _getContainers.apply(this, arguments);
14
+ }
15
+ function _getContainers() {
16
+ _getContainers = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
17
+ var containers;
18
+ return _regenerator().w(function (_context) {
19
+ while (1) switch (_context.n) {
20
+ case 0:
21
+ _context.n = 1;
22
+ return docker.listContainers({
23
+ all: true
24
+ });
25
+ case 1:
26
+ containers = _context.v;
27
+ return _context.a(2, containers.map(function (container) {
28
+ return {
29
+ id: container.Id,
30
+ name: container.Names[0].replace("/", ""),
31
+ image: container.Image,
32
+ state: container.State,
33
+ status: container.Status,
34
+ ports: function () {
35
+ var publicPorts = container.Ports.filter(function (port) {
36
+ return port.PublicPort;
37
+ }).map(function (port) {
38
+ return "".concat(port.PublicPort, ":").concat(port.PrivatePort);
39
+ });
40
+ if (publicPorts.length > 0) {
41
+ return _toConsumableArray(new Set(publicPorts));
42
+ }
43
+ // Si no hay puertos públicos, mostrar los privados expuestos
44
+ var privatePorts = container.Ports.filter(function (port) {
45
+ return port.PrivatePort;
46
+ }).map(function (port) {
47
+ return ":".concat(port.PrivatePort);
48
+ });
49
+ return _toConsumableArray(new Set(privatePorts));
50
+ }()
51
+ };
52
+ }));
53
+ }
54
+ }, _callee);
55
+ }));
56
+ return _getContainers.apply(this, arguments);
57
+ }
@@ -0,0 +1,24 @@
1
+ import { docker } from "../dockerService.js";
2
+ export function getLogsStream(containerId, onData, onEnd, onError) {
3
+ var container = docker.getContainer(containerId);
4
+ container.logs({
5
+ follow: true,
6
+ stdout: true,
7
+ stderr: true,
8
+ tail: 100
9
+ }, function (err, stream) {
10
+ if (err) {
11
+ onError === null || onError === void 0 || onError(err);
12
+ return;
13
+ }
14
+ stream.on('data', function (chunk) {
15
+ return onData === null || onData === void 0 ? void 0 : onData(chunk.toString());
16
+ });
17
+ stream.on('end', function () {
18
+ return onEnd === null || onEnd === void 0 ? void 0 : onEnd();
19
+ });
20
+ stream.on('error', function (err) {
21
+ return onError === null || onError === void 0 ? void 0 : onError(err);
22
+ });
23
+ });
24
+ }
@@ -0,0 +1,50 @@
1
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
2
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
3
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
4
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
5
+ import { docker } from "../dockerService.js";
6
+ export function getStats(_x) {
7
+ return _getStats.apply(this, arguments);
8
+ }
9
+ function _getStats() {
10
+ _getStats = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(containerId) {
11
+ var container, stream, cpuDelta, systemDelta, cpuPercent, memUsage, memLimit, memPercent, rx, tx;
12
+ return _regenerator().w(function (_context) {
13
+ while (1) switch (_context.n) {
14
+ case 0:
15
+ container = docker.getContainer(containerId);
16
+ _context.n = 1;
17
+ return container.stats({
18
+ stream: false
19
+ });
20
+ case 1:
21
+ stream = _context.v;
22
+ cpuDelta = stream.cpu_stats.cpu_usage.total_usage - stream.precpu_stats.cpu_usage.total_usage;
23
+ systemDelta = stream.cpu_stats.system_cpu_usage - stream.precpu_stats.system_cpu_usage;
24
+ cpuPercent = systemDelta > 0 ? cpuDelta / systemDelta * 100 : 0;
25
+ memUsage = stream.memory_stats.usage || 0;
26
+ memLimit = stream.memory_stats.limit || 1;
27
+ memPercent = memUsage / memLimit * 100;
28
+ rx = stream.networks ? Object.values(stream.networks).map(function (n) {
29
+ return n.rx_bytes;
30
+ }).reduce(function (a, b) {
31
+ return a + b;
32
+ }, 0) : 0;
33
+ tx = stream.networks ? Object.values(stream.networks).map(function (n) {
34
+ return n.tx_bytes;
35
+ }).reduce(function (a, b) {
36
+ return a + b;
37
+ }, 0) : 0;
38
+ return _context.a(2, {
39
+ cpuPercent: cpuPercent.toFixed(1),
40
+ memPercent: memPercent.toFixed(1),
41
+ netIO: {
42
+ rx: rx,
43
+ tx: tx
44
+ }
45
+ });
46
+ }
47
+ }, _callee);
48
+ }));
49
+ return _getStats.apply(this, arguments);
50
+ }