@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,32 @@
1
+ export interface RunestoneEnv {
2
+ HOST_DOMAIN: string;
3
+ PREFIX: string;
4
+ HTTPS_PORT: string;
5
+ HTTP_PORT: string;
6
+ SMTP_PORT: string;
7
+ RUNESTONE_IMAGE: string;
8
+ RUNESTONE_TAG: string;
9
+ MKCERT_INSTALLED: string;
10
+ RUNESTONE_VERSION: string;
11
+ RUNESTONE_LANG: string;
12
+ WEB_ENTRYPOINT_PORT: string;
13
+ WEB_ENTRYPOINT_NAME: string;
14
+ WEB_SECURE_ENTRYPOINT_PORT: string;
15
+ WEB_SECURE_ENTRYPOINT_NAME: string;
16
+ PROJECT_DIR: string;
17
+ ENV_PATH: string;
18
+ COMPOSE_FILE_PATH: string;
19
+ NETWORK_NAME: string;
20
+ SSH_VOLUME_NAME: string;
21
+ ENV_FILE_EXISTS: boolean;
22
+ REQUIRED_VARS_PRESENT: boolean;
23
+ }
24
+ export type EnvInput = Partial<Pick<RunestoneEnv, 'HOST_DOMAIN' | 'PREFIX' | 'HTTPS_PORT' | 'HTTP_PORT' | 'SMTP_PORT' | 'RUNESTONE_IMAGE' | 'RUNESTONE_TAG' | 'MKCERT_INSTALLED' | 'RUNESTONE_VERSION' | 'WEB_ENTRYPOINT_PORT' | 'WEB_ENTRYPOINT_NAME' | 'WEB_SECURE_ENTRYPOINT_PORT' | 'WEB_SECURE_ENTRYPOINT_NAME'>>;
25
+ export declare const DEFAULT_ENV: Required<EnvInput>;
26
+ export declare const envLoader: {
27
+ load(cliEnvPath?: string, projectArg?: string): RunestoneEnv;
28
+ write(envPath: string, config: EnvInput): void;
29
+ exists(envPath: string): boolean;
30
+ hasRequiredVars(config: RunestoneEnv): boolean;
31
+ };
32
+ //# sourceMappingURL=env-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-loader.d.ts","sourceRoot":"","sources":["../../src/utils/env-loader.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0BAA0B,EAAE,MAAM,CAAC;IACnC,0BAA0B,EAAE,MAAM,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,MAAM,QAAQ,GAAG,OAAO,CAC5B,IAAI,CACF,YAAY,EACV,aAAa,GACb,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,WAAW,GACX,iBAAiB,GACjB,eAAe,GACf,kBAAkB,GAClB,mBAAmB,GACnB,qBAAqB,GACrB,qBAAqB,GACrB,4BAA4B,GAC5B,4BAA4B,CAC/B,CACF,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAc1C,CAAC;AAUF,eAAO,MAAM,SAAS;sBACF,MAAM,eAAe,MAAM,GAAG,YAAY;mBAkC7C,MAAM,UAAU,QAAQ,GAAG,IAAI;oBAc9B,MAAM,GAAG,OAAO;4BAIR,YAAY,GAAG,OAAO;CAG/C,CAAC"}
@@ -0,0 +1,113 @@
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.envLoader = exports.DEFAULT_ENV = void 0;
37
+ const dotenv = __importStar(require("dotenv"));
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const path_helpers_1 = require("./path-helpers");
41
+ const tool_state_1 = require("./tool-state");
42
+ exports.DEFAULT_ENV = {
43
+ HOST_DOMAIN: 'local.developers-homelab.net',
44
+ PREFIX: 'runestone',
45
+ HTTPS_PORT: '443',
46
+ HTTP_PORT: '80',
47
+ SMTP_PORT: '1025',
48
+ RUNESTONE_IMAGE: 'cymondez/runestone',
49
+ RUNESTONE_TAG: '5.2',
50
+ MKCERT_INSTALLED: 'false',
51
+ RUNESTONE_VERSION: '5',
52
+ WEB_ENTRYPOINT_PORT: '80',
53
+ WEB_ENTRYPOINT_NAME: 'web',
54
+ WEB_SECURE_ENTRYPOINT_PORT: '443',
55
+ WEB_SECURE_ENTRYPOINT_NAME: 'websecure'
56
+ };
57
+ function readEnvFile(envPath) {
58
+ if (!fs.existsSync(envPath)) {
59
+ return {};
60
+ }
61
+ return dotenv.parse(fs.readFileSync(envPath));
62
+ }
63
+ exports.envLoader = {
64
+ load(cliEnvPath, projectArg) {
65
+ const projectDir = path_helpers_1.pathHelpers.resolveProjectDir(projectArg);
66
+ const envPath = path_helpers_1.pathHelpers.resolveEnvPath(cliEnvPath, projectDir);
67
+ const envFileExists = fs.existsSync(envPath);
68
+ const parsed = readEnvFile(envPath);
69
+ const merged = { ...exports.DEFAULT_ENV, ...parsed };
70
+ const prefix = merged.PREFIX || exports.DEFAULT_ENV.PREFIX;
71
+ return {
72
+ HOST_DOMAIN: merged.HOST_DOMAIN || exports.DEFAULT_ENV.HOST_DOMAIN,
73
+ PREFIX: prefix,
74
+ HTTPS_PORT: merged.HTTPS_PORT || exports.DEFAULT_ENV.HTTPS_PORT,
75
+ HTTP_PORT: merged.HTTP_PORT || exports.DEFAULT_ENV.HTTP_PORT,
76
+ SMTP_PORT: merged.SMTP_PORT || exports.DEFAULT_ENV.SMTP_PORT,
77
+ RUNESTONE_IMAGE: merged.RUNESTONE_IMAGE || exports.DEFAULT_ENV.RUNESTONE_IMAGE,
78
+ RUNESTONE_TAG: merged.RUNESTONE_TAG || exports.DEFAULT_ENV.RUNESTONE_TAG,
79
+ MKCERT_INSTALLED: merged.MKCERT_INSTALLED || exports.DEFAULT_ENV.MKCERT_INSTALLED,
80
+ RUNESTONE_VERSION: merged.RUNESTONE_VERSION || exports.DEFAULT_ENV.RUNESTONE_VERSION,
81
+ RUNESTONE_LANG: tool_state_1.toolState.readLocale() || 'en',
82
+ WEB_ENTRYPOINT_PORT: merged.WEB_ENTRYPOINT_PORT || merged.HTTP_PORT || exports.DEFAULT_ENV.WEB_ENTRYPOINT_PORT,
83
+ WEB_ENTRYPOINT_NAME: merged.WEB_ENTRYPOINT_NAME || exports.DEFAULT_ENV.WEB_ENTRYPOINT_NAME,
84
+ WEB_SECURE_ENTRYPOINT_PORT: merged.WEB_SECURE_ENTRYPOINT_PORT || merged.HTTPS_PORT || exports.DEFAULT_ENV.WEB_SECURE_ENTRYPOINT_PORT,
85
+ WEB_SECURE_ENTRYPOINT_NAME: merged.WEB_SECURE_ENTRYPOINT_NAME || exports.DEFAULT_ENV.WEB_SECURE_ENTRYPOINT_NAME,
86
+ PROJECT_DIR: projectDir,
87
+ ENV_PATH: envPath,
88
+ COMPOSE_FILE_PATH: path_helpers_1.pathHelpers.resolveComposePath(projectArg),
89
+ NETWORK_NAME: `${prefix}-network`,
90
+ SSH_VOLUME_NAME: `${prefix}-ssh`,
91
+ ENV_FILE_EXISTS: envFileExists,
92
+ REQUIRED_VARS_PRESENT: Boolean(parsed.HOST_DOMAIN && parsed.PREFIX)
93
+ };
94
+ },
95
+ write(envPath, config) {
96
+ const dir = path.dirname(envPath);
97
+ fs.mkdirSync(dir, { recursive: true });
98
+ const existing = readEnvFile(envPath);
99
+ const merged = { ...existing, ...config };
100
+ const content = Object.entries(merged)
101
+ .filter(([, value]) => value !== undefined)
102
+ .map(([key, value]) => `${key}=${value}`)
103
+ .join('\n');
104
+ fs.writeFileSync(envPath, `${content}\n`, 'utf8');
105
+ },
106
+ exists(envPath) {
107
+ return fs.existsSync(path.resolve(envPath));
108
+ },
109
+ hasRequiredVars(config) {
110
+ return config.ENV_FILE_EXISTS && config.REQUIRED_VARS_PRESENT;
111
+ }
112
+ };
113
+ //# sourceMappingURL=env-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-loader.js","sourceRoot":"","sources":["../../src/utils/env-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare const logger: {
2
+ info(message: string): void;
3
+ success(message: string): void;
4
+ warn(message: string): void;
5
+ error(message: string): void;
6
+ debug(message: string): void;
7
+ };
8
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,MAAM;kBACH,MAAM,GAAG,IAAI;qBAIV,MAAM,GAAG,IAAI;kBAIhB,MAAM,GAAG,IAAI;mBAIZ,MAAM,GAAG,IAAI;mBAIb,MAAM,GAAG,IAAI;CAK7B,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logger = void 0;
4
+ const kleur_1 = require("kleur");
5
+ const DEBUG = process.env.DEBUG === '1';
6
+ exports.logger = {
7
+ info(message) {
8
+ console.log(`${(0, kleur_1.cyan)('[info]')} ${message}`);
9
+ },
10
+ success(message) {
11
+ console.log(`${(0, kleur_1.green)('[ok]')} ${message}`);
12
+ },
13
+ warn(message) {
14
+ console.warn(`${(0, kleur_1.yellow)('[warn]')} ${message}`);
15
+ },
16
+ error(message) {
17
+ console.error(`${(0, kleur_1.red)('[error]')} ${message}`);
18
+ },
19
+ debug(message) {
20
+ if (DEBUG) {
21
+ console.log(`${(0, kleur_1.cyan)('[debug]')} ${message}`);
22
+ }
23
+ }
24
+ };
25
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;AAAA,iCAAiD;AAEjD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;AAE3B,QAAA,MAAM,GAAG;IACpB,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,YAAI,EAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,aAAK,EAAC,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAA,cAAM,EAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,GAAG,IAAA,WAAG,EAAC,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,YAAI,EAAC,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function loadRunestoneLogo(): string;
2
+ //# sourceMappingURL=logo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo.d.ts","sourceRoot":"","sources":["../../src/utils/logo.ts"],"names":[],"mappings":"AASA,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadRunestoneLogo = loadRunestoneLogo;
4
+ const RUNESTONE_LOGO = String.raw `
5
+ ██████╗ ██╗ ██╗███╗ ██╗███████╗███████╗████████╗ ██████╗ ███╗ ██╗███████╗
6
+ ██╔══██╗██║ ██║████╗ ██║██╔════╝██╔════╝╚══██╔══╝██╔═══██╗████╗ ██║██╔════╝
7
+ ██████╔╝██║ ██║██╔██╗ ██║█████╗ ███████╗ ██║ ██║ ██║██╔██╗ ██║█████╗
8
+ ██╔══██╗██║ ██║██║╚██╗██║██╔══╝ ╚════██║ ██║ ██║ ██║██║╚██╗██║██╔══╝
9
+ ██║ ██║╚██████╔╝██║ ╚████║███████╗███████║ ██║ ╚██████╔╝██║ ╚████║███████╗
10
+ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝
11
+ `;
12
+ function loadRunestoneLogo() {
13
+ return RUNESTONE_LOGO;
14
+ }
15
+ //# sourceMappingURL=logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo.js","sourceRoot":"","sources":["../../src/utils/logo.ts"],"names":[],"mappings":";;AASA,8CAEC;AAXD,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;CAOhC,CAAC;AAEF,SAAgB,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type RunestonePlatform = 'win32' | 'darwin' | 'linux';
2
+ export type RunestoneArch = 'x64' | 'arm64' | 'other';
3
+ export declare const osDetector: {
4
+ platform(): RunestonePlatform;
5
+ arch(): RunestoneArch;
6
+ homeDir(): string;
7
+ sshDir(): string;
8
+ isWsl(): boolean;
9
+ };
10
+ //# sourceMappingURL=os-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"os-detector.d.ts","sourceRoot":"","sources":["../../src/utils/os-detector.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC7D,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;AAEtD,eAAO,MAAM,UAAU;gBACT,iBAAiB;YAYrB,aAAa;eASV,MAAM;cAIP,MAAM;aAIP,OAAO;CAYjB,CAAC"}
@@ -0,0 +1,76 @@
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.osDetector = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const os = __importStar(require("os"));
39
+ const path = __importStar(require("path"));
40
+ exports.osDetector = {
41
+ platform() {
42
+ if (process.platform === 'win32') {
43
+ return 'win32';
44
+ }
45
+ if (process.platform === 'darwin') {
46
+ return 'darwin';
47
+ }
48
+ return 'linux';
49
+ },
50
+ arch() {
51
+ const arch = os.arch();
52
+ if (arch === 'x64' || arch === 'arm64') {
53
+ return arch;
54
+ }
55
+ return 'other';
56
+ },
57
+ homeDir() {
58
+ return os.homedir();
59
+ },
60
+ sshDir() {
61
+ return path.join(this.homeDir(), '.ssh');
62
+ },
63
+ isWsl() {
64
+ try {
65
+ if (!fs.existsSync('/proc/version')) {
66
+ return false;
67
+ }
68
+ const version = fs.readFileSync('/proc/version', 'utf8').toLowerCase();
69
+ return version.includes('microsoft') || version.includes('wsl');
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ };
76
+ //# sourceMappingURL=os-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"os-detector.js","sourceRoot":"","sources":["../../src/utils/os-detector.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAKhB,QAAA,UAAU,GAAG;IACxB,QAAQ;QACN,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI;QACF,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK;QACH,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACpC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YACvE,OAAO,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const pathHelpers: {
2
+ runestoneDir(): string;
3
+ resolveProjectDir(projectArg?: string): string;
4
+ resolveComposePath(projectArg?: string): string;
5
+ resolveEnvPath(cliArg?: string, projectDir?: string): string;
6
+ ensureDir(dir: string): void;
7
+ normalizePath(value: string): string;
8
+ };
9
+ //# sourceMappingURL=path-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/path-helpers.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,WAAW;oBACN,MAAM;mCAIS,MAAM,GAAG,MAAM;oCAcd,MAAM,GAAG,MAAM;4BAQvB,MAAM,eAAe,MAAM,GAAG,MAAM;mBAQ7C,MAAM,GAAG,IAAI;yBAIP,MAAM,GAAG,MAAM;CAcrC,CAAC"}
@@ -0,0 +1,96 @@
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.pathHelpers = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const os = __importStar(require("os"));
39
+ const path = __importStar(require("path"));
40
+ const tool_state_1 = require("./tool-state");
41
+ function maybeComposeFile(projectOrFile) {
42
+ const resolved = path.resolve(projectOrFile);
43
+ const ext = path.extname(resolved).toLowerCase();
44
+ if (ext === '.yml' || ext === '.yaml') {
45
+ return resolved;
46
+ }
47
+ const yamlPath = path.join(resolved, 'compose.yaml');
48
+ if (fs.existsSync(yamlPath)) {
49
+ return yamlPath;
50
+ }
51
+ return path.join(resolved, 'compose.yml');
52
+ }
53
+ exports.pathHelpers = {
54
+ runestoneDir() {
55
+ return tool_state_1.toolState.readRunestonePath() ?? path.join(os.homedir(), '.runestone');
56
+ },
57
+ resolveProjectDir(projectArg) {
58
+ if (!projectArg) {
59
+ return this.runestoneDir();
60
+ }
61
+ const resolved = path.resolve(projectArg);
62
+ const ext = path.extname(resolved).toLowerCase();
63
+ if (ext === '.yml' || ext === '.yaml') {
64
+ return path.dirname(resolved);
65
+ }
66
+ return resolved;
67
+ },
68
+ resolveComposePath(projectArg) {
69
+ if (!projectArg) {
70
+ return path.join(this.runestoneDir(), 'compose.yml');
71
+ }
72
+ return maybeComposeFile(projectArg);
73
+ },
74
+ resolveEnvPath(cliArg, projectDir) {
75
+ if (cliArg) {
76
+ return path.resolve(cliArg);
77
+ }
78
+ return path.join(projectDir ?? this.runestoneDir(), '.env');
79
+ },
80
+ ensureDir(dir) {
81
+ fs.mkdirSync(path.resolve(dir), { recursive: true });
82
+ },
83
+ normalizePath(value) {
84
+ if (process.platform !== 'win32') {
85
+ return value;
86
+ }
87
+ const drivePath = /^([a-zA-Z]):\\(.*)$/.exec(value);
88
+ if (!drivePath) {
89
+ return value;
90
+ }
91
+ const drive = drivePath[1].toLowerCase();
92
+ const rest = drivePath[2].replace(/\\/g, '/');
93
+ return `/mnt/${drive}/${rest}`;
94
+ }
95
+ };
96
+ //# sourceMappingURL=path-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-helpers.js","sourceRoot":"","sources":["../../src/utils/path-helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAC7B,6CAAyC;AAEzC,SAAS,gBAAgB,CAAC,aAAqB;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAEjD,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACtC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACrD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAC5C,CAAC;AAEY,QAAA,WAAW,GAAG;IACzB,YAAY;QACV,OAAO,sBAAS,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;IAChF,CAAC;IAED,iBAAiB,CAAC,UAAmB;QACnC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7B,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,kBAAkB,CAAC,UAAmB;QACpC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED,cAAc,CAAC,MAAe,EAAE,UAAmB;QACjD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,SAAS,CAAC,GAAW;QACnB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,aAAa,CAAC,KAAa;QACzB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9C,OAAO,QAAQ,KAAK,IAAI,IAAI,EAAE,CAAC;IACjC,CAAC;CACF,CAAC"}
@@ -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/utils/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 child_process_1 = require("child_process");
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, child_process_1.spawnSync)('netstat', args, { encoding: 'utf8', shell: process.platform === 'win32' });
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/utils/port-checker.ts"],"names":[],"mappings":";;AAOA,wDAsBC;AAiBD,0CAIC;AAlDD,iDAA0C;AAE1C,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,yBAAS,EAAC,SAAS,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;IAErG,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
+ import { EnvInput, RunestoneEnv } from './env-loader';
2
+ export declare function buildComposeFile(): string;
3
+ export declare function defaultEnvInput(): EnvInput;
4
+ export declare function ensureProjectFiles(config: RunestoneEnv, options?: {
5
+ overwriteCompose?: boolean;
6
+ }): void;
7
+ //# sourceMappingURL=project-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-files.d.ts","sourceRoot":"","sources":["../../src/utils/project-files.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,QAAQ,EAAE,YAAY,EAAa,MAAM,cAAc,CAAC;AAG9E,wBAAgB,gBAAgB,IAAI,MAAM,CAuCzC;AAED,wBAAgB,eAAe,IAAI,QAAQ,CAE1C;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAYvG"}
@@ -0,0 +1,97 @@
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.buildComposeFile = buildComposeFile;
37
+ exports.defaultEnvInput = defaultEnvInput;
38
+ exports.ensureProjectFiles = ensureProjectFiles;
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const env_loader_1 = require("./env-loader");
42
+ const path_helpers_1 = require("./path-helpers");
43
+ function buildComposeFile() {
44
+ return `services:
45
+ runestone:
46
+ image: \${RUNESTONE_IMAGE:-cymondez/runestone}:\${RUNESTONE_TAG:-5.2}
47
+ container_name: \${PREFIX:-runestone}
48
+ restart: unless-stopped
49
+ command: |-
50
+ --providers.docker.network="\${PREFIX:-runestone}-network"
51
+ environment:
52
+ HOST_DOMAIN: \${HOST_DOMAIN:-local.developers-homelab.net}
53
+ MAILPIT_HOST: mailpit.\${HOST_DOMAIN:-local.developers-homelab.net}
54
+ TRAEFIK_HOST: traefik.\${HOST_DOMAIN:-local.developers-homelab.net}
55
+ WEB_ENTRYPOINT_NAME: \${WEB_ENTRYPOINT_NAME:-web}
56
+ WEB_ENTRYPOINT_PORT: \${WEB_ENTRYPOINT_PORT:-80}
57
+ WEB_SECURE_ENTRYPOINT_NAME: \${WEB_SECURE_ENTRYPOINT_NAME:-websecure}
58
+ WEB_SECURE_ENTRYPOINT_PORT: \${WEB_SECURE_ENTRYPOINT_PORT:-443}
59
+ PREFIX: \${PREFIX:-runestone}
60
+ ports:
61
+ - "\${WEB_ENTRYPOINT_PORT:-80}:\${WEB_ENTRYPOINT_PORT:-80}"
62
+ - "\${WEB_SECURE_ENTRYPOINT_PORT:-443}:\${WEB_SECURE_ENTRYPOINT_PORT:-443}"
63
+ - "\${SMTP_PORT:-1025}:1025"
64
+ extra_hosts:
65
+ - host.docker.internal:host-gateway
66
+ volumes:
67
+ - /var/run/docker.sock:/var/run/docker.sock
68
+ - ./certs:/ssl
69
+ - ./configuration:/configuration
70
+ - ssh:/tmp/druid_ssh-agent/
71
+
72
+ networks:
73
+ default:
74
+ name: \${PREFIX:-runestone}-network
75
+ external: true
76
+
77
+ volumes:
78
+ ssh:
79
+ name: \${PREFIX:-runestone}-ssh
80
+ external: true
81
+ `;
82
+ }
83
+ function defaultEnvInput() {
84
+ return { ...env_loader_1.DEFAULT_ENV };
85
+ }
86
+ function ensureProjectFiles(config, options) {
87
+ path_helpers_1.pathHelpers.ensureDir(config.PROJECT_DIR);
88
+ path_helpers_1.pathHelpers.ensureDir(path.join(config.PROJECT_DIR, 'certs'));
89
+ path_helpers_1.pathHelpers.ensureDir(path.join(config.PROJECT_DIR, 'configuration'));
90
+ if (!fs.existsSync(config.ENV_PATH)) {
91
+ env_loader_1.envLoader.write(config.ENV_PATH, defaultEnvInput());
92
+ }
93
+ if (options?.overwriteCompose || !fs.existsSync(config.COMPOSE_FILE_PATH)) {
94
+ fs.writeFileSync(config.COMPOSE_FILE_PATH, buildComposeFile(), 'utf8');
95
+ }
96
+ }
97
+ //# sourceMappingURL=project-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-files.js","sourceRoot":"","sources":["../../src/utils/project-files.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,4CAuCC;AAED,0CAEC;AAED,gDAYC;AA9DD,uCAAyB;AACzB,2CAA6B;AAC7B,6CAA8E;AAC9E,iDAA6C;AAE7C,SAAgB,gBAAgB;IAC9B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCR,CAAC;AACF,CAAC;AAED,SAAgB,eAAe;IAC7B,OAAO,EAAE,GAAG,wBAAW,EAAE,CAAC;AAC5B,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAoB,EAAE,OAAwC;IAC/F,0BAAW,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC1C,0BAAW,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9D,0BAAW,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;IAEtE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,sBAAS,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,OAAO,EAAE,gBAAgB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC1E,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { SpawnSyncOptionsWithStringEncoding, SpawnSyncReturns } from 'child_process';
2
+ type StringSpawnOptions = SpawnSyncOptionsWithStringEncoding & {
3
+ encoding: BufferEncoding;
4
+ };
5
+ export declare function spawnCommand(command: string, args: string[], options: StringSpawnOptions): SpawnSyncReturns<string>;
6
+ export {};
7
+ //# sourceMappingURL=spawn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../src/utils/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,kCAAkC,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEhG,KAAK,kBAAkB,GAAG,kCAAkC,GAAG;IAC7D,QAAQ,EAAE,cAAc,CAAC;CAC1B,CAAC;AAmBF,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,kBAAkB,GAC1B,gBAAgB,CAAC,MAAM,CAAC,CAc1B"}