@developers-homelab/runestone-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -0
  3. package/bin/runestone +17 -0
  4. package/dist/cli.d.ts +4 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +78 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/certs.d.ts +3 -0
  9. package/dist/commands/certs.d.ts.map +1 -0
  10. package/dist/commands/certs.js +110 -0
  11. package/dist/commands/certs.js.map +1 -0
  12. package/dist/commands/down.d.ts +3 -0
  13. package/dist/commands/down.d.ts.map +1 -0
  14. package/dist/commands/down.js +59 -0
  15. package/dist/commands/down.js.map +1 -0
  16. package/dist/commands/keys.d.ts +3 -0
  17. package/dist/commands/keys.d.ts.map +1 -0
  18. package/dist/commands/keys.js +51 -0
  19. package/dist/commands/keys.js.map +1 -0
  20. package/dist/commands/setup.d.ts +15 -0
  21. package/dist/commands/setup.d.ts.map +1 -0
  22. package/dist/commands/setup.js +641 -0
  23. package/dist/commands/setup.js.map +1 -0
  24. package/dist/commands/status.d.ts +3 -0
  25. package/dist/commands/status.d.ts.map +1 -0
  26. package/dist/commands/status.js +57 -0
  27. package/dist/commands/status.js.map +1 -0
  28. package/dist/commands/stop.d.ts +3 -0
  29. package/dist/commands/stop.d.ts.map +1 -0
  30. package/dist/commands/stop.js +25 -0
  31. package/dist/commands/stop.js.map +1 -0
  32. package/dist/commands/up.d.ts +3 -0
  33. package/dist/commands/up.d.ts.map +1 -0
  34. package/dist/commands/up.js +72 -0
  35. package/dist/commands/up.js.map +1 -0
  36. package/dist/i18n/index.d.ts +316 -0
  37. package/dist/i18n/index.d.ts.map +1 -0
  38. package/dist/i18n/index.js +378 -0
  39. package/dist/i18n/index.js.map +1 -0
  40. package/dist/services/cert-manager.d.ts +38 -0
  41. package/dist/services/cert-manager.d.ts.map +1 -0
  42. package/dist/services/cert-manager.js +260 -0
  43. package/dist/services/cert-manager.js.map +1 -0
  44. package/dist/services/docker-compose.d.ts +24 -0
  45. package/dist/services/docker-compose.d.ts.map +1 -0
  46. package/dist/services/docker-compose.js +132 -0
  47. package/dist/services/docker-compose.js.map +1 -0
  48. package/dist/services/docker-exec.d.ts +10 -0
  49. package/dist/services/docker-exec.d.ts.map +1 -0
  50. package/dist/services/docker-exec.js +39 -0
  51. package/dist/services/docker-exec.js.map +1 -0
  52. package/dist/services/docker-network.d.ts +13 -0
  53. package/dist/services/docker-network.d.ts.map +1 -0
  54. package/dist/services/docker-network.js +58 -0
  55. package/dist/services/docker-network.js.map +1 -0
  56. package/dist/services/docker-run.d.ts +18 -0
  57. package/dist/services/docker-run.d.ts.map +1 -0
  58. package/dist/services/docker-run.js +56 -0
  59. package/dist/services/docker-run.js.map +1 -0
  60. package/dist/services/docker-volume.d.ts +12 -0
  61. package/dist/services/docker-volume.d.ts.map +1 -0
  62. package/dist/services/docker-volume.js +57 -0
  63. package/dist/services/docker-volume.js.map +1 -0
  64. package/dist/services/domain-checker.d.ts +29 -0
  65. package/dist/services/domain-checker.d.ts.map +1 -0
  66. package/dist/services/domain-checker.js +149 -0
  67. package/dist/services/domain-checker.js.map +1 -0
  68. package/dist/services/port-checker.d.ts +3 -0
  69. package/dist/services/port-checker.d.ts.map +1 -0
  70. package/dist/services/port-checker.js +45 -0
  71. package/dist/services/port-checker.js.map +1 -0
  72. package/dist/services/ssh-manager.d.ts +7 -0
  73. package/dist/services/ssh-manager.d.ts.map +1 -0
  74. package/dist/services/ssh-manager.js +125 -0
  75. package/dist/services/ssh-manager.js.map +1 -0
  76. package/dist/utils/command.d.ts +6 -0
  77. package/dist/utils/command.d.ts.map +1 -0
  78. package/dist/utils/command.js +34 -0
  79. package/dist/utils/command.js.map +1 -0
  80. package/dist/utils/docker-checker.d.ts +5 -0
  81. package/dist/utils/docker-checker.d.ts.map +1 -0
  82. package/dist/utils/docker-checker.js +31 -0
  83. package/dist/utils/docker-checker.js.map +1 -0
  84. package/dist/utils/env-loader.d.ts +32 -0
  85. package/dist/utils/env-loader.d.ts.map +1 -0
  86. package/dist/utils/env-loader.js +113 -0
  87. package/dist/utils/env-loader.js.map +1 -0
  88. package/dist/utils/logger.d.ts +8 -0
  89. package/dist/utils/logger.d.ts.map +1 -0
  90. package/dist/utils/logger.js +25 -0
  91. package/dist/utils/logger.js.map +1 -0
  92. package/dist/utils/logo.d.ts +2 -0
  93. package/dist/utils/logo.d.ts.map +1 -0
  94. package/dist/utils/logo.js +15 -0
  95. package/dist/utils/logo.js.map +1 -0
  96. package/dist/utils/os-detector.d.ts +10 -0
  97. package/dist/utils/os-detector.d.ts.map +1 -0
  98. package/dist/utils/os-detector.js +76 -0
  99. package/dist/utils/os-detector.js.map +1 -0
  100. package/dist/utils/path-helpers.d.ts +9 -0
  101. package/dist/utils/path-helpers.d.ts.map +1 -0
  102. package/dist/utils/path-helpers.js +96 -0
  103. package/dist/utils/path-helpers.js.map +1 -0
  104. package/dist/utils/port-checker.d.ts +3 -0
  105. package/dist/utils/port-checker.d.ts.map +1 -0
  106. package/dist/utils/port-checker.js +45 -0
  107. package/dist/utils/port-checker.js.map +1 -0
  108. package/dist/utils/project-files.d.ts +7 -0
  109. package/dist/utils/project-files.d.ts.map +1 -0
  110. package/dist/utils/project-files.js +97 -0
  111. package/dist/utils/project-files.js.map +1 -0
  112. package/dist/utils/spawn.d.ts +7 -0
  113. package/dist/utils/spawn.d.ts.map +1 -0
  114. package/dist/utils/spawn.js +31 -0
  115. package/dist/utils/spawn.js.map +1 -0
  116. package/dist/utils/tool-state.d.ts +16 -0
  117. package/dist/utils/tool-state.d.ts.map +1 -0
  118. package/dist/utils/tool-state.js +86 -0
  119. package/dist/utils/tool-state.js.map +1 -0
  120. package/package.json +63 -0
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runService = void 0;
4
+ const spawn_1 = require("../utils/spawn");
5
+ function buildArgs(options) {
6
+ const args = [];
7
+ if (options?.rm) {
8
+ args.push('--rm');
9
+ }
10
+ if (options?.interactive) {
11
+ args.push('-i');
12
+ }
13
+ if (options?.tty) {
14
+ args.push('-t');
15
+ }
16
+ if (options?.user) {
17
+ args.push('-u', options.user);
18
+ }
19
+ if (options?.volumes) {
20
+ for (const volume of options.volumes) {
21
+ const mode = volume.readonly ? ':ro' : '';
22
+ args.push('-v', `${volume.source}:${volume.target}${mode}`);
23
+ }
24
+ }
25
+ if (options?.volumesFrom) {
26
+ args.push('--volumes-from', options.volumesFrom);
27
+ }
28
+ if (options?.name) {
29
+ args.push('--name', options.name);
30
+ }
31
+ return args;
32
+ }
33
+ exports.runService = {
34
+ run(image, command, options) {
35
+ if (options?.tty) {
36
+ throw new Error('TTY mode is not supported for automated container runs');
37
+ }
38
+ const args = ['run', ...buildArgs(options), image, ...command];
39
+ const result = (0, spawn_1.spawnCommand)('docker', args, {
40
+ input: options?.input,
41
+ encoding: 'utf8',
42
+ timeout: 300000
43
+ });
44
+ if (result.error) {
45
+ throw result.error;
46
+ }
47
+ if (result.status === null) {
48
+ throw new Error('docker command not found. Is Docker installed?');
49
+ }
50
+ if (result.status !== 0) {
51
+ throw new Error(`Docker run failed (exit ${result.status}): ${result.stderr?.trim() || 'unknown error'}`);
52
+ }
53
+ return result.stdout ?? '';
54
+ }
55
+ };
56
+ //# sourceMappingURL=docker-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-run.js","sourceRoot":"","sources":["../../src/services/docker-run.ts"],"names":[],"mappings":";;;AAAA,0CAA8C;AAa9C,SAAS,SAAS,CAAC,OAAoB;IACrC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAEY,QAAA,UAAU,GAAG;IACxB,GAAG,CAAC,KAAa,EAAE,OAAiB,EAAE,OAAoB;QACxD,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,QAAQ,EAAE,IAAI,EAAE;YAC1C,KAAK,EAAE,OAAO,EAAE,KAAK;YACrB,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,MAAM,CAAC,KAAK,CAAC;QACrB,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE,CAAC,CAAC;QAC5G,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IAC7B,CAAC;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface DockerVolume {
2
+ Name: string;
3
+ Driver: string;
4
+ Mountpoint: string;
5
+ }
6
+ export declare const volumeService: {
7
+ createVolume(name: string): void;
8
+ exists(name: string): boolean;
9
+ removeVolume(name: string): void;
10
+ list(): DockerVolume[];
11
+ };
12
+ //# sourceMappingURL=docker-volume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-volume.d.ts","sourceRoot":"","sources":["../../src/services/docker-volume.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAmBD,eAAO,MAAM,aAAa;uBACL,MAAM,GAAG,IAAI;iBAOnB,MAAM,GAAG,OAAO;uBASV,MAAM,GAAG,IAAI;YAOxB,YAAY,EAAE;CAiBvB,CAAC"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.volumeService = void 0;
4
+ const spawn_1 = require("../utils/spawn");
5
+ function runDocker(args) {
6
+ const result = (0, spawn_1.spawnCommand)('docker', args, {
7
+ encoding: 'utf8',
8
+ timeout: 30000
9
+ });
10
+ if (result.error) {
11
+ throw result.error;
12
+ }
13
+ if (result.status === null) {
14
+ throw new Error('docker command not found. Is Docker installed?');
15
+ }
16
+ return result;
17
+ }
18
+ exports.volumeService = {
19
+ createVolume(name) {
20
+ const result = runDocker(['volume', 'create', name]);
21
+ if (result.status !== 0) {
22
+ throw new Error(`Failed to create volume '${name}': ${result.stderr?.trim() || 'unknown error'}`);
23
+ }
24
+ },
25
+ exists(name) {
26
+ try {
27
+ const result = runDocker(['volume', 'inspect', name]);
28
+ return result.status === 0 && Boolean(result.stdout?.trim());
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ },
34
+ removeVolume(name) {
35
+ const result = runDocker(['volume', 'rm', name]);
36
+ if (result.status !== 0) {
37
+ throw new Error(`Failed to remove volume '${name}': ${result.stderr?.trim() || 'unknown error'}`);
38
+ }
39
+ },
40
+ list() {
41
+ const result = runDocker(['volume', 'ls', '--no-trunc', '--format', '{{json .}}']);
42
+ if (result.status !== 0) {
43
+ throw new Error(`Failed to list volumes: ${result.stderr?.trim() || 'unknown error'}`);
44
+ }
45
+ return (result.stdout ?? '')
46
+ .trim()
47
+ .split(/\r?\n/)
48
+ .filter(Boolean)
49
+ .map((line) => JSON.parse(line))
50
+ .map((item) => ({
51
+ Name: item.Name ?? '',
52
+ Driver: item.Driver ?? '',
53
+ Mountpoint: item.Mountpoint ?? ''
54
+ }));
55
+ }
56
+ };
57
+ //# sourceMappingURL=docker-volume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-volume.js","sourceRoot":"","sources":["../../src/services/docker-volume.ts"],"names":[],"mappings":";;;AACA,0CAA8C;AAQ9C,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,QAAQ,EAAE,IAAI,EAAE;QAC1C,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,MAAM,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAEY,QAAA,aAAa,GAAG;IAC3B,YAAY,CAAC,IAAY;QACvB,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YACtD,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;IAED,IAAI;QACF,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;QACnF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;aACzB,IAAI,EAAE;aACN,KAAK,CAAC,OAAO,CAAC;aACd,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAA2B,CAAC;aACzD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACd,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;SAClC,CAAC,CAAC,CAAC;IACR,CAAC;CACF,CAAC"}
@@ -0,0 +1,29 @@
1
+ export interface ResolvedAddress {
2
+ address: string;
3
+ family: number;
4
+ }
5
+ export interface LocalAddressInfo {
6
+ addresses: string[];
7
+ hasExternalIpv6: boolean;
8
+ }
9
+ export interface HostResolutionCheck {
10
+ host: string;
11
+ resolved: ResolvedAddress[];
12
+ matched: ResolvedAddress[];
13
+ warnings: string[];
14
+ errors: string[];
15
+ status: 'pass' | 'warn' | 'fail';
16
+ }
17
+ export interface DomainResolutionCheck {
18
+ domain: string;
19
+ wildcardProbeHost: string;
20
+ checkedHosts: HostResolutionCheck[];
21
+ localAddresses: string[];
22
+ hasExternalIpv6: boolean;
23
+ status: 'pass' | 'warn' | 'fail';
24
+ }
25
+ export declare function getLocalAddressInfo(): LocalAddressInfo;
26
+ export declare function checkHostResolution(host: string, resolved: ResolvedAddress[], localInfo: LocalAddressInfo): HostResolutionCheck;
27
+ export declare function wildcardProbeHost(domain: string): string;
28
+ export declare function checkDomainResolvesToThisMachine(domain: string): Promise<DomainResolutionCheck>;
29
+ //# sourceMappingURL=domain-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-checker.d.ts","sourceRoot":"","sources":["../../src/services/domain-checker.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAClC;AAmBD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAoBtD;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,eAAe,EAAE,EAC3B,SAAS,EAAE,gBAAgB,GAC1B,mBAAmB,CAoCrB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAsB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAsCrG"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getLocalAddressInfo = getLocalAddressInfo;
37
+ exports.checkHostResolution = checkHostResolution;
38
+ exports.wildcardProbeHost = wildcardProbeHost;
39
+ exports.checkDomainResolvesToThisMachine = checkDomainResolvesToThisMachine;
40
+ const dns_1 = require("dns");
41
+ const net = __importStar(require("net"));
42
+ const os = __importStar(require("os"));
43
+ function stripIpv6Scope(address) {
44
+ return address.split('%')[0];
45
+ }
46
+ function normalizeIpv4Mapped(address) {
47
+ const lower = address.toLowerCase();
48
+ if (lower.startsWith('::ffff:')) {
49
+ return lower.slice('::ffff:'.length);
50
+ }
51
+ return lower;
52
+ }
53
+ function normalizeAddress(address) {
54
+ return normalizeIpv4Mapped(stripIpv6Scope(address).trim());
55
+ }
56
+ function getLocalAddressInfo() {
57
+ const addresses = new Set(['127.0.0.1', '::1']);
58
+ let hasExternalIpv6 = false;
59
+ for (const entries of Object.values(os.networkInterfaces())) {
60
+ for (const entry of entries ?? []) {
61
+ const normalized = normalizeAddress(entry.address);
62
+ if (normalized && net.isIP(normalized)) {
63
+ addresses.add(normalized);
64
+ }
65
+ if (entry.family === 'IPv6' && !entry.internal) {
66
+ hasExternalIpv6 = true;
67
+ }
68
+ }
69
+ }
70
+ return {
71
+ addresses: [...addresses],
72
+ hasExternalIpv6
73
+ };
74
+ }
75
+ function checkHostResolution(host, resolved, localInfo) {
76
+ const localAddresses = new Set(localInfo.addresses.map(normalizeAddress));
77
+ const matched = resolved.filter((record) => localAddresses.has(normalizeAddress(record.address)));
78
+ const ipv4Resolved = resolved.filter((record) => record.family === 4);
79
+ const ipv6Resolved = resolved.filter((record) => record.family === 6);
80
+ const ipv4Matched = matched.some((record) => record.family === 4);
81
+ const ipv6Matched = matched.some((record) => record.family === 6);
82
+ const warnings = [];
83
+ const errors = [];
84
+ if (resolved.length === 0) {
85
+ errors.push(`${host} did not resolve to any A or AAAA records.`);
86
+ }
87
+ if (ipv6Resolved.length > 0 && !localInfo.hasExternalIpv6 && !ipv6Matched) {
88
+ warnings.push(`${host} has IPv6 records, but this machine does not appear to have external IPv6 enabled.`);
89
+ }
90
+ if (matched.length === 0) {
91
+ errors.push(`${host} does not resolve to 127.0.0.1, ::1, or any local network interface address.`);
92
+ }
93
+ else if (ipv4Matched && ipv6Resolved.length > 0 && !ipv6Matched) {
94
+ warnings.push(`${host} resolves to this machine over IPv4, but its IPv6 records do not match this machine.`);
95
+ }
96
+ else if (ipv6Matched && ipv4Resolved.length > 0 && !ipv4Matched) {
97
+ warnings.push(`${host} resolves to this machine over IPv6, but its IPv4 records do not match this machine.`);
98
+ }
99
+ const status = errors.length > 0 ? 'fail' : warnings.length > 0 ? 'warn' : 'pass';
100
+ return {
101
+ host,
102
+ resolved,
103
+ matched,
104
+ warnings,
105
+ errors,
106
+ status
107
+ };
108
+ }
109
+ function wildcardProbeHost(domain) {
110
+ return `runestone-wildcard-check.${domain.trim()}`;
111
+ }
112
+ async function checkDomainResolvesToThisMachine(domain) {
113
+ const normalizedDomain = domain.trim();
114
+ const localInfo = getLocalAddressInfo();
115
+ const probeHost = wildcardProbeHost(normalizedDomain);
116
+ const hosts = [probeHost];
117
+ const checkedHosts = [];
118
+ for (const host of hosts) {
119
+ try {
120
+ const resolved = await dns_1.promises.lookup(host, { all: true, verbatim: true });
121
+ checkedHosts.push(checkHostResolution(host, resolved, localInfo));
122
+ }
123
+ catch (error) {
124
+ const message = error instanceof Error ? error.message : String(error);
125
+ checkedHosts.push({
126
+ host,
127
+ resolved: [],
128
+ matched: [],
129
+ warnings: [],
130
+ errors: [`${host} could not be resolved: ${message}`],
131
+ status: 'fail'
132
+ });
133
+ }
134
+ }
135
+ const status = checkedHosts.some((host) => host.status === 'fail')
136
+ ? 'fail'
137
+ : checkedHosts.some((host) => host.status === 'warn')
138
+ ? 'warn'
139
+ : 'pass';
140
+ return {
141
+ domain: normalizedDomain,
142
+ wildcardProbeHost: probeHost,
143
+ checkedHosts,
144
+ localAddresses: localInfo.addresses,
145
+ hasExternalIpv6: localInfo.hasExternalIpv6,
146
+ status
147
+ };
148
+ }
149
+ //# sourceMappingURL=domain-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-checker.js","sourceRoot":"","sources":["../../src/services/domain-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function isListeningLineForPort(line: string, port: number): boolean;
2
+ export declare function isPortAvailable(port: number): Promise<boolean>;
3
+ //# sourceMappingURL=port-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-checker.d.ts","sourceRoot":"","sources":["../../src/services/port-checker.ts"],"names":[],"mappings":"AAOA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAsB1E;AAiBD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIpE"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isListeningLineForPort = isListeningLineForPort;
4
+ exports.isPortAvailable = isPortAvailable;
5
+ const spawn_1 = require("../utils/spawn");
6
+ function addressHasPort(address, port) {
7
+ const escapedPort = String(port).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
8
+ return new RegExp(`[:.]${escapedPort}$`).test(address.trim());
9
+ }
10
+ function isListeningLineForPort(line, port) {
11
+ const parts = line.trim().split(/\s+/);
12
+ if (parts.length === 0) {
13
+ return false;
14
+ }
15
+ const hasListeningState = parts.some((part) => /^LISTEN(?:ING)?$/i.test(part));
16
+ if (!hasListeningState) {
17
+ return false;
18
+ }
19
+ const upperFirst = parts[0].toUpperCase();
20
+ const localAddress = upperFirst === 'LISTEN'
21
+ ? parts[3]
22
+ : /^TCP\d*$/i.test(parts[0]) || /^UDP\d*$/i.test(parts[0])
23
+ ? parts[3]?.toUpperCase() === 'LISTEN' || parts[3]?.toUpperCase() === 'LISTENING'
24
+ ? parts[1]
25
+ : parts[3]
26
+ : undefined;
27
+ return Boolean(localAddress && addressHasPort(localAddress, port));
28
+ }
29
+ function netstatOutput() {
30
+ const args = process.platform === 'win32' ? ['-ano'] : ['-an'];
31
+ const result = (0, spawn_1.spawnCommand)('netstat', args, { encoding: 'utf8' });
32
+ if (result.error) {
33
+ throw result.error;
34
+ }
35
+ if (result.status !== 0) {
36
+ throw new Error(result.stderr?.trim() || 'netstat failed');
37
+ }
38
+ return result.stdout ?? '';
39
+ }
40
+ async function isPortAvailable(port) {
41
+ return !netstatOutput()
42
+ .split(/\r?\n/)
43
+ .some((line) => isListeningLineForPort(line, port));
44
+ }
45
+ //# sourceMappingURL=port-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-checker.js","sourceRoot":"","sources":["../../src/services/port-checker.ts"],"names":[],"mappings":";;AAOA,wDAsBC;AAiBD,0CAIC;AAlDD,0CAA8C;AAE9C,SAAS,cAAc,CAAC,OAAe,EAAE,IAAY;IACnD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACxE,OAAO,IAAI,MAAM,CAAC,OAAO,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,SAAgB,sBAAsB,CAAC,IAAY,EAAE,IAAY;IAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/E,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1C,MAAM,YAAY,GAChB,UAAU,KAAK,QAAQ;QACrB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACxD,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,WAAW;gBAC/E,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBACV,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACZ,CAAC,CAAC,SAAS,CAAC;IAElB,OAAO,OAAO,CAAC,YAAY,IAAI,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,SAAS,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnE,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,MAAM,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,gBAAgB,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;AAC7B,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,OAAO,CAAC,aAAa,EAAE;SACpB,KAAK,CAAC,OAAO,CAAC;SACd,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const sshManager: {
2
+ scanHomeDirectory(): string[];
3
+ listKeys(volumeName?: string): string[];
4
+ addKey(keyPath: string, volumeName?: string): boolean;
5
+ addKeys(keys?: string[], volumeName?: string): void;
6
+ };
7
+ //# sourceMappingURL=ssh-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-manager.d.ts","sourceRoot":"","sources":["../../src/services/ssh-manager.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,UAAU;yBACA,MAAM,EAAE;mCAYe,MAAM,EAAE;oBA0BpC,MAAM,wBAAqC,OAAO;mBAwBnD,MAAM,EAAE,wBAAqC,IAAI;CAMjE,CAAC"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.sshManager = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os_detector_1 = require("../utils/os-detector");
40
+ const docker_run_1 = require("./docker-run");
41
+ const docker_volume_1 = require("./docker-volume");
42
+ const DEFAULT_VOLUME_NAME = 'runestone-ssh';
43
+ const SSH_MOUNT_PATH = '/root/.ssh';
44
+ const PRIVATE_KEY_NAMES = new Set(['id_rsa', 'id_ecdsa', 'id_ed25519', 'id_dsa']);
45
+ function isPrivateKeyFile(filePath) {
46
+ return PRIVATE_KEY_NAMES.has(path.basename(filePath));
47
+ }
48
+ function quoteForShell(value) {
49
+ return `'${value.replace(/'/g, `'\\''`)}'`;
50
+ }
51
+ function ensureVolume(volumeName) {
52
+ if (!docker_volume_1.volumeService.exists(volumeName)) {
53
+ docker_volume_1.volumeService.createVolume(volumeName);
54
+ }
55
+ }
56
+ function writeFileToVolume(volumeName, basename, content, mode) {
57
+ const target = `${SSH_MOUNT_PATH}/${basename}`;
58
+ const fileMode = mode ?? '644';
59
+ docker_run_1.runService.run('alpine:latest', ['sh', '-c', 'dd of="$1"; chmod "$2" "$1"', 'sh', target, fileMode], {
60
+ rm: true,
61
+ interactive: true,
62
+ volumes: [{ source: volumeName, target: SSH_MOUNT_PATH }],
63
+ input: content
64
+ });
65
+ }
66
+ exports.sshManager = {
67
+ scanHomeDirectory() {
68
+ const sshDir = os_detector_1.osDetector.sshDir();
69
+ if (!fs.existsSync(sshDir)) {
70
+ return [];
71
+ }
72
+ return fs
73
+ .readdirSync(sshDir)
74
+ .map((file) => path.join(sshDir, file))
75
+ .filter((file) => fs.statSync(file).isFile() && isPrivateKeyFile(file));
76
+ },
77
+ listKeys(volumeName = DEFAULT_VOLUME_NAME) {
78
+ try {
79
+ const output = docker_run_1.runService.run('alpine:latest', [
80
+ 'sh',
81
+ '-c',
82
+ 'for f in "$1"/*; do [ -f "$f" ] || continue; case "$f" in *.pub) continue;; esac; basename "$f"; done',
83
+ 'sh',
84
+ SSH_MOUNT_PATH
85
+ ], {
86
+ rm: true,
87
+ volumes: [{ source: volumeName, target: SSH_MOUNT_PATH }]
88
+ });
89
+ return output
90
+ .split(/\r?\n/)
91
+ .map((line) => line.trim())
92
+ .filter(Boolean);
93
+ }
94
+ catch {
95
+ return [];
96
+ }
97
+ },
98
+ addKey(keyPath, volumeName = DEFAULT_VOLUME_NAME) {
99
+ const absolutePath = path.resolve(keyPath);
100
+ if (!fs.existsSync(absolutePath)) {
101
+ throw new Error(`SSH key not found: ${absolutePath}`);
102
+ }
103
+ if (!fs.statSync(absolutePath).isFile()) {
104
+ throw new Error(`SSH key is not a file: ${absolutePath}`);
105
+ }
106
+ if (!isPrivateKeyFile(absolutePath)) {
107
+ throw new Error(`File '${path.basename(absolutePath)}' is not a supported SSH private key name`);
108
+ }
109
+ ensureVolume(volumeName);
110
+ const basename = path.basename(absolutePath);
111
+ writeFileToVolume(volumeName, basename, fs.readFileSync(absolutePath, 'utf8'), '600');
112
+ const publicKeyPath = `${absolutePath}.pub`;
113
+ if (fs.existsSync(publicKeyPath) && fs.statSync(publicKeyPath).isFile()) {
114
+ writeFileToVolume(volumeName, `${basename}.pub`, fs.readFileSync(publicKeyPath, 'utf8'));
115
+ }
116
+ return true;
117
+ },
118
+ addKeys(keys, volumeName = DEFAULT_VOLUME_NAME) {
119
+ const keyPaths = keys ?? this.scanHomeDirectory();
120
+ for (const keyPath of keyPaths) {
121
+ this.addKey(keyPath, volumeName);
122
+ }
123
+ }
124
+ };
125
+ //# sourceMappingURL=ssh-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-manager.js","sourceRoot":"","sources":["../../src/services/ssh-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command, Help } from 'commander';
2
+ export declare class RunestoneCommand extends Command {
3
+ createHelp(): Help;
4
+ }
5
+ export declare function createCommand(name?: string): Command;
6
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/utils/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAU,MAAM,WAAW,CAAC;AAyBlD,qBAAa,gBAAiB,SAAQ,OAAO;IAC3C,UAAU,IAAI,IAAI;CAGnB;AAED,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAEpD"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RunestoneCommand = void 0;
4
+ exports.createCommand = createCommand;
5
+ const commander_1 = require("commander");
6
+ class RunestoneHelp extends commander_1.Help {
7
+ commandUsage(cmd) {
8
+ const usage = super.commandUsage(cmd);
9
+ if (this.hasVisibleNonHelpOptions(cmd)) {
10
+ return usage;
11
+ }
12
+ return usage
13
+ .replace(/\s*\[options\]\s*/g, ' ')
14
+ .replace(/\s{2,}/g, ' ')
15
+ .trim();
16
+ }
17
+ visibleOptions(cmd) {
18
+ const options = super.visibleOptions(cmd);
19
+ return this.hasVisibleNonHelpOptions(cmd) ? options : [];
20
+ }
21
+ hasVisibleNonHelpOptions(cmd) {
22
+ return super.visibleOptions(cmd).some((option) => option.short !== '-h' && option.long !== '--help');
23
+ }
24
+ }
25
+ class RunestoneCommand extends commander_1.Command {
26
+ createHelp() {
27
+ return new RunestoneHelp();
28
+ }
29
+ }
30
+ exports.RunestoneCommand = RunestoneCommand;
31
+ function createCommand(name) {
32
+ return new RunestoneCommand(name).addHelpCommand(false);
33
+ }
34
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/utils/command.ts"],"names":[],"mappings":";;;AA+BA,sCAEC;AAjCD,yCAAkD;AAElD,MAAM,aAAc,SAAQ,gBAAI;IAC9B,YAAY,CAAC,GAAY;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,KAAK;aACT,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC;aAClC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,IAAI,EAAE,CAAC;IACZ,CAAC;IAED,cAAc,CAAC,GAAY;QACzB,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,CAAC;IAEO,wBAAwB,CAAC,GAAY;QAC3C,OAAO,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACvG,CAAC;CACF;AAED,MAAa,gBAAiB,SAAQ,mBAAO;IAC3C,UAAU;QACR,OAAO,IAAI,aAAa,EAAE,CAAC;IAC7B,CAAC;CACF;AAJD,4CAIC;AAED,SAAgB,aAAa,CAAC,IAAa;IACzC,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const dockerChecker: {
2
+ isInstalled(): boolean;
3
+ composePluginInstalled(): boolean;
4
+ };
5
+ //# sourceMappingURL=docker-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-checker.d.ts","sourceRoot":"","sources":["../../src/utils/docker-checker.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa;mBACT,OAAO;8BAaI,OAAO;CAYlC,CAAC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dockerChecker = void 0;
4
+ const spawn_1 = require("./spawn");
5
+ exports.dockerChecker = {
6
+ isInstalled() {
7
+ try {
8
+ const result = (0, spawn_1.spawnCommand)('docker', ['--version'], {
9
+ encoding: 'utf8',
10
+ timeout: 5000
11
+ });
12
+ return result.status === 0 && Boolean(result.stdout?.toString().trim());
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ },
18
+ composePluginInstalled() {
19
+ try {
20
+ const result = (0, spawn_1.spawnCommand)('docker', ['compose', 'version'], {
21
+ encoding: 'utf8',
22
+ timeout: 5000
23
+ });
24
+ return result.status === 0 && Boolean(result.stdout?.toString().trim());
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ };
31
+ //# sourceMappingURL=docker-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-checker.js","sourceRoot":"","sources":["../../src/utils/docker-checker.ts"],"names":[],"mappings":";;;AAAA,mCAAuC;AAE1B,QAAA,aAAa,GAAG;IAC3B,WAAW;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE;gBACnD,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,sBAAsB;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE;gBAC5D,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF,CAAC"}