ai-project-manage-cli 2.0.12 → 2.0.14

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 (135) hide show
  1. package/README.md +6 -6
  2. package/dist/api/cli.d.ts +62 -1
  3. package/dist/api/cli.d.ts.map +1 -1
  4. package/dist/api/client.d.ts +3 -0
  5. package/dist/api/client.d.ts.map +1 -1
  6. package/dist/api/request-config.d.ts +4 -1
  7. package/dist/api/request-config.d.ts.map +1 -1
  8. package/dist/api/request-config.js +12 -0
  9. package/dist/api/request-config.js.map +1 -1
  10. package/dist/cli/commands/deploy-backend.d.ts +7 -0
  11. package/dist/cli/commands/deploy-backend.d.ts.map +1 -0
  12. package/dist/cli/commands/deploy-backend.js +67 -0
  13. package/dist/cli/commands/deploy-backend.js.map +1 -0
  14. package/dist/cli/commands/deploy-frontend.d.ts +3 -0
  15. package/dist/cli/commands/deploy-frontend.d.ts.map +1 -0
  16. package/dist/cli/commands/deploy-frontend.js +98 -0
  17. package/dist/cli/commands/deploy-frontend.js.map +1 -0
  18. package/dist/cli/commands/get.d.ts.map +1 -1
  19. package/dist/cli/commands/get.js +1 -1
  20. package/dist/cli/commands/get.js.map +1 -1
  21. package/dist/cli/commands/init.js +1 -1
  22. package/dist/cli/commands/publish.d.ts.map +1 -1
  23. package/dist/cli/commands/publish.js +42 -127
  24. package/dist/cli/commands/publish.js.map +1 -1
  25. package/dist/cli/commands/release.d.ts +3 -0
  26. package/dist/cli/commands/release.d.ts.map +1 -0
  27. package/dist/cli/commands/release.js +39 -0
  28. package/dist/cli/commands/release.js.map +1 -0
  29. package/dist/cli/utils/parse.d.ts +2 -0
  30. package/dist/cli/utils/parse.d.ts.map +1 -0
  31. package/dist/cli/utils/parse.js +12 -0
  32. package/dist/cli/utils/parse.js.map +1 -0
  33. package/dist/cli.js +6 -2
  34. package/dist/cli.js.map +1 -1
  35. package/dist/core/apm-config.d.ts +48 -1
  36. package/dist/core/apm-config.d.ts.map +1 -1
  37. package/dist/core/apm-config.js +93 -3
  38. package/dist/core/apm-config.js.map +1 -1
  39. package/dist/core/backend-deploy/backend-deploy-workflow.d.ts +19 -0
  40. package/dist/core/backend-deploy/backend-deploy-workflow.d.ts.map +1 -0
  41. package/dist/core/backend-deploy/backend-deploy-workflow.js +79 -0
  42. package/dist/core/backend-deploy/backend-deploy-workflow.js.map +1 -0
  43. package/dist/core/backend-deploy/command-runner.d.ts +11 -0
  44. package/dist/core/backend-deploy/command-runner.d.ts.map +1 -0
  45. package/dist/core/backend-deploy/command-runner.js +47 -0
  46. package/dist/core/backend-deploy/command-runner.js.map +1 -0
  47. package/dist/core/backend-deploy/dockerode-client/client.d.ts +18 -0
  48. package/dist/core/backend-deploy/dockerode-client/client.d.ts.map +1 -0
  49. package/dist/core/backend-deploy/dockerode-client/client.js +114 -0
  50. package/dist/core/backend-deploy/dockerode-client/client.js.map +1 -0
  51. package/dist/core/backend-deploy/dockerode-client/connection-options.d.ts +6 -0
  52. package/dist/core/backend-deploy/dockerode-client/connection-options.d.ts.map +1 -0
  53. package/dist/core/backend-deploy/dockerode-client/connection-options.js +52 -0
  54. package/dist/core/backend-deploy/dockerode-client/connection-options.js.map +1 -0
  55. package/dist/core/backend-deploy/dockerode-client/container-inspect-format.d.ts +3 -0
  56. package/dist/core/backend-deploy/dockerode-client/container-inspect-format.d.ts.map +1 -0
  57. package/dist/core/backend-deploy/dockerode-client/container-inspect-format.js +23 -0
  58. package/dist/core/backend-deploy/dockerode-client/container-inspect-format.js.map +1 -0
  59. package/dist/core/backend-deploy/dockerode-client/container-options.d.ts +4 -0
  60. package/dist/core/backend-deploy/dockerode-client/container-options.d.ts.map +1 -0
  61. package/dist/core/backend-deploy/dockerode-client/container-options.js +36 -0
  62. package/dist/core/backend-deploy/dockerode-client/container-options.js.map +1 -0
  63. package/dist/core/backend-deploy/dockerode-client/env.d.ts +3 -0
  64. package/dist/core/backend-deploy/dockerode-client/env.d.ts.map +1 -0
  65. package/dist/core/backend-deploy/dockerode-client/env.js +37 -0
  66. package/dist/core/backend-deploy/dockerode-client/env.js.map +1 -0
  67. package/dist/core/backend-deploy/dockerode-client/index.d.ts +8 -0
  68. package/dist/core/backend-deploy/dockerode-client/index.d.ts.map +1 -0
  69. package/dist/core/backend-deploy/dockerode-client/index.js +17 -0
  70. package/dist/core/backend-deploy/dockerode-client/index.js.map +1 -0
  71. package/dist/core/backend-deploy/dockerode-client/ports.d.ts +9 -0
  72. package/dist/core/backend-deploy/dockerode-client/ports.d.ts.map +1 -0
  73. package/dist/core/backend-deploy/dockerode-client/ports.js +35 -0
  74. package/dist/core/backend-deploy/dockerode-client/ports.js.map +1 -0
  75. package/dist/core/backend-deploy/dockerode-client/runtime.d.ts +7 -0
  76. package/dist/core/backend-deploy/dockerode-client/runtime.d.ts.map +1 -0
  77. package/dist/core/backend-deploy/dockerode-client/runtime.js +26 -0
  78. package/dist/core/backend-deploy/dockerode-client/runtime.js.map +1 -0
  79. package/dist/core/backend-deploy/dockerode-client/types.d.ts +62 -0
  80. package/dist/core/backend-deploy/dockerode-client/types.d.ts.map +1 -0
  81. package/dist/core/backend-deploy/dockerode-client/types.js +3 -0
  82. package/dist/core/backend-deploy/dockerode-client/types.js.map +1 -0
  83. package/dist/core/backend-deploy/image-tag.d.ts +2 -0
  84. package/dist/core/backend-deploy/image-tag.d.ts.map +1 -0
  85. package/dist/core/backend-deploy/image-tag.js +15 -0
  86. package/dist/core/backend-deploy/image-tag.js.map +1 -0
  87. package/dist/core/backend-deploy/index.d.ts +3 -0
  88. package/dist/core/backend-deploy/index.d.ts.map +1 -0
  89. package/dist/core/backend-deploy/index.js +6 -0
  90. package/dist/core/backend-deploy/index.js.map +1 -0
  91. package/dist/core/backend-deploy/local-docker-build.d.ts +8 -0
  92. package/dist/core/backend-deploy/local-docker-build.d.ts.map +1 -0
  93. package/dist/core/backend-deploy/local-docker-build.js +25 -0
  94. package/dist/core/backend-deploy/local-docker-build.js.map +1 -0
  95. package/dist/core/backend-deploy/logger.d.ts +10 -0
  96. package/dist/core/backend-deploy/logger.d.ts.map +1 -0
  97. package/dist/core/backend-deploy/logger.js +22 -0
  98. package/dist/core/backend-deploy/logger.js.map +1 -0
  99. package/dist/core/backend-deploy/registry-login-push.d.ts +24 -0
  100. package/dist/core/backend-deploy/registry-login-push.d.ts.map +1 -0
  101. package/dist/core/backend-deploy/registry-login-push.js +37 -0
  102. package/dist/core/backend-deploy/registry-login-push.js.map +1 -0
  103. package/dist/core/backend-deploy/remote-docker-client.d.ts +11 -0
  104. package/dist/core/backend-deploy/remote-docker-client.d.ts.map +1 -0
  105. package/dist/core/backend-deploy/remote-docker-client.js +34 -0
  106. package/dist/core/backend-deploy/remote-docker-client.js.map +1 -0
  107. package/dist/core/backend-deploy/remote-pull-image.d.ts +9 -0
  108. package/dist/core/backend-deploy/remote-pull-image.d.ts.map +1 -0
  109. package/dist/core/backend-deploy/remote-pull-image.js +39 -0
  110. package/dist/core/backend-deploy/remote-pull-image.js.map +1 -0
  111. package/dist/core/backend-deploy/resolve-dockerfile.d.ts +7 -0
  112. package/dist/core/backend-deploy/resolve-dockerfile.d.ts.map +1 -0
  113. package/dist/core/backend-deploy/resolve-dockerfile.js +24 -0
  114. package/dist/core/backend-deploy/resolve-dockerfile.js.map +1 -0
  115. package/dist/core/backend-deploy/run-docker-cli.d.ts +9 -0
  116. package/dist/core/backend-deploy/run-docker-cli.d.ts.map +1 -0
  117. package/dist/core/backend-deploy/run-docker-cli.js +14 -0
  118. package/dist/core/backend-deploy/run-docker-cli.js.map +1 -0
  119. package/dist/core/backend-deploy/types.d.ts +21 -0
  120. package/dist/core/backend-deploy/types.d.ts.map +1 -0
  121. package/dist/core/backend-deploy/types.js +3 -0
  122. package/dist/core/backend-deploy/types.js.map +1 -0
  123. package/dist/core/branch-name.d.ts +8 -0
  124. package/dist/core/branch-name.d.ts.map +1 -0
  125. package/dist/core/branch-name.js +37 -0
  126. package/dist/core/branch-name.js.map +1 -0
  127. package/dist/core/cursor-cmd.d.ts.map +1 -1
  128. package/dist/core/cursor-cmd.js +2 -1
  129. package/dist/core/cursor-cmd.js.map +1 -1
  130. package/dist/core/minio.d.ts +35 -0
  131. package/dist/core/minio.d.ts.map +1 -0
  132. package/dist/core/minio.js +154 -0
  133. package/dist/core/minio.js.map +1 -0
  134. package/package.json +6 -5
  135. package/templates/skills/apm-release/SKILL.md +87 -0
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BackendDeployWorkflow = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const dockerode_client_1 = require("./dockerode-client");
9
+ const image_tag_1 = require("./image-tag");
10
+ const local_docker_build_1 = require("./local-docker-build");
11
+ const logger_1 = require("./logger");
12
+ const registry_login_push_1 = require("./registry-login-push");
13
+ const resolve_dockerfile_1 = require("./resolve-dockerfile");
14
+ const env_1 = require("./dockerode-client/env");
15
+ /**
16
+ * 后端镜像部署编排:本地构建 → 推送私有 Registry → 远程 Docker 拉取镜像。
17
+ *
18
+ * 与常见「Deployer」脚本对应关系:本地 `docker build` + `docker login` + `docker push`
19
+ * 在这里拆成独立步骤;镜像名在 CLI 侧已拼成完整 `imageRef`(等价于先 build -t 再 tag 成仓库地址)。
20
+ * 远程 `docker pull` 用 dockerode 调用远程引擎 API(参考代码若只操作本机则不会包含这一步)。
21
+ *
22
+ * 配置由 {@link BackendDeployParams} 传入(例如从 `.apm/apm.config.json` 映射)。
23
+ */
24
+ class BackendDeployWorkflow {
25
+ params;
26
+ constructor(params) {
27
+ this.params = params;
28
+ }
29
+ /**
30
+ * @param cwd - 解析相对路径时的基准目录(Dockerfile)
31
+ */
32
+ async run(cwd) {
33
+ (0, resolve_dockerfile_1.resolveDockerBuildPaths)(cwd);
34
+ (0, image_tag_1.assertDeployImageTag)(this.params.tag);
35
+ (0, local_docker_build_1.buildDockerImageLocally)(this.params, cwd);
36
+ (0, registry_login_push_1.dockerLoginPrivateRegistry)(this.params, cwd);
37
+ (0, registry_login_push_1.dockerTagImage)(this.params, cwd);
38
+ (0, registry_login_push_1.dockerPushImage)(this.params, cwd);
39
+ const remoteClient = (0, dockerode_client_1.createDockerodeClient)({
40
+ host: this.params.remoteHost,
41
+ port: this.params.remotePort,
42
+ protocol: this.params.remoteProtocol,
43
+ ca: this.params.remoteCaPath,
44
+ cert: this.params.remoteCertPath,
45
+ key: this.params.remoteKeyPath,
46
+ });
47
+ const serveraddress = `https://${this.params.registryHost}`;
48
+ const image = `${this.params.registryHost}/${this.params.registryNamespace}/${this.params.image}:${this.params.tag}`;
49
+ const containerName = `${this.params.image}:${this.params.tag}`;
50
+ const existingContainerId = await remoteClient.findContainerIdByName(containerName);
51
+ if (existingContainerId) {
52
+ logger_1.Logger.info(`远程容器「${containerName}」已存在,正在停止并删除容器...`);
53
+ await remoteClient.stopContainer(existingContainerId);
54
+ await remoteClient.removeContainer(existingContainerId);
55
+ }
56
+ if (await remoteClient.imageExists(image)) {
57
+ logger_1.Logger.info("远程已存在同名镜像,正在删除以便重新拉取...");
58
+ await remoteClient.removeImage(image);
59
+ }
60
+ await remoteClient.pullImage(image, {
61
+ username: this.params.registryUser,
62
+ password: this.params.registryPassword,
63
+ serveraddress,
64
+ });
65
+ logger_1.Logger.success("远程拉取镜像完成");
66
+ const envFilePath = node_path_1.default.resolve(cwd, this.params.envFilePath || '.env');
67
+ const envObj = (0, dockerode_client_1.loadEnvFromFile)(envFilePath);
68
+ const containerId = await remoteClient.createContainer({
69
+ name: containerName,
70
+ image,
71
+ env: (0, env_1.toEnvArray)(envObj),
72
+ ...(0, dockerode_client_1.parsePorts)(this.params.containerPortsMappings)
73
+ });
74
+ await remoteClient.startContainer(containerId);
75
+ logger_1.Logger.success("远程容器创建并启动完成");
76
+ }
77
+ }
78
+ exports.BackendDeployWorkflow = BackendDeployWorkflow;
79
+ //# sourceMappingURL=backend-deploy-workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-deploy-workflow.js","sourceRoot":"","sources":["../../../src/core/backend-deploy/backend-deploy-workflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare class CommandRunner {
2
+ /**
3
+ * 执行命令
4
+ */
5
+ static exec(command: string, cwd?: string): string;
6
+ /**
7
+ * 执行命令并显示输出
8
+ */
9
+ static execWithOutput(command: string, cwd?: string): void;
10
+ }
11
+ //# sourceMappingURL=command-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-runner.d.ts","sourceRoot":"","sources":["../../../src/core/backend-deploy/command-runner.ts"],"names":[],"mappings":"AAMA,qBAAa,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM;IAgBlD;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;CAY3D"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CommandRunner = void 0;
4
+ /**
5
+ * 命令执行工具类
6
+ */
7
+ const child_process_1 = require("child_process");
8
+ const logger_1 = require("./logger");
9
+ class CommandRunner {
10
+ /**
11
+ * 执行命令
12
+ */
13
+ static exec(command, cwd) {
14
+ try {
15
+ logger_1.Logger.info(`执行命令: ${command}`);
16
+ const result = (0, child_process_1.execSync)(command, {
17
+ cwd,
18
+ encoding: "utf8",
19
+ stdio: "pipe",
20
+ });
21
+ return result.toString().trim();
22
+ }
23
+ catch (error) {
24
+ logger_1.Logger.error(`命令执行失败: ${command}`);
25
+ logger_1.Logger.error(error.message);
26
+ throw error;
27
+ }
28
+ }
29
+ /**
30
+ * 执行命令并显示输出
31
+ */
32
+ static execWithOutput(command, cwd) {
33
+ try {
34
+ logger_1.Logger.info(`执行命令: ${command}`);
35
+ (0, child_process_1.execSync)(command, {
36
+ cwd,
37
+ stdio: "inherit",
38
+ });
39
+ }
40
+ catch (error) {
41
+ logger_1.Logger.error(`命令执行失败: ${command}`);
42
+ throw error;
43
+ }
44
+ }
45
+ }
46
+ exports.CommandRunner = CommandRunner;
47
+ //# sourceMappingURL=command-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-runner.js","sourceRoot":"","sources":["../../../src/core/backend-deploy/command-runner.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,iDAAyC;AACzC,qCAAkC;AAElC,MAAa,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAe,EAAE,GAAY;QACvC,IAAI,CAAC;YACH,eAAM,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,OAAO,EAAE;gBAC/B,GAAG;gBACH,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,eAAM,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;YACnC,eAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,OAAe,EAAE,GAAY;QACjD,IAAI,CAAC;YACH,eAAM,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;YAChC,IAAA,wBAAQ,EAAC,OAAO,EAAE;gBAChB,GAAG;gBACH,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,eAAM,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;YACnC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAnCD,sCAmCC"}
@@ -0,0 +1,18 @@
1
+ import type { DockerContainerStateSummary, DockerCreateContainerInput, DockerodeClientFactory, DockerodeClientPort, DockerDeployConnectionConfig, DockerPullAuth } from "./types";
2
+ export declare class DockerodeClient implements DockerodeClientPort {
3
+ private readonly client;
4
+ constructor(config: DockerDeployConnectionConfig);
5
+ ping(): Promise<void>;
6
+ imageExists(image: string): Promise<boolean>;
7
+ removeImage(image: string): Promise<void>;
8
+ pullImage(image: string, auth?: DockerPullAuth): Promise<void>;
9
+ findContainerIdByName(name: string): Promise<string | undefined>;
10
+ stopContainer(id: string): Promise<void>;
11
+ removeContainer(id: string): Promise<void>;
12
+ createContainer(input: DockerCreateContainerInput): Promise<string>;
13
+ startContainer(id: string): Promise<void>;
14
+ inspectContainer(id: string): Promise<DockerContainerStateSummary>;
15
+ getContainerLogs(id: string, tail?: number): Promise<string>;
16
+ }
17
+ export declare const createDockerodeClient: DockerodeClientFactory;
18
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,2BAA2B,EAC3B,0BAA0B,EAC1B,sBAAsB,EACtB,mBAAmB,EACnB,4BAA4B,EAC5B,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB,qBAAa,eAAgB,YAAW,mBAAmB;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,4BAA4B;IAK1C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS5C,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B9D,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAQhE,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1C,eAAe,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;IAMnE,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAiBlE,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,SAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAchE;AAED,eAAO,MAAM,qBAAqB,EAAE,sBACP,CAAC"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createDockerodeClient = exports.DockerodeClient = void 0;
7
+ const dockerode_1 = __importDefault(require("dockerode"));
8
+ const connection_options_1 = require("./connection-options");
9
+ const container_inspect_format_1 = require("./container-inspect-format");
10
+ const container_options_1 = require("./container-options");
11
+ class DockerodeClient {
12
+ client;
13
+ constructor(config) {
14
+ const options = (0, connection_options_1.toDockerConnectionOptions)(config);
15
+ this.client = new dockerode_1.default(options);
16
+ }
17
+ async ping() {
18
+ await this.client.ping();
19
+ }
20
+ async imageExists(image) {
21
+ try {
22
+ await this.client.getImage(image).inspect();
23
+ return true;
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ async removeImage(image) {
30
+ await this.client.getImage(image).remove({ force: true });
31
+ }
32
+ async pullImage(image, auth) {
33
+ const stream = await new Promise((resolve, reject) => {
34
+ const pullOptions = auth ? { authconfig: auth } : undefined;
35
+ this.client.pull(image, pullOptions, (err, output) => {
36
+ if (err || !output) {
37
+ reject(err ?? new Error("docker pull 返回空输出"));
38
+ return;
39
+ }
40
+ resolve(output);
41
+ });
42
+ });
43
+ await new Promise((resolve, reject) => {
44
+ this.client.modem.followProgress(stream, (err) => {
45
+ if (err) {
46
+ reject(err);
47
+ return;
48
+ }
49
+ resolve();
50
+ }, () => undefined);
51
+ });
52
+ }
53
+ async findContainerIdByName(name) {
54
+ const containers = await this.client.listContainers({ all: true });
55
+ const matched = containers.find((item) => (item.Names ?? []).some((n) => n === `/${name}`));
56
+ return matched?.Id;
57
+ }
58
+ async stopContainer(id) {
59
+ const container = this.client.getContainer(id);
60
+ try {
61
+ await container.stop();
62
+ }
63
+ catch {
64
+ // Container may already be stopped.
65
+ }
66
+ }
67
+ async removeContainer(id) {
68
+ const container = this.client.getContainer(id);
69
+ await container.remove({ force: true });
70
+ }
71
+ async createContainer(input) {
72
+ const payload = (0, container_options_1.toContainerCreateOptions)(input);
73
+ const container = await this.client.createContainer(payload);
74
+ return container.id;
75
+ }
76
+ async startContainer(id) {
77
+ const container = this.client.getContainer(id);
78
+ await container.start();
79
+ }
80
+ async inspectContainer(id) {
81
+ const container = this.client.getContainer(id);
82
+ const inspectInfo = await container.inspect();
83
+ const state = inspectInfo?.State;
84
+ const portMappings = (0, container_inspect_format_1.formatPortMappings)(inspectInfo);
85
+ return {
86
+ running: state?.Running,
87
+ status: state?.Status,
88
+ exitCode: state?.ExitCode,
89
+ error: state?.Error,
90
+ startedAt: state?.StartedAt,
91
+ finishedAt: state?.FinishedAt,
92
+ health: state?.Health?.Status,
93
+ portMappings,
94
+ };
95
+ }
96
+ async getContainerLogs(id, tail = 100) {
97
+ const container = this.client.getContainer(id);
98
+ const logs = await container.logs({
99
+ stdout: true,
100
+ stderr: true,
101
+ timestamps: true,
102
+ follow: false,
103
+ tail,
104
+ });
105
+ if (typeof logs === "string") {
106
+ return logs;
107
+ }
108
+ return logs.toString("utf8");
109
+ }
110
+ }
111
+ exports.DockerodeClient = DockerodeClient;
112
+ const createDockerodeClient = (config) => new DockerodeClient(config);
113
+ exports.createDockerodeClient = createDockerodeClient;
114
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/client.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA+B;AAE/B,6DAAiE;AACjE,yEAAgE;AAChE,2DAA+D;AAU/D,MAAa,eAAe;IACT,MAAM,CAAS;IAEhC,YAAY,MAAoC;QAC9C,MAAM,OAAO,GAAG,IAAA,8CAAyB,EAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,mBAAM,CAAC,OAAc,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,IAAqB;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,WAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;gBAC1D,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBACnB,MAAM,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;oBAC9C,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACzC,IAAI,CAAC,MAAM,CAAC,KAAa,CAAC,cAAc,CACvC,MAAM,EACN,CAAC,GAAY,EAAE,EAAE;gBACf,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,CAAC,GAAG,CAAC,CAAC;oBACZ,OAAO;gBACT,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,EACD,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,IAAY;QACtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACvC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CACjD,CAAC;QACF,OAAO,OAAO,EAAE,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAU;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,EAAU;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAiC;QACrD,MAAM,OAAO,GAAG,IAAA,4CAAwB,EAAC,KAAK,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO,SAAS,CAAC,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,EAAU;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,WAAW,EAAE,KAAK,CAAC;QACjC,MAAM,YAAY,GAAG,IAAA,6CAAkB,EAAC,WAAW,CAAC,CAAC;QACrD,OAAO;YACL,OAAO,EAAE,KAAK,EAAE,OAAO;YACvB,MAAM,EAAE,KAAK,EAAE,MAAM;YACrB,QAAQ,EAAE,KAAK,EAAE,QAAQ;YACzB,KAAK,EAAE,KAAK,EAAE,KAAK;YACnB,SAAS,EAAE,KAAK,EAAE,SAAS;YAC3B,UAAU,EAAE,KAAK,EAAE,UAAU;YAC7B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;YAC7B,YAAY;SACb,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,EAAU,EAAE,IAAI,GAAG,GAAG;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC;YAChC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,KAAK;YACb,IAAI;SACL,CAAC,CAAC;QACH,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;CACF;AAnHD,0CAmHC;AAEM,MAAM,qBAAqB,GAA2B,CAAC,MAAM,EAAE,EAAE,CACtE,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;AADjB,QAAA,qBAAqB,yBACJ"}
@@ -0,0 +1,6 @@
1
+ import type { DockerDeployConnectionConfig } from "./types";
2
+ /**
3
+ * 将通用连接配置转为 dockerode 可用的 modem 选项(含可选 TLS)。
4
+ */
5
+ export declare function toDockerConnectionOptions(config: DockerDeployConnectionConfig): Record<string, unknown>;
6
+ //# sourceMappingURL=connection-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-options.d.ts","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/connection-options.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAgB5D;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,4BAA4B,GACnC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+BzB"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toDockerConnectionOptions = toDockerConnectionOptions;
4
+ const node_fs_1 = require("node:fs");
5
+ function asOptionalTlsBuffer(value) {
6
+ if (typeof value !== "string") {
7
+ return undefined;
8
+ }
9
+ const normalized = value.trim();
10
+ if (normalized === "") {
11
+ return undefined;
12
+ }
13
+ if ((0, node_fs_1.existsSync)(normalized)) {
14
+ return (0, node_fs_1.readFileSync)(normalized);
15
+ }
16
+ return Buffer.from(normalized);
17
+ }
18
+ /**
19
+ * 将通用连接配置转为 dockerode 可用的 modem 选项(含可选 TLS)。
20
+ */
21
+ function toDockerConnectionOptions(config) {
22
+ const protocol = (config.protocol ?? "https").toLowerCase();
23
+ const isHttps = protocol === "https";
24
+ const options = {
25
+ host: config.host ?? "127.0.0.1",
26
+ port: config.port ?? 2376,
27
+ protocol,
28
+ };
29
+ const socketPath = (config.socketPath ?? "").trim();
30
+ if (socketPath !== "") {
31
+ options.socketPath = socketPath;
32
+ }
33
+ if (isHttps) {
34
+ const tlsOptions = {
35
+ ca: asOptionalTlsBuffer(config.ca),
36
+ cert: asOptionalTlsBuffer(config.cert),
37
+ key: asOptionalTlsBuffer(config.key),
38
+ };
39
+ if (tlsOptions.ca) {
40
+ options.ca = tlsOptions.ca;
41
+ }
42
+ if (tlsOptions.cert) {
43
+ options.cert = tlsOptions.cert;
44
+ }
45
+ if (tlsOptions.key) {
46
+ options.key = tlsOptions.key;
47
+ }
48
+ options.checkServerIdentity = () => undefined;
49
+ }
50
+ return options;
51
+ }
52
+ //# sourceMappingURL=connection-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-options.js","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/connection-options.ts"],"names":[],"mappings":";;AAqBA,8DAiCC;AAtDD,qCAAmD;AAInD,SAAS,mBAAmB,CAAC,KAAyB;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,IAAA,oBAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAA,sBAAY,EAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAgB,yBAAyB,CACvC,MAAoC;IAEpC,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5D,MAAM,OAAO,GAAG,QAAQ,KAAK,OAAO,CAAC;IACrC,MAAM,OAAO,GAA4B;QACvC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,WAAW;QAChC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;QACzB,QAAQ;KACT,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;QACtB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,UAAU,GAAG;YACjB,EAAE,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC;YACtC,GAAG,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC;SACrC,CAAC;QACF,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;YAClB,OAAO,CAAC,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;QACjC,CAAC;QACD,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC;QAC/B,CAAC;QACD,OAAO,CAAC,mBAAmB,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC;IAChD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type Docker from "dockerode";
2
+ export declare function formatPortMappings(inspectInfo: Docker.ContainerInspectInfo): string[] | undefined;
3
+ //# sourceMappingURL=container-inspect-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-inspect-format.d.ts","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/container-inspect-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,WAAW,CAAC;AAEpC,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,CAAC,oBAAoB,GACvC,MAAM,EAAE,GAAG,SAAS,CAoBtB"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatPortMappings = formatPortMappings;
4
+ function formatPortMappings(inspectInfo) {
5
+ const ports = inspectInfo?.NetworkSettings?.Ports;
6
+ if (!ports || typeof ports !== "object") {
7
+ return undefined;
8
+ }
9
+ const mappings = [];
10
+ for (const [containerPort, hostBindings] of Object.entries(ports)) {
11
+ if (!hostBindings || hostBindings.length === 0) {
12
+ mappings.push(`${containerPort} -> <not-published>`);
13
+ continue;
14
+ }
15
+ for (const binding of hostBindings) {
16
+ const hostIp = binding.HostIp || "0.0.0.0";
17
+ const hostPort = binding.HostPort || "<unknown>";
18
+ mappings.push(`${containerPort} -> ${hostIp}:${hostPort}`);
19
+ }
20
+ }
21
+ return mappings.length > 0 ? mappings : undefined;
22
+ }
23
+ //# sourceMappingURL=container-inspect-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-inspect-format.js","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/container-inspect-format.ts"],"names":[],"mappings":";;AAEA,gDAsBC;AAtBD,SAAgB,kBAAkB,CAChC,WAAwC;IAExC,MAAM,KAAK,GAAG,WAAW,EAAE,eAAe,EAAE,KAAK,CAAC;IAClD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,qBAAqB,CAAC,CAAC;YACrD,SAAS;QACX,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;YAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAC;YACjD,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,OAAO,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import Docker from "dockerode";
2
+ import type { DockerCreateContainerInput } from "./types";
3
+ export declare function toContainerCreateOptions(input: DockerCreateContainerInput): Docker.ContainerCreateOptions;
4
+ //# sourceMappingURL=container-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-options.d.ts","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/container-options.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,WAAW,CAAC;AAE/B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAE1D,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,0BAA0B,GAChC,MAAM,CAAC,sBAAsB,CAiC/B"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toContainerCreateOptions = toContainerCreateOptions;
4
+ function toContainerCreateOptions(input) {
5
+ const hostConfig = {};
6
+ let hasHostConfig = false;
7
+ if (input.portBindings) {
8
+ hostConfig.PortBindings = input.portBindings;
9
+ hasHostConfig = true;
10
+ }
11
+ if (input.binds) {
12
+ hostConfig.Binds = input.binds;
13
+ hasHostConfig = true;
14
+ }
15
+ if (typeof input.nanoCpus === "number") {
16
+ hostConfig.NanoCpus = input.nanoCpus;
17
+ hasHostConfig = true;
18
+ }
19
+ if (typeof input.memory === "number") {
20
+ hostConfig.Memory = Number(input.memory) * 1024 * 1024;
21
+ hasHostConfig = true;
22
+ }
23
+ const payload = {
24
+ name: input.name,
25
+ Image: input.image,
26
+ Env: input.env,
27
+ };
28
+ if (input.exposedPorts) {
29
+ payload.ExposedPorts = input.exposedPorts;
30
+ }
31
+ if (hasHostConfig) {
32
+ payload.HostConfig = hostConfig;
33
+ }
34
+ return payload;
35
+ }
36
+ //# sourceMappingURL=container-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-options.js","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/container-options.ts"],"names":[],"mappings":";;AAIA,4DAmCC;AAnCD,SAAgB,wBAAwB,CACtC,KAAiC;IAEjC,MAAM,UAAU,GAAsB,EAAE,CAAC;IACzC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,UAAU,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QAC7C,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC/B,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACvC,UAAU,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QACrC,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;QACvD,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,MAAM,OAAO,GAAkC;QAC7C,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,GAAG,EAAE,KAAK,CAAC,GAAG;KACf,CAAC;IACF,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;IAC5C,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function loadEnvFromFile(envFilePath: string): Record<string, string>;
2
+ export declare function toEnvArray(env: Record<string, string>): string[];
3
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/env.ts"],"names":[],"mappings":"AAGA,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyB3E;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAEhE"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadEnvFromFile = loadEnvFromFile;
7
+ exports.toEnvArray = toEnvArray;
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ function loadEnvFromFile(envFilePath) {
11
+ if (!envFilePath) {
12
+ return {};
13
+ }
14
+ const targetPath = node_path_1.default.resolve(envFilePath);
15
+ const raw = (0, node_fs_1.readFileSync)(targetPath, "utf-8");
16
+ const result = {};
17
+ for (const line of raw.split(/\r?\n/)) {
18
+ const normalized = line.trim();
19
+ if (normalized === "" || normalized.startsWith("#")) {
20
+ continue;
21
+ }
22
+ const eqIndex = normalized.indexOf("=");
23
+ if (eqIndex <= 0) {
24
+ continue;
25
+ }
26
+ const key = normalized.slice(0, eqIndex).trim();
27
+ const value = normalized.slice(eqIndex + 1);
28
+ if (key !== "") {
29
+ result[key] = value;
30
+ }
31
+ }
32
+ return result;
33
+ }
34
+ function toEnvArray(env) {
35
+ return Object.entries(env).map(([key, value]) => `${key}=${value}`);
36
+ }
37
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/env.ts"],"names":[],"mappings":";;;;;AAGA,0CAyBC;AAED,gCAEC;AAhCD,qCAAuC;AACvC,0DAA6B;AAE7B,SAAgB,eAAe,CAAC,WAAmB;IACjD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,UAAU,GAAG,mBAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,UAAU,KAAK,EAAE,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpD,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAC5C,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,UAAU,CAAC,GAA2B;IACpD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type { DockerContainerRuntimeInput, DockerContainerStateSummary, DockerCreateContainerInput, DockerDeployConnectionConfig, DockerodeClientFactory, DockerodeClientPort, DockerPullAuth, } from "./types";
2
+ export { DockerodeClient, createDockerodeClient } from "./client";
3
+ export { toDockerConnectionOptions } from "./connection-options";
4
+ export { formatPortMappings } from "./container-inspect-format";
5
+ export { toContainerCreateOptions } from "./container-options";
6
+ export { loadEnvFromFile } from "./env";
7
+ export { parsePorts } from "./ports";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,2BAA2B,EAC3B,2BAA2B,EAC3B,0BAA0B,EAC1B,4BAA4B,EAC5B,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,GACf,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parsePorts = exports.loadEnvFromFile = exports.toContainerCreateOptions = exports.formatPortMappings = exports.toDockerConnectionOptions = exports.createDockerodeClient = exports.DockerodeClient = void 0;
4
+ var client_1 = require("./client");
5
+ Object.defineProperty(exports, "DockerodeClient", { enumerable: true, get: function () { return client_1.DockerodeClient; } });
6
+ Object.defineProperty(exports, "createDockerodeClient", { enumerable: true, get: function () { return client_1.createDockerodeClient; } });
7
+ var connection_options_1 = require("./connection-options");
8
+ Object.defineProperty(exports, "toDockerConnectionOptions", { enumerable: true, get: function () { return connection_options_1.toDockerConnectionOptions; } });
9
+ var container_inspect_format_1 = require("./container-inspect-format");
10
+ Object.defineProperty(exports, "formatPortMappings", { enumerable: true, get: function () { return container_inspect_format_1.formatPortMappings; } });
11
+ var container_options_1 = require("./container-options");
12
+ Object.defineProperty(exports, "toContainerCreateOptions", { enumerable: true, get: function () { return container_options_1.toContainerCreateOptions; } });
13
+ var env_1 = require("./env");
14
+ Object.defineProperty(exports, "loadEnvFromFile", { enumerable: true, get: function () { return env_1.loadEnvFromFile; } });
15
+ var ports_1 = require("./ports");
16
+ Object.defineProperty(exports, "parsePorts", { enumerable: true, get: function () { return ports_1.parsePorts; } });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/index.ts"],"names":[],"mappings":";;;AAUA,mCAAkE;AAAzD,yGAAA,eAAe,OAAA;AAAE,+GAAA,qBAAqB,OAAA;AAC/C,2DAAiE;AAAxD,+HAAA,yBAAyB,OAAA;AAClC,uEAAgE;AAAvD,8HAAA,kBAAkB,OAAA;AAC3B,yDAA+D;AAAtD,6HAAA,wBAAwB,OAAA;AACjC,6BAAwC;AAA/B,sGAAA,eAAe,OAAA;AACxB,iCAAqC;AAA5B,mGAAA,UAAU,OAAA"}
@@ -0,0 +1,9 @@
1
+ import Docker from "dockerode";
2
+ /**
3
+ * 解析 `hostPort:containerPort[/udp]` 形式的端口列表为 dockerode 的 ExposedPorts / PortBindings。
4
+ */
5
+ export declare function parsePorts(ports?: string[]): {
6
+ exposedPorts?: Docker.ContainerCreateOptions["ExposedPorts"];
7
+ portBindings?: Docker.HostConfig["PortBindings"];
8
+ };
9
+ //# sourceMappingURL=ports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/ports.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,WAAW,CAAC;AAE/B;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;CAClD,CAgCA"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parsePorts = parsePorts;
4
+ /**
5
+ * 解析 `hostPort:containerPort[/udp]` 形式的端口列表为 dockerode 的 ExposedPorts / PortBindings。
6
+ */
7
+ function parsePorts(ports) {
8
+ if (!ports || ports.length === 0) {
9
+ return {};
10
+ }
11
+ const exposedPorts = {};
12
+ const portBindings = {};
13
+ for (const rawPort of ports) {
14
+ const normalized = rawPort.trim();
15
+ if (normalized === "") {
16
+ continue;
17
+ }
18
+ const [hostAndContainer, protocolPart] = normalized.split("/");
19
+ const protocol = protocolPart?.trim() === "udp" ? "udp" : "tcp";
20
+ const segments = hostAndContainer.split(":").map((part) => part.trim());
21
+ if (segments.length !== 2 || !segments[0] || !segments[1]) {
22
+ throw new Error(`container.ports 配置无效: ${rawPort}`);
23
+ }
24
+ const hostPort = segments[0];
25
+ const containerPort = segments[1];
26
+ const key = `${containerPort}/${protocol}`;
27
+ exposedPorts[key] = {};
28
+ portBindings[key] = [{ HostPort: hostPort }];
29
+ }
30
+ return {
31
+ exposedPorts: Object.keys(exposedPorts).length > 0 ? exposedPorts : undefined,
32
+ portBindings: Object.keys(portBindings).length > 0 ? portBindings : undefined,
33
+ };
34
+ }
35
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/ports.ts"],"names":[],"mappings":";;AAKA,gCAmCC;AAtCD;;GAEG;AACH,SAAgB,UAAU,CAAC,KAAgB;IAIzC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,YAAY,GAAkD,EAAE,CAAC;IACvE,MAAM,YAAY,GAAsC,EAAE,CAAC;IAE3D,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QAED,MAAM,CAAC,gBAAgB,EAAE,YAAY,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,YAAY,EAAE,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAChE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,aAAa,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,GAAG,aAAa,IAAI,QAAQ,EAAE,CAAC;QAC3C,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACvB,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;QAC7E,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;KAC9E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { DockerContainerRuntimeInput, DockerCreateContainerInput } from "./types";
2
+ export declare function toRuntimeContainerInput(input: {
3
+ runtime: DockerContainerRuntimeInput;
4
+ resolve: (...parts: string[]) => string;
5
+ readText: (path: string) => string;
6
+ }): DockerCreateContainerInput;
7
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAIvF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,OAAO,EAAE,2BAA2B,CAAC;IACrC,OAAO,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;IACxC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC,GAAG,0BAA0B,CAoB7B"}