@simplens/onboard 1.0.0 → 1.0.2

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 (82) hide show
  1. package/README.md +331 -214
  2. package/dist/__tests__/env-config.test.d.ts +2 -0
  3. package/dist/__tests__/env-config.test.d.ts.map +1 -0
  4. package/dist/__tests__/env-config.test.js +23 -0
  5. package/dist/__tests__/env-config.test.js.map +1 -0
  6. package/dist/__tests__/infra-prompts.test.d.ts +2 -0
  7. package/dist/__tests__/infra-prompts.test.d.ts.map +1 -0
  8. package/dist/__tests__/infra-prompts.test.js +43 -0
  9. package/dist/__tests__/infra-prompts.test.js.map +1 -0
  10. package/dist/__tests__/infra.test.d.ts +2 -0
  11. package/dist/__tests__/infra.test.d.ts.map +1 -0
  12. package/dist/__tests__/infra.test.js +14 -0
  13. package/dist/__tests__/infra.test.js.map +1 -0
  14. package/dist/__tests__/nginx.test.d.ts +2 -0
  15. package/dist/__tests__/nginx.test.d.ts.map +1 -0
  16. package/dist/__tests__/nginx.test.js +16 -0
  17. package/dist/__tests__/nginx.test.js.map +1 -0
  18. package/dist/env-config.d.ts +27 -12
  19. package/dist/env-config.d.ts.map +1 -1
  20. package/dist/env-config.js +258 -141
  21. package/dist/env-config.js.map +1 -1
  22. package/dist/index.js +341 -71
  23. package/dist/index.js.map +1 -1
  24. package/dist/infra.d.ts +17 -14
  25. package/dist/infra.d.ts.map +1 -1
  26. package/dist/infra.js +265 -176
  27. package/dist/infra.js.map +1 -1
  28. package/dist/plugins.d.ts +5 -10
  29. package/dist/plugins.d.ts.map +1 -1
  30. package/dist/plugins.js +75 -44
  31. package/dist/plugins.js.map +1 -1
  32. package/dist/services.d.ts +1 -23
  33. package/dist/services.d.ts.map +1 -1
  34. package/dist/services.js +47 -62
  35. package/dist/services.js.map +1 -1
  36. package/dist/templates.d.ts +3 -2
  37. package/dist/templates.d.ts.map +1 -1
  38. package/dist/templates.js +203 -198
  39. package/dist/templates.js.map +1 -1
  40. package/dist/types/domain.d.ts +2 -0
  41. package/dist/types/domain.d.ts.map +1 -1
  42. package/dist/ui.d.ts +45 -0
  43. package/dist/ui.d.ts.map +1 -0
  44. package/dist/ui.js +93 -0
  45. package/dist/ui.js.map +1 -0
  46. package/dist/utils/logger.d.ts +1 -0
  47. package/dist/utils/logger.d.ts.map +1 -1
  48. package/dist/utils/logger.js +32 -7
  49. package/dist/utils/logger.js.map +1 -1
  50. package/dist/utils.d.ts +8 -0
  51. package/dist/utils.d.ts.map +1 -1
  52. package/dist/utils.js +66 -2
  53. package/dist/utils.js.map +1 -1
  54. package/dist/validators.d.ts +1 -52
  55. package/dist/validators.d.ts.map +1 -1
  56. package/dist/validators.js +10 -57
  57. package/dist/validators.js.map +1 -1
  58. package/package.json +3 -5
  59. package/src/__tests__/env-config.test.ts +28 -0
  60. package/src/__tests__/errors.test.ts +187 -187
  61. package/src/__tests__/infra-prompts.test.ts +54 -0
  62. package/src/__tests__/infra.test.ts +15 -0
  63. package/src/__tests__/utils.test.ts +142 -142
  64. package/src/__tests__/validators.test.ts +195 -195
  65. package/src/config/constants.ts +86 -86
  66. package/src/config/index.ts +1 -1
  67. package/src/env-config.ts +455 -320
  68. package/src/index.ts +534 -203
  69. package/src/infra.ts +404 -300
  70. package/src/plugins.ts +221 -190
  71. package/src/services.ts +175 -190
  72. package/src/templates.ts +209 -203
  73. package/src/types/domain.ts +129 -127
  74. package/src/types/errors.ts +173 -173
  75. package/src/types/index.ts +2 -2
  76. package/src/ui.ts +91 -0
  77. package/src/utils/index.ts +1 -1
  78. package/src/utils/logger.ts +144 -118
  79. package/src/utils.ts +183 -105
  80. package/src/validators.ts +145 -192
  81. package/tsconfig.json +18 -18
  82. package/vitest.config.ts +22 -20
package/dist/plugins.js CHANGED
@@ -1,26 +1,18 @@
1
- import inquirer from 'inquirer';
2
1
  import { execa } from 'execa';
3
2
  import yaml from 'js-yaml';
4
- import { readFile, logInfo, logSuccess, logError, logWarning } from './utils.js';
5
- import path from 'path';
3
+ import crypto from 'crypto';
4
+ import { readFile, logInfo, logSuccess, logWarning } from './utils.js';
5
+ import { multiselect, text, password } from '@clack/prompts';
6
+ import { handleCancel, spinner } from './ui.js';
6
7
  /**
7
8
  * Fetches available SimpleNS plugins using the config-gen CLI tool.
8
9
  * Falls back to default plugins if fetching fails.
9
10
  *
10
11
  * @returns Array of available plugin information
11
- *
12
- * @remarks
13
- * Uses `npx @simplens/config-gen list --official` to fetch plugins.
14
- * Default fallback plugins: mock, nodemailer-gmail, resend
15
- *
16
- * @example
17
- * ```ts
18
- * const plugins = await fetchAvailablePlugins();
19
- * // Returns: [{ package: '@simplens/mock', name: 'Mock Provider', ... }, ...]
20
- * ```
21
12
  */
22
13
  export async function fetchAvailablePlugins() {
23
- logInfo('Fetching available plugins...');
14
+ const s = spinner();
15
+ s.start('Fetching available plugins...');
24
16
  try {
25
17
  // Execute config-gen list command
26
18
  const { stdout } = await execa('npx', ['@simplens/config-gen', 'list', '--official'], {
@@ -44,11 +36,12 @@ export async function fetchAvailablePlugins() {
44
36
  });
45
37
  }
46
38
  }
47
- logSuccess(`Found ${plugins.length} available plugins`);
39
+ s.stop(`Found ${plugins.length} available plugins`);
48
40
  return plugins;
49
41
  }
50
42
  catch (error) {
51
- logWarning('Could not fetch plugins list. Using defaults.');
43
+ s.stop('Could not fetch plugins list. Using defaults.');
44
+ logWarning('Falling back to default plugin list.');
52
45
  // Return default plugins as fallback
53
46
  return [
54
47
  { package: '@simplens/mock', name: 'Mock Provider', description: 'Mock notification provider for testing' },
@@ -65,19 +58,20 @@ export async function promptPluginSelection(availablePlugins) {
65
58
  logWarning('No plugins available to select.');
66
59
  return [];
67
60
  }
68
- const answer = await inquirer.prompt([
69
- {
70
- type: 'checkbox',
71
- name: 'plugins',
72
- message: 'Select plugins to install:',
73
- choices: availablePlugins.map(p => ({
74
- name: `${p.name} (${p.package}) - ${p.description}`,
75
- value: p.package,
76
- checked: p.package === '@simplens/mock', // Mock checked by default
77
- })),
78
- },
79
- ]);
80
- return answer.plugins;
61
+ const selected = await multiselect({
62
+ message: 'Select plugins to install (Space to select, Enter to confirm):',
63
+ options: availablePlugins.map(p => ({
64
+ value: p.package,
65
+ label: `${p.name} (${p.package})`,
66
+ hint: p.description,
67
+ })),
68
+ initialValues: availablePlugins
69
+ .filter(p => p.package === '@simplens/mock')
70
+ .map(p => p.package),
71
+ withGuide: true,
72
+ });
73
+ handleCancel(selected);
74
+ return selected;
81
75
  }
82
76
  /**
83
77
  * Generate plugin configuration using config-gen
@@ -87,16 +81,16 @@ export async function generatePluginConfig(targetDir, selectedPlugins) {
87
81
  logInfo('No plugins selected, skipping config generation.');
88
82
  return;
89
83
  }
90
- logInfo(`Generating configuration for ${selectedPlugins.length} plugin(s)...`);
84
+ const s = spinner();
85
+ s.start(`Generating configuration for ${selectedPlugins.length} plugin(s)...`);
91
86
  try {
92
- const configPath = path.join(targetDir, 'simplens.config.yaml');
93
87
  // Execute config-gen for all selected plugins
94
88
  // Use relative path to avoid WSL path issues when npx runs Windows binaries
95
- await execa('npx', ['@simplens/config-gen', 'gen', ...selectedPlugins, '-o', 'simplens.config.yaml'], { cwd: targetDir, stdio: 'inherit' });
96
- logSuccess('Generated simplens.config.yaml');
89
+ await execa('npx', ['@simplens/config-gen', 'gen', ...selectedPlugins, '-o', 'simplens.config.yaml'], { cwd: targetDir, stdio: 'pipe' });
90
+ s.stop('Generated simplens.config.yaml');
97
91
  }
98
92
  catch (error) {
99
- logError('Failed to generate plugin configuration');
93
+ s.error('Failed to generate plugin configuration');
100
94
  throw error;
101
95
  }
102
96
  }
@@ -130,6 +124,33 @@ export async function parseConfigCredentials(configPath) {
130
124
  return [];
131
125
  }
132
126
  }
127
+ /**
128
+ * Generate default placeholder values for plugin credentials
129
+ * Used in --full mode for non-interactive setup
130
+ */
131
+ export function generateDefaultPluginCredentials(credentialKeys) {
132
+ const result = new Map();
133
+ for (const key of credentialKeys) {
134
+ // Generate placeholder values based on key name patterns
135
+ if (key.toLowerCase().includes('password') || key.toLowerCase().includes('secret')) {
136
+ result.set(key, crypto.randomBytes(16).toString('base64'));
137
+ }
138
+ else if (key.toLowerCase().includes('apikey') || key.toLowerCase().includes('api_key')) {
139
+ result.set(key, `sk_${crypto.randomBytes(24).toString('base64').slice(0, 32)}`);
140
+ }
141
+ else if (key.toLowerCase().includes('token')) {
142
+ result.set(key, crypto.randomBytes(32).toString('hex'));
143
+ }
144
+ else if (key.toLowerCase().includes('email') || key.toLowerCase().includes('user')) {
145
+ result.set(key, 'CHANGE_ME@example.com');
146
+ }
147
+ else {
148
+ // Generic placeholder
149
+ result.set(key, 'CHANGE_ME');
150
+ }
151
+ }
152
+ return result;
153
+ }
133
154
  /**
134
155
  * Prompt for plugin-specific credentials
135
156
  */
@@ -141,22 +162,32 @@ export async function promptPluginCredentials(credentialKeys) {
141
162
  logInfo('Configuring plugin credentials...');
142
163
  const result = new Map();
143
164
  for (const key of credentialKeys) {
144
- const answer = await inquirer.prompt([
145
- {
146
- type: key.toLowerCase().includes('password') || key.toLowerCase().includes('key')
147
- ? 'password'
148
- : 'input',
149
- name: 'value',
165
+ const isSecret = key.toLowerCase().includes('password') || key.toLowerCase().includes('key');
166
+ let answer;
167
+ if (isSecret) {
168
+ answer = await password({
150
169
  message: `${key}:`,
151
170
  validate: (input) => {
152
171
  if (!input || input.trim().length === 0) {
153
172
  return `${key} is required`;
154
173
  }
155
- return true;
174
+ return undefined;
156
175
  },
157
- },
158
- ]);
159
- result.set(key, answer.value);
176
+ });
177
+ }
178
+ else {
179
+ answer = await text({
180
+ message: `${key}:`,
181
+ validate: (input) => {
182
+ if (!input || input.trim().length === 0) {
183
+ return `${key} is required`;
184
+ }
185
+ return undefined;
186
+ },
187
+ });
188
+ }
189
+ handleCancel(answer);
190
+ result.set(key, answer);
160
191
  }
161
192
  logSuccess('Plugin credentials configured');
162
193
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
@@ -2,13 +2,6 @@
2
2
  * Prompts user whether to start the services immediately after setup.
3
3
  *
4
4
  * @returns `true` if user wants to start services, `false` otherwise
5
- *
6
- * @example
7
- * ```ts
8
- * if (await promptStartServices()) {
9
- * await startInfraServices(targetDir);
10
- * }
11
- * ```
12
5
  */
13
6
  export declare function promptStartServices(): Promise<boolean>;
14
7
  /**
@@ -17,28 +10,13 @@ export declare function promptStartServices(): Promise<boolean>;
17
10
  *
18
11
  * @param targetDir - Directory containing docker-compose.infra.yaml
19
12
  * @throws Error if docker-compose command fails
20
- *
21
- * @example
22
- * ```ts
23
- * await startInfraServices('/opt/simplens');
24
- * ```
25
13
  */
26
14
  export declare function startInfraServices(targetDir: string): Promise<void>;
27
15
  /**
28
16
  * Waits for infrastructure services to become healthy.
29
- * Polls Docker health checks for up to 60 seconds (30 retries × 2s).
17
+ * Polls Docker health checks for up to 60 seconds (30 retries x 2s).
30
18
  *
31
19
  * @param targetDir - Directory where services are running
32
- *
33
- * @remarks
34
- * Checks for healthy containers running MongoDB or Redis.
35
- * Configuration: 30 max retries, 2000ms delay between retries.
36
- *
37
- * @example
38
- * ```ts
39
- * await startInfraServices(targetDir);
40
- * await waitForInfraHealth(targetDir); // Wait for services to be ready
41
- * ```
42
20
  */
43
21
  export declare function waitForInfraHealth(targetDir: string): Promise<void>;
44
22
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAW5D;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCzE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2C1D"}
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS5D;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzE;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCzE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD1D"}
package/dist/services.js CHANGED
@@ -1,31 +1,22 @@
1
- import inquirer from 'inquirer';
2
1
  import { execa } from 'execa';
3
- import ora from 'ora';
4
- import { logInfo, logWarning } from './utils.js';
5
2
  import chalk from 'chalk';
3
+ import { logInfo, logWarning, divider, printSummaryCard, printCommandHints } from './utils.js';
4
+ import { confirm } from '@clack/prompts';
5
+ import { handleCancel, spinner } from './ui.js';
6
6
  import { HEALTH_CHECK, getServiceURL } from './config/constants.js';
7
7
  /**
8
8
  * Prompts user whether to start the services immediately after setup.
9
9
  *
10
10
  * @returns `true` if user wants to start services, `false` otherwise
11
- *
12
- * @example
13
- * ```ts
14
- * if (await promptStartServices()) {
15
- * await startInfraServices(targetDir);
16
- * }
17
- * ```
18
11
  */
19
12
  export async function promptStartServices() {
20
- const answer = await inquirer.prompt([
21
- {
22
- type: 'confirm',
23
- name: 'start',
24
- message: 'Do you want to start the services now?',
25
- default: true,
26
- },
27
- ]);
28
- return answer.start;
13
+ const shouldStart = await confirm({
14
+ message: 'Start services now after setup?',
15
+ initialValue: true,
16
+ withGuide: true,
17
+ });
18
+ handleCancel(shouldStart);
19
+ return shouldStart;
29
20
  }
30
21
  /**
31
22
  * Starts infrastructure services using docker-compose.
@@ -33,43 +24,30 @@ export async function promptStartServices() {
33
24
  *
34
25
  * @param targetDir - Directory containing docker-compose.infra.yaml
35
26
  * @throws Error if docker-compose command fails
36
- *
37
- * @example
38
- * ```ts
39
- * await startInfraServices('/opt/simplens');
40
- * ```
41
27
  */
42
28
  export async function startInfraServices(targetDir) {
43
29
  logInfo('Starting infrastructure services...');
44
- const spinner = ora('Starting docker-compose.infra.yaml...').start();
30
+ const s = spinner();
31
+ s.start('Starting docker-compose.infra.yaml...');
45
32
  try {
46
33
  await execa('docker-compose', ['-f', 'docker-compose.infra.yaml', 'up', '-d'], { cwd: targetDir });
47
- spinner.succeed('Infrastructure services started');
34
+ s.stop('Infrastructure services started');
48
35
  }
49
36
  catch (error) {
50
- spinner.fail('Failed to start infrastructure services');
37
+ s.error('Failed to start infrastructure services');
51
38
  throw error;
52
39
  }
53
40
  }
54
41
  /**
55
42
  * Waits for infrastructure services to become healthy.
56
- * Polls Docker health checks for up to 60 seconds (30 retries × 2s).
43
+ * Polls Docker health checks for up to 60 seconds (30 retries x 2s).
57
44
  *
58
45
  * @param targetDir - Directory where services are running
59
- *
60
- * @remarks
61
- * Checks for healthy containers running MongoDB or Redis.
62
- * Configuration: 30 max retries, 2000ms delay between retries.
63
- *
64
- * @example
65
- * ```ts
66
- * await startInfraServices(targetDir);
67
- * await waitForInfraHealth(targetDir); // Wait for services to be ready
68
- * ```
69
46
  */
70
47
  export async function waitForInfraHealth(targetDir) {
71
48
  logInfo('Waiting for infrastructure services to be healthy...');
72
- const spinner = ora('Checking service health...').start();
49
+ const s = spinner();
50
+ s.start('Checking service health...');
73
51
  // Wait for mongo, redis health checks
74
52
  const maxRetries = HEALTH_CHECK.MAX_RETRIES;
75
53
  const retryDelay = HEALTH_CHECK.RETRY_DELAY_MS;
@@ -81,18 +59,18 @@ export async function waitForInfraHealth(targetDir) {
81
59
  // Check for critical services
82
60
  const hasMongoOrRedis = healthyContainers.some(name => name.includes('mongo') || name.includes('redis'));
83
61
  if (hasMongoOrRedis) {
84
- spinner.succeed('Infrastructure services are healthy');
62
+ s.stop('Infrastructure services are healthy');
85
63
  return;
86
64
  }
87
- spinner.text = `Waiting for services... (${i + 1}/${maxRetries})`;
65
+ s.message(`Waiting for services... (${i + 1}/${maxRetries})`);
88
66
  await sleep(retryDelay);
89
67
  }
90
68
  catch (error) {
91
- spinner.text = `Checking health... (${i + 1}/${maxRetries})`;
69
+ s.message(`Checking health... (${i + 1}/${maxRetries})`);
92
70
  await sleep(retryDelay);
93
71
  }
94
72
  }
95
- spinner.warn('Health check timed out, but services may still be starting');
73
+ s.stop('Health check timed out, but services may still be starting');
96
74
  logWarning('You may need to wait a bit longer for all services to be ready.');
97
75
  }
98
76
  /**
@@ -100,13 +78,14 @@ export async function waitForInfraHealth(targetDir) {
100
78
  */
101
79
  export async function startAppServices(targetDir) {
102
80
  logInfo('Starting application services...');
103
- const spinner = ora('Starting docker-compose.yaml...').start();
81
+ const s = spinner();
82
+ s.start('Starting docker-compose.yaml...');
104
83
  try {
105
84
  await execa('docker-compose', ['up', '-d'], { cwd: targetDir });
106
- spinner.succeed('Application services started');
85
+ s.stop('Application services started');
107
86
  }
108
87
  catch (error) {
109
- spinner.fail('Failed to start application services');
88
+ s.error('Failed to start application services');
110
89
  throw error;
111
90
  }
112
91
  }
@@ -114,36 +93,42 @@ export async function startAppServices(targetDir) {
114
93
  * Display service status and URLs
115
94
  */
116
95
  export async function displayServiceStatus() {
117
- console.log('\n' + chalk.green('═'.repeat(60)));
118
- console.log(chalk.green.bold('Services Started Successfully!'));
119
- console.log(chalk.green(''.repeat(60)) + '\n');
96
+ console.log(`\n${divider('green', '═')}`);
97
+ console.log(chalk.greenBright(chalk.bold('Services Started')));
98
+ console.log(divider('green', ''));
120
99
  try {
121
100
  // Get running containers
122
101
  const { stdout } = await execa('docker', ['ps', '--format', '{{.Names}}']);
123
- const containers = stdout.split('\n').filter(Boolean);
124
- console.log(chalk.cyan.bold('🔗 Access URLs:\n'));
102
+ const containers = stdout.split('\n').filter(Boolean).sort();
103
+ const accessRows = [];
125
104
  // Display URLs for known services
126
105
  if (containers.some(c => c.includes('api'))) {
127
- console.log(` ${chalk.bold('API Server:')} ${chalk.underline(getServiceURL('API'))}`);
128
- console.log(` ${chalk.bold('API Health:')} ${chalk.underline(getServiceURL('API') + '/health')}\n`);
106
+ accessRows.push({ label: 'API Server', value: getServiceURL('API') });
107
+ accessRows.push({ label: 'API Health', value: `${getServiceURL('API')}/health` });
129
108
  }
130
109
  if (containers.some(c => c.includes('dashboard'))) {
131
- console.log(` ${chalk.bold('Dashboard:')} ${chalk.underline(getServiceURL('DASHBOARD'))}\n`);
110
+ accessRows.push({ label: 'Dashboard', value: getServiceURL('DASHBOARD') });
132
111
  }
133
112
  if (containers.some(c => c.includes('kafka-ui'))) {
134
- console.log(` ${chalk.bold('Kafka UI:')} ${chalk.underline(getServiceURL('KAFKA_UI'))}\n`);
113
+ accessRows.push({ label: 'Kafka UI', value: getServiceURL('KAFKA_UI') });
135
114
  }
136
115
  if (containers.some(c => c.includes('grafana'))) {
137
- console.log(` ${chalk.bold('Grafana:')} ${chalk.underline(getServiceURL('GRAFANA'))}`);
138
- console.log(` ${chalk.gray('(default login: admin/admin)')}\n`);
116
+ accessRows.push({ label: 'Grafana', value: `${getServiceURL('GRAFANA')} (admin/admin)` });
117
+ }
118
+ if (accessRows.length > 0) {
119
+ printSummaryCard('Access URLs', accessRows);
139
120
  }
140
- console.log(chalk.cyan.bold('📦 Running Containers:\n'));
121
+ console.log(chalk.cyanBright('Running Containers'));
122
+ console.log(divider());
141
123
  for (const container of containers) {
142
- console.log(` ${chalk.green('')} ${container}`);
124
+ console.log(` ${chalk.greenBright('')} ${container}`);
143
125
  }
144
- console.log('\n' + chalk.cyan('To view logs:') + ' docker-compose logs -f');
145
- console.log(chalk.cyan('To stop services:') + ' docker-compose down\n');
146
- console.log(chalk.green('═'.repeat(60)) + '\n');
126
+ console.log('');
127
+ printCommandHints('Helpful commands', [
128
+ 'docker-compose logs -f',
129
+ 'docker-compose down',
130
+ ]);
131
+ console.log(`${divider('green', '═')}\n`);
147
132
  }
148
133
  catch (error) {
149
134
  logWarning('Could not fetch container status');
@@ -1 +1 @@
1
- {"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
- export declare const INFRA_COMPOSE_TEMPLATE = "# ============================================\n# INFRA_HOST: Set this in .env to your machine's IP/hostname when running\n# infrastructure on a separate system from application services.\n# Default: host.docker.internal (for same-system deployment)\n# ============================================\n\nservices:\n # ============================================\n # Infrastructure Services\n # ============================================\n mongo:\n image: mongo:7.0\n container_name: mongo\n command: [ \"--replSet\", \"rs0\", \"--bind_ip_all\", \"--port\", \"27017\" ]\n ports:\n - 27017:27017\n extra_hosts:\n - \"host.docker.internal:host-gateway\"\n healthcheck:\n test: echo \"try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'{{INFRA_HOST}}:27017'}]}) }\" | mongosh --port 27017 --quiet\n interval: 5s\n timeout: 30s\n start_period: 0s\n start_interval: 1s\n retries: 30\n volumes:\n - \"mongo_data:/data/db\"\n - \"mongo_config:/data/configdb\"\n\n kafka:\n image: apache/kafka-native\n container_name: kafka\n ports:\n - \"9092:9092\"\n environment:\n # Configure listeners for both docker and host communication\n KAFKA_LISTENERS: CONTROLLER://localhost:9091,HOST://0.0.0.0:9092,DOCKER://0.0.0.0:9093\n KAFKA_ADVERTISED_LISTENERS: HOST://{{INFRA_HOST}}:9092,DOCKER://kafka:9093\n KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,DOCKER:PLAINTEXT,HOST:PLAINTEXT\n\n # Settings required for KRaft mode\n KAFKA_NODE_ID: 1\n KAFKA_PROCESS_ROLES: broker,controller\n KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER\n KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9091\n\n # Listener to use for broker-to-broker communication\n KAFKA_INTER_BROKER_LISTENER_NAME: DOCKER\n\n # Required for a single node cluster\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n\n # Disable auto-topic creation - API server will create topics with correct partitions\n KAFKA_AUTO_CREATE_TOPICS_ENABLE: \"false\"\n volumes:\n - \"kafka_data:/var/lib/kafka/data\"\n\n kafka-ui:\n image: kafbat/kafka-ui:main\n container_name: kafka-ui\n ports:\n - 8080:8080\n environment:\n DYNAMIC_CONFIG_ENABLED: \"true\"\n KAFKA_CLUSTERS_0_NAME: local\n KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9093\n depends_on:\n - kafka\n\n redis:\n image: redis:7-alpine\n container_name: redis\n ports:\n - \"6379:6379\"\n command: redis-server --appendonly yes\n volumes:\n - \"redis_data:/data\"\n healthcheck:\n test: [ \"CMD\", \"redis-cli\", \"ping\" ]\n interval: 5s\n timeout: 3s\n retries: 5\n\n # ============================================\n # Observability Services\n # ============================================\n\n loki:\n image: grafana/loki:2.9.0\n container_name: loki\n ports:\n - \"3100:3100\"\n command: -config.file=/etc/loki/local-config.yaml\n volumes:\n - \"loki_data:/loki\"\n healthcheck:\n test: [ \"CMD-SHELL\", \"wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1\" ]\n interval: 10s\n timeout: 5s\n retries: 5\n\n grafana:\n image: grafana/grafana:10.2.0\n container_name: grafana\n ports:\n - \"3001:3000\"\n environment:\n - GF_PATHS_PROVISIONING=/etc/grafana/provisioning\n - GF_AUTH_ANONYMOUS_ENABLED=true\n - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin\n - GF_SECURITY_ADMIN_PASSWORD=admin\n volumes:\n - \"grafana_data:/var/lib/grafana\"\n depends_on:\n loki:\n condition: service_healthy\n\nvolumes:\n mongo_data:\n mongo_config:\n kafka_data:\n redis_data:\n loki_data:\n grafana_data:\n";
2
- export declare const APP_COMPOSE_TEMPLATE = "services:\n api:\n image: ghcr.io/simplenotificationsystem/simplens-core:latest\n container_name: api\n ports:\n - 3000:3000\n env_file:\n - .env\n volumes:\n - plugin-data:/app/.plugins\n - ./simplens.config.yaml:/app/simplens.config.yaml:ro\n command: [ \"node\", \"dist/api/server.js\" ]\n restart: unless-stopped\n healthcheck:\n test: [ \"CMD\", \"node\", \"-e\", \"require('http').get('http://localhost:3000/health', (r) => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))\" ]\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 10s\n\n worker:\n image: ghcr.io/simplenotificationsystem/simplens-core:latest\n env_file:\n - .env\n command: [ \"node\", \"dist/workers/worker.js\" ]\n restart: unless-stopped\n\n notification_processor:\n image: ghcr.io/simplenotificationsystem/simplens-core:latest\n env_file:\n - .env\n volumes:\n - plugin-data:/app/.plugins\n - ./simplens.config.yaml:/app/simplens.config.yaml:ro\n command: [ \"node\", \"dist/processors/unified/unified.processor.js\" ]\n depends_on:\n api:\n condition: service_healthy\n restart: unless-stopped\n\n delayed_processor:\n image: ghcr.io/simplenotificationsystem/simplens-core:latest\n env_file:\n - .env\n command: [ \"node\", \"dist/processors/delayed/delayed.processor.js\" ]\n restart: unless-stopped\n\n recovery:\n image: ghcr.io/simplenotificationsystem/simplens-core:latest\n env_file:\n - .env\n command: [ \"node\", \"dist/workers/recovery/recovery.service.js\" ]\n restart: unless-stopped\n\n dashboard:\n image: ghcr.io/simplenotificationsystem/simplens-dashboard:latest\n ports:\n - 3002:3002\n container_name: dashboard\n env_file:\n - .env\n environment:\n PORT: ${DASHBOARD_PORT:-3002}\n API_BASE_URL: http://api:${PORT:-3000}\n WEBHOOK_HOST: dashboard\n WEBHOOK_PORT: ${DASHBOARD_PORT:-3002}\n restart: unless-stopped\n\nvolumes:\n plugin-data:\n\nnetworks:\n default:\n name: simplens\n";
1
+ export declare const INFRA_COMPOSE_TEMPLATE = "\nservices:\n # ============================================\n # Infrastructure Services\n # ============================================\n mongo:\n image: mongo:7.0\n container_name: mongo\n command: [ \"--replSet\", \"rs0\", \"--bind_ip_all\", \"--port\", \"27017\" ]\n ports:\n - 27017:27017\n healthcheck:\n test: echo \"try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'mongo:27017'}]}) }\" | mongosh --port 27017 --quiet\n interval: 5s\n timeout: 30s\n start_period: 0s\n start_interval: 1s\n retries: 30\n volumes:\n - \"mongo_data:/data/db\"\n - \"mongo_config:/data/configdb\"\n\n kafka:\n image: apache/kafka-native\n container_name: kafka\n ports:\n - \"9092:9092\"\n environment:\n # Configure listeners for both docker and host communication\n KAFKA_LISTENERS: CONTROLLER://localhost:9091,HOST://0.0.0.0:9092,DOCKER://0.0.0.0:9093\n KAFKA_ADVERTISED_LISTENERS: HOST://kafka:9092,DOCKER://kafka:9093\n KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,DOCKER:PLAINTEXT,HOST:PLAINTEXT\n\n # Settings required for KRaft mode\n KAFKA_NODE_ID: 1\n KAFKA_PROCESS_ROLES: broker,controller\n KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER\n KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9091\n\n # Listener to use for broker-to-broker communication\n KAFKA_INTER_BROKER_LISTENER_NAME: DOCKER\n\n # Required for a single node cluster\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n\n # Disable auto-topic creation - API server will create topics with correct partitions\n KAFKA_AUTO_CREATE_TOPICS_ENABLE: \"false\"\n volumes:\n - \"kafka_data:/var/lib/kafka/data\"\n\n kafka-ui:\n image: kafbat/kafka-ui:main\n container_name: kafka-ui\n ports:\n - 8080:8080\n environment:\n DYNAMIC_CONFIG_ENABLED: \"true\"\n KAFKA_CLUSTERS_0_NAME: local\n KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9093\n depends_on:\n - kafka\n\n redis:\n image: redis:7-alpine\n container_name: redis\n ports:\n - \"6379:6379\"\n command: redis-server --appendonly yes\n volumes:\n - \"redis_data:/data\"\n healthcheck:\n test: [ \"CMD\", \"redis-cli\", \"ping\" ]\n interval: 5s\n timeout: 3s\n retries: 5\n\n # ============================================\n # Observability Services\n # ============================================\n\n loki:\n image: grafana/loki:2.9.0\n container_name: loki\n ports:\n - \"3100:3100\"\n command: -config.file=/etc/loki/local-config.yaml\n volumes:\n - \"loki_data:/loki\"\n healthcheck:\n test: [ \"CMD-SHELL\", \"wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1\" ]\n interval: 10s\n timeout: 5s\n retries: 5\n\n grafana:\n image: grafana/grafana:10.2.0\n container_name: grafana\n ports:\n - \"3001:3000\"\n environment:\n - GF_PATHS_PROVISIONING=/etc/grafana/provisioning\n - GF_AUTH_ANONYMOUS_ENABLED=true\n - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin\n - GF_SECURITY_ADMIN_PASSWORD=admin\n volumes:\n - \"grafana_data:/var/lib/grafana\"\n depends_on:\n loki:\n condition: service_healthy\n\nvolumes:\n mongo_data:\n mongo_config:\n kafka_data:\n redis_data:\n loki_data:\n grafana_data:\n";
2
+ export declare const APP_COMPOSE_TEMPLATE = "services:\n api:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n container_name: api\n ports:\n - 3000:3000\n env_file:\n - .env\n volumes:\n - plugin-data:/app/.plugins\n - ./simplens.config.yaml:/app/simplens.config.yaml:ro\n command: [ \"node\", \"dist/api/server.js\" ]\n restart: unless-stopped\n healthcheck:\n test: [ \"CMD\", \"node\", \"-e\", \"require('http').get('http://localhost:3000/health', (r) => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))\" ]\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 10s\n\n worker:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n env_file:\n - .env\n command: [ \"node\", \"dist/workers/worker.js\" ]\n restart: unless-stopped\n\n notification_processor:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n env_file:\n - .env\n volumes:\n - plugin-data:/app/.plugins\n - ./simplens.config.yaml:/app/simplens.config.yaml:ro\n command: [ \"node\", \"dist/processors/unified/unified.processor.js\" ]\n depends_on:\n api:\n condition: service_healthy\n restart: unless-stopped\n\n delayed_processor:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n env_file:\n - .env\n command: [ \"node\", \"dist/processors/delayed/delayed.processor.js\" ]\n restart: unless-stopped\n\n recovery:\n image: ghcr.io/simplenotificationsystem/simplens-core:${CORE_VERSION:-latest}\n env_file:\n - .env\n command: [ \"node\", \"dist/workers/recovery/recovery.service.js\" ]\n restart: unless-stopped\n\n dashboard:\n image: ghcr.io/simplenotificationsystem/simplens-dashboard:${DASHBOARD_VERSION:-latest}\n ports:\n - 3002:3002\n container_name: dashboard\n env_file:\n - .env\n environment:\n PORT: ${DASHBOARD_PORT:-3002}\n API_BASE_URL: http://api:${PORT:-3000}\n WEBHOOK_HOST: dashboard\n WEBHOOK_PORT: ${DASHBOARD_PORT:-3002}\n NEXT_PUBLIC_BASE_PATH: ${BASE_PATH:-}\n restart: unless-stopped\n\nvolumes:\n plugin-data:\n\nnetworks:\n default:\n name: simplens\n";
3
+ export declare const APP_NGINX_SERVICE_TEMPLATE = " nginx:\n image: nginx:alpine\n container_name: nginx\n ports:\n - \"80:80\"\n volumes:\n - \"./nginx.conf:/etc/nginx/conf.d/default.conf:ro\"\n depends_on:\n - api\n - dashboard\n restart: unless-stopped";
3
4
  //# sourceMappingURL=templates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,gwHA4HlC,CAAC;AAEF,eAAO,MAAM,oBAAoB,imEA0EhC,CAAC"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,02GAqHlC,CAAC;AAEF,eAAO,MAAM,oBAAoB,yvEA2EhC,CAAC;AAEF,eAAO,MAAM,0BAA0B,wPAUX,CAAC"}