@simplens/onboard 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 (94) hide show
  1. package/README.md +214 -0
  2. package/dist/__tests__/errors.test.d.ts +2 -0
  3. package/dist/__tests__/errors.test.d.ts.map +1 -0
  4. package/dist/__tests__/errors.test.js +125 -0
  5. package/dist/__tests__/errors.test.js.map +1 -0
  6. package/dist/__tests__/utils.test.d.ts +2 -0
  7. package/dist/__tests__/utils.test.d.ts.map +1 -0
  8. package/dist/__tests__/utils.test.js +105 -0
  9. package/dist/__tests__/utils.test.js.map +1 -0
  10. package/dist/__tests__/validators.test.d.ts +2 -0
  11. package/dist/__tests__/validators.test.d.ts.map +1 -0
  12. package/dist/__tests__/validators.test.js +148 -0
  13. package/dist/__tests__/validators.test.js.map +1 -0
  14. package/dist/config/constants.d.ts +69 -0
  15. package/dist/config/constants.d.ts.map +1 -0
  16. package/dist/config/constants.js +79 -0
  17. package/dist/config/constants.js.map +1 -0
  18. package/dist/config/index.d.ts +2 -0
  19. package/dist/config/index.d.ts.map +1 -0
  20. package/dist/config/index.js +2 -0
  21. package/dist/config/index.js.map +1 -0
  22. package/dist/env-config.d.ts +33 -0
  23. package/dist/env-config.d.ts.map +1 -0
  24. package/dist/env-config.js +285 -0
  25. package/dist/env-config.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +153 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/infra.d.ts +31 -0
  31. package/dist/infra.d.ts.map +1 -0
  32. package/dist/infra.js +267 -0
  33. package/dist/infra.js.map +1 -0
  34. package/dist/plugins.d.ts +35 -0
  35. package/dist/plugins.d.ts.map +1 -0
  36. package/dist/plugins.js +164 -0
  37. package/dist/plugins.js.map +1 -0
  38. package/dist/services.d.ts +52 -0
  39. package/dist/services.d.ts.map +1 -0
  40. package/dist/services.js +158 -0
  41. package/dist/services.js.map +1 -0
  42. package/dist/templates.d.ts +3 -0
  43. package/dist/templates.d.ts.map +1 -0
  44. package/dist/templates.js +202 -0
  45. package/dist/templates.js.map +1 -0
  46. package/dist/types/domain.d.ts +119 -0
  47. package/dist/types/domain.d.ts.map +1 -0
  48. package/dist/types/domain.js +5 -0
  49. package/dist/types/domain.js.map +1 -0
  50. package/dist/types/errors.d.ts +69 -0
  51. package/dist/types/errors.d.ts.map +1 -0
  52. package/dist/types/errors.js +129 -0
  53. package/dist/types/errors.js.map +1 -0
  54. package/dist/types/index.d.ts +3 -0
  55. package/dist/types/index.d.ts.map +1 -0
  56. package/dist/types/index.js +3 -0
  57. package/dist/types/index.js.map +1 -0
  58. package/dist/utils/index.d.ts +2 -0
  59. package/dist/utils/index.d.ts.map +1 -0
  60. package/dist/utils/index.js +2 -0
  61. package/dist/utils/index.js.map +1 -0
  62. package/dist/utils/logger.d.ts +54 -0
  63. package/dist/utils/logger.d.ts.map +1 -0
  64. package/dist/utils/logger.js +92 -0
  65. package/dist/utils/logger.js.map +1 -0
  66. package/dist/utils.d.ts +32 -0
  67. package/dist/utils.d.ts.map +1 -0
  68. package/dist/utils.js +79 -0
  69. package/dist/utils.js.map +1 -0
  70. package/dist/validators.d.ts +93 -0
  71. package/dist/validators.d.ts.map +1 -0
  72. package/dist/validators.js +180 -0
  73. package/dist/validators.js.map +1 -0
  74. package/package.json +45 -0
  75. package/src/__tests__/errors.test.ts +187 -0
  76. package/src/__tests__/utils.test.ts +142 -0
  77. package/src/__tests__/validators.test.ts +195 -0
  78. package/src/config/constants.ts +86 -0
  79. package/src/config/index.ts +1 -0
  80. package/src/env-config.ts +320 -0
  81. package/src/index.ts +203 -0
  82. package/src/infra.ts +300 -0
  83. package/src/plugins.ts +190 -0
  84. package/src/services.ts +190 -0
  85. package/src/templates.ts +203 -0
  86. package/src/types/domain.ts +127 -0
  87. package/src/types/errors.ts +173 -0
  88. package/src/types/index.ts +2 -0
  89. package/src/utils/index.ts +1 -0
  90. package/src/utils/logger.ts +118 -0
  91. package/src/utils.ts +105 -0
  92. package/src/validators.ts +192 -0
  93. package/tsconfig.json +19 -0
  94. package/vitest.config.ts +20 -0
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Custom error types for better error handling and troubleshooting
3
+ */
4
+ /**
5
+ * Base error class for all onboarding errors
6
+ */
7
+ export class OnboardingError extends Error {
8
+ code;
9
+ troubleshooting;
10
+ constructor(code, message, troubleshooting) {
11
+ super(message);
12
+ this.code = code;
13
+ this.troubleshooting = troubleshooting;
14
+ this.name = 'OnboardingError';
15
+ Error.captureStackTrace(this, this.constructor);
16
+ }
17
+ }
18
+ /**
19
+ * Docker-related errors
20
+ */
21
+ export class DockerError extends OnboardingError {
22
+ constructor(message, troubleshooting) {
23
+ super('DOCKER_ERROR', message, troubleshooting);
24
+ this.name = 'DockerError';
25
+ }
26
+ }
27
+ export class DockerNotInstalledError extends DockerError {
28
+ constructor() {
29
+ super('Docker is not installed on this system', 'Please install Docker from: https://docs.docker.com/get-docker/');
30
+ this.name = 'DockerNotInstalledError';
31
+ }
32
+ }
33
+ export class DockerNotRunningError extends DockerError {
34
+ constructor() {
35
+ super('Docker daemon is not running', 'Please start Docker Desktop or Docker daemon, then try again');
36
+ this.name = 'DockerNotRunningError';
37
+ }
38
+ }
39
+ export class DockerPermissionError extends DockerError {
40
+ constructor() {
41
+ super('Permission denied when accessing Docker', 'Try running with sudo or add your user to the docker group:\n' +
42
+ ' sudo usermod -aG docker $USER\n' +
43
+ ' Then log out and log back in');
44
+ this.name = 'DockerPermissionError';
45
+ }
46
+ }
47
+ export class DockerComposeError extends DockerError {
48
+ constructor(operation, details) {
49
+ super(`Failed to ${operation} with docker-compose`, details || 'Check docker-compose logs for more details:\n docker-compose logs');
50
+ this.name = 'DockerComposeError';
51
+ }
52
+ }
53
+ /**
54
+ * File system errors
55
+ */
56
+ export class FileSystemError extends OnboardingError {
57
+ path;
58
+ constructor(message, path, troubleshooting) {
59
+ super('FILESYSTEM_ERROR', message, troubleshooting);
60
+ this.path = path;
61
+ this.name = 'FileSystemError';
62
+ }
63
+ }
64
+ export class DirectoryNotWritableError extends FileSystemError {
65
+ constructor(path) {
66
+ super(`Directory is not writable: ${path}`, path, 'Check directory permissions or choose a different directory');
67
+ this.name = 'DirectoryNotWritableError';
68
+ }
69
+ }
70
+ export class FileNotFoundError extends FileSystemError {
71
+ constructor(path) {
72
+ super(`File not found: ${path}`, path, 'Ensure the file exists or check the path');
73
+ this.name = 'FileNotFoundError';
74
+ }
75
+ }
76
+ /**
77
+ * Configuration errors
78
+ */
79
+ export class ConfigurationError extends OnboardingError {
80
+ constructor(message, troubleshooting) {
81
+ super('CONFIG_ERROR', message, troubleshooting);
82
+ this.name = 'ConfigurationError';
83
+ }
84
+ }
85
+ export class InvalidEnvironmentValueError extends ConfigurationError {
86
+ constructor(key, value, expectedFormat) {
87
+ super(`Invalid value for ${key}: ${value}`, `Expected format: ${expectedFormat}`);
88
+ this.name = 'InvalidEnvironmentValueError';
89
+ }
90
+ }
91
+ export class PluginConfigurationError extends ConfigurationError {
92
+ constructor(pluginName, details) {
93
+ super(`Failed to configure plugin ${pluginName}`, details);
94
+ this.name = 'PluginConfigurationError';
95
+ }
96
+ }
97
+ /**
98
+ * Service health errors
99
+ */
100
+ export class ServiceHealthError extends OnboardingError {
101
+ constructor(serviceName, timeout) {
102
+ super('SERVICE_HEALTH_ERROR', `Service '${serviceName}' did not become healthy within ${timeout}ms`, `Check service logs:\n docker-compose logs ${serviceName}\n\n` +
103
+ 'Or check container status:\n docker ps -a');
104
+ this.name = 'ServiceHealthError';
105
+ }
106
+ }
107
+ /**
108
+ * Type guard to check if an error is an OnboardingError
109
+ */
110
+ export function isOnboardingError(error) {
111
+ return error instanceof OnboardingError;
112
+ }
113
+ /**
114
+ * Format error for user display
115
+ */
116
+ export function formatErrorForUser(error) {
117
+ if (isOnboardingError(error)) {
118
+ let message = `❌ ${error.message}`;
119
+ if (error.troubleshooting) {
120
+ message += `\n\n💡 Troubleshooting:\n${error.troubleshooting}`;
121
+ }
122
+ return message;
123
+ }
124
+ if (error instanceof Error) {
125
+ return `❌ Unexpected error: ${error.message}`;
126
+ }
127
+ return `❌ An unknown error occurred`;
128
+ }
129
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './errors.js';
2
+ export * from './domain.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './errors.js';
2
+ export * from './domain.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './logger.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './logger.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Logging level
3
+ */
4
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
5
+ /**
6
+ * Logger configuration
7
+ */
8
+ interface LoggerConfig {
9
+ verbose: boolean;
10
+ debug: boolean;
11
+ logFile?: string;
12
+ }
13
+ /**
14
+ * Initialize logger with configuration
15
+ */
16
+ export declare function initLogger(config: Partial<LoggerConfig>): void;
17
+ /**
18
+ * Get current logger configuration
19
+ */
20
+ export declare function getLoggerConfig(): Readonly<LoggerConfig>;
21
+ /**
22
+ * Log debug message (only shown with --debug flag)
23
+ */
24
+ export declare function logDebug(message: string): void;
25
+ /**
26
+ * Log verbose message (shown with --verbose or --debug)
27
+ */
28
+ export declare function logVerbose(message: string): void;
29
+ /**
30
+ * Log info message (always displayed)
31
+ */
32
+ export declare function logInfo(message: string): void;
33
+ /**
34
+ * Log success message (always displayed)
35
+ */
36
+ export declare function logSuccess(message: string): void;
37
+ /**
38
+ * Log warning message (always displayed)
39
+ */
40
+ export declare function logWarning(message: string): void;
41
+ /**
42
+ * Log error message (always displayed)
43
+ */
44
+ export declare function logError(message: string): void;
45
+ /**
46
+ * Log command execution (debug level)
47
+ */
48
+ export declare function logCommand(command: string, args: string[]): void;
49
+ /**
50
+ * Log file operation (debug level)
51
+ */
52
+ export declare function logFileOperation(operation: string, filePath: string): void;
53
+ export {};
54
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D;;GAEG;AACH,UAAU,YAAY;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAOD;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAE9D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,QAAQ,CAAC,YAAY,CAAC,CAExD;AAiBD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAK9C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKhD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAG7C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGhD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAG9C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAEhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE1E"}
@@ -0,0 +1,92 @@
1
+ import chalk from 'chalk';
2
+ import { appendFile as fsAppendFile } from 'fs/promises';
3
+ let loggerConfig = {
4
+ verbose: false,
5
+ debug: false,
6
+ };
7
+ /**
8
+ * Initialize logger with configuration
9
+ */
10
+ export function initLogger(config) {
11
+ loggerConfig = { ...loggerConfig, ...config };
12
+ }
13
+ /**
14
+ * Get current logger configuration
15
+ */
16
+ export function getLoggerConfig() {
17
+ return { ...loggerConfig };
18
+ }
19
+ /**
20
+ * Write log message to file if configured
21
+ */
22
+ async function writeToLogFile(level, message) {
23
+ if (!loggerConfig.logFile)
24
+ return;
25
+ try {
26
+ const timestamp = new Date().toISOString();
27
+ const logEntry = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`;
28
+ await fsAppendFile(loggerConfig.logFile, logEntry, 'utf-8');
29
+ }
30
+ catch (error) {
31
+ // Silently fail on log file errors
32
+ }
33
+ }
34
+ /**
35
+ * Log debug message (only shown with --debug flag)
36
+ */
37
+ export function logDebug(message) {
38
+ if (loggerConfig.debug) {
39
+ console.log(chalk.gray(`🔧 ${message}`));
40
+ }
41
+ writeToLogFile('debug', message);
42
+ }
43
+ /**
44
+ * Log verbose message (shown with --verbose or --debug)
45
+ */
46
+ export function logVerbose(message) {
47
+ if (loggerConfig.verbose || loggerConfig.debug) {
48
+ console.log(chalk.cyan(`ℹ️ ${message}`));
49
+ }
50
+ writeToLogFile('info', message);
51
+ }
52
+ /**
53
+ * Log info message (always displayed)
54
+ */
55
+ export function logInfo(message) {
56
+ console.log(chalk.blue(`ℹ️ ${message}`));
57
+ writeToLogFile('info', message);
58
+ }
59
+ /**
60
+ * Log success message (always displayed)
61
+ */
62
+ export function logSuccess(message) {
63
+ console.log(chalk.green(`✅ ${message}`));
64
+ writeToLogFile('info', message);
65
+ }
66
+ /**
67
+ * Log warning message (always displayed)
68
+ */
69
+ export function logWarning(message) {
70
+ console.log(chalk.yellow(`⚠️ ${message}`));
71
+ writeToLogFile('warn', message);
72
+ }
73
+ /**
74
+ * Log error message (always displayed)
75
+ */
76
+ export function logError(message) {
77
+ console.log(chalk.red(`❌ ${message}`));
78
+ writeToLogFile('error', message);
79
+ }
80
+ /**
81
+ * Log command execution (debug level)
82
+ */
83
+ export function logCommand(command, args) {
84
+ logDebug(`Executing: ${command} ${args.join(' ')}`);
85
+ }
86
+ /**
87
+ * Log file operation (debug level)
88
+ */
89
+ export function logFileOperation(operation, filePath) {
90
+ logDebug(`${operation}: ${filePath}`);
91
+ }
92
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export { logSuccess, logError, logWarning, logInfo, logDebug, logVerbose, logCommand, logFileOperation, initLogger, getLoggerConfig, } from './utils/logger.js';
2
+ /**
3
+ * Display SimpleNS banner in blue using figlet
4
+ */
5
+ export declare function displayBanner(): void;
6
+ /**
7
+ * Execute a shell command with error handling
8
+ */
9
+ export declare function executeCommand(command: string, args: string[], options?: {
10
+ cwd?: string;
11
+ silent?: boolean;
12
+ }): Promise<{
13
+ stdout: string;
14
+ stderr: string;
15
+ }>;
16
+ /**
17
+ * Check if file exists
18
+ */
19
+ export declare function fileExists(filePath: string): Promise<boolean>;
20
+ /**
21
+ * Write file content
22
+ */
23
+ export declare function writeFile(filePath: string, content: string): Promise<void>;
24
+ /**
25
+ * Read file content
26
+ */
27
+ export declare function readFile(filePath: string): Promise<string>;
28
+ /**
29
+ * Append content to file
30
+ */
31
+ export declare function appendFile(filePath: string, content: string): Promise<void>;
32
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,UAAU,EACV,QAAQ,EACR,UAAU,EACV,OAAO,EACP,QAAQ,EACR,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,eAAe,GAClB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAcpC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7C,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAe7C;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhF;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMjF"}
package/dist/utils.js ADDED
@@ -0,0 +1,79 @@
1
+ import chalk from 'chalk';
2
+ import { execa } from 'execa';
3
+ import fs from 'fs/promises';
4
+ import path from 'path';
5
+ import figlet from 'figlet';
6
+ // Re-export logger functions for backward compatibility
7
+ export { logSuccess, logError, logWarning, logInfo, logDebug, logVerbose, logCommand, logFileOperation, initLogger, getLoggerConfig, } from './utils/logger.js';
8
+ /**
9
+ * Display SimpleNS banner in blue using figlet
10
+ */
11
+ export function displayBanner() {
12
+ const simpleNS = figlet.textSync('SimpleNS', {
13
+ font: 'Standard',
14
+ horizontalLayout: 'default',
15
+ });
16
+ const onboard = figlet.textSync('Onboard', {
17
+ font: 'Standard',
18
+ horizontalLayout: 'default',
19
+ });
20
+ console.log(chalk.blue(simpleNS));
21
+ console.log(chalk.blue(onboard));
22
+ console.log('');
23
+ }
24
+ /**
25
+ * Execute a shell command with error handling
26
+ */
27
+ export async function executeCommand(command, args, options) {
28
+ // Import dynamically to avoid circular dependency
29
+ const { logCommand } = await import('./utils/logger.js');
30
+ logCommand(command, args);
31
+ try {
32
+ const result = await execa(command, args, {
33
+ cwd: options?.cwd || process.cwd(),
34
+ stdio: options?.silent ? 'pipe' : 'inherit',
35
+ });
36
+ return { stdout: result.stdout, stderr: result.stderr };
37
+ }
38
+ catch (error) {
39
+ throw new Error(`Command failed: ${command} ${args.join(' ')}\n${error.message}`);
40
+ }
41
+ }
42
+ /**
43
+ * Check if file exists
44
+ */
45
+ export async function fileExists(filePath) {
46
+ try {
47
+ await fs.access(filePath);
48
+ return true;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ /**
55
+ * Write file content
56
+ */
57
+ export async function writeFile(filePath, content) {
58
+ const { logFileOperation } = await import('./utils/logger.js');
59
+ logFileOperation('Writing file', filePath);
60
+ const dir = path.dirname(filePath);
61
+ await fs.mkdir(dir, { recursive: true });
62
+ await fs.writeFile(filePath, content, 'utf-8');
63
+ }
64
+ /**
65
+ * Read file content
66
+ */
67
+ export async function readFile(filePath) {
68
+ return await fs.readFile(filePath, 'utf-8');
69
+ }
70
+ /**
71
+ * Append content to file
72
+ */
73
+ export async function appendFile(filePath, content) {
74
+ // Ensure parent directory exists, similar to writeFile
75
+ const dir = path.dirname(filePath);
76
+ await fs.mkdir(dir, { recursive: true });
77
+ await fs.appendFile(filePath, content, 'utf-8');
78
+ }
79
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ export type OSType = 'windows' | 'linux' | 'darwin';
2
+ /**
3
+ * Checks if Docker is installed on the system by running `docker --version`.
4
+ *
5
+ * @throws {DockerNotInstalledError} When Docker is not found in PATH or not installed
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * try {
10
+ * await checkDockerInstalled();
11
+ * console.log('Docker is available');
12
+ * } catch (error) {
13
+ * // Handle DockerNotInstalledError
14
+ * }
15
+ * ```
16
+ */
17
+ export declare function checkDockerInstalled(): Promise<void>;
18
+ /**
19
+ * Checks if the Docker daemon is running by executing `docker ps`.
20
+ * Provides specific error types based on the failure reason.
21
+ *
22
+ * @throws {DockerPermissionError} When user lacks permissions to access Docker socket
23
+ * @throws {DockerNotRunningError} When Docker daemon is not running or unreachable
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * try {
28
+ * await checkDockerRunning();
29
+ * } catch (error) {
30
+ * if (error instanceof DockerPermissionError) {
31
+ * // Guide user to add sudo or docker group
32
+ * }
33
+ * }
34
+ * ```
35
+ */
36
+ export declare function checkDockerRunning(): Promise<void>;
37
+ /**
38
+ * Detects the operating system platform.
39
+ *
40
+ * @returns OS type: 'windows', 'darwin' (macOS), or 'linux'
41
+ * @note Defaults to 'linux' for unknown platforms
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * const os = detectOS();
46
+ * if (os === 'linux') {
47
+ * // Linux-specific configuration
48
+ * }
49
+ * ```
50
+ */
51
+ export declare function detectOS(): OSType;
52
+ /**
53
+ * Validates all system prerequisites before starting the onboarding process.
54
+ * Checks Docker installation, daemon status, and detects the operating system.
55
+ *
56
+ * @throws {DockerNotInstalledError} If Docker is not installed
57
+ * @throws {DockerNotRunningError} If Docker daemon is not running
58
+ * @throws {DockerPermissionError} If user lacks Docker permissions
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * try {
63
+ * await validatePrerequisites();
64
+ * // Proceed with setup
65
+ * } catch (error) {
66
+ * // Handle prerequisite errors
67
+ * }
68
+ * ```
69
+ */
70
+ export declare function validatePrerequisites(): Promise<void>;
71
+ /**
72
+ * Validates environment variable values based on the variable name/type.
73
+ * Performs format-specific validation for URLs, ports, and security credentials.
74
+ *
75
+ * @param key - Environment variable name (e.g., 'MONGO_URI', 'PORT', 'API_KEY')
76
+ * @param value - Value to validate
77
+ * @returns `true` if valid, `false` otherwise
78
+ *
79
+ * @remarks
80
+ * Validation rules:
81
+ * - URLs: Must contain protocol (mongodb://, redis://)
82
+ * - Ports: Must be 1-65535
83
+ * - Secrets/Keys/Passwords: Must be at least 8 characters
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * validateEnvValue('MONGO_URI', 'mongodb://localhost:27017'); // true
88
+ * validateEnvValue('PORT', '3000'); // true
89
+ * validateEnvValue('API_KEY', 'short'); // false (too short)
90
+ * ```
91
+ */
92
+ export declare function validateEnvValue(key: string, value: string): boolean;
93
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEpD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAM1D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBxD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAMjC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CA4B3D;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CA6BpE"}