@simplens/onboard 1.0.1 → 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 +253 -128
  21. package/dist/env-config.js.map +1 -1
  22. package/dist/index.js +340 -69
  23. package/dist/index.js.map +1 -1
  24. package/dist/infra.d.ts +19 -8
  25. package/dist/infra.d.ts.map +1 -1
  26. package/dist/infra.js +267 -128
  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 +2 -1
  37. package/dist/templates.d.ts.map +1 -1
  38. package/dist/templates.js +203 -191
  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 -311
  68. package/src/index.ts +534 -202
  69. package/src/infra.ts +404 -245
  70. package/src/plugins.ts +221 -190
  71. package/src/services.ts +175 -190
  72. package/src/templates.ts +209 -196
  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 -22
package/dist/index.js CHANGED
@@ -1,58 +1,221 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from 'commander';
3
3
  import path from 'path';
4
- import inquirer from 'inquirer';
5
- import { displayBanner, logSuccess, logInfo, initLogger, logDebug } from './utils.js';
4
+ import { displayBanner, logSuccess, initLogger, logDebug, printStepHeader, printCommandHints, logWarning, } from './utils.js';
5
+ import { text, confirm, select } from '@clack/prompts';
6
+ import { intro, outro, handleCancel, log, note } from './ui.js';
6
7
  import { validatePrerequisites } from './validators.js';
7
- import { promptInfraServices, generateInfraCompose, writeAppCompose, } from './infra.js';
8
- import { promptEnvVariables, generateEnvFile, appendPluginEnv, } from './env-config.js';
9
- import { fetchAvailablePlugins, promptPluginSelection, generatePluginConfig, parseConfigCredentials, promptPluginCredentials, } from './plugins.js';
8
+ import { promptInfraServicesWithBasePath, generateInfraCompose, writeAppCompose, generateNginxConfig, } from './infra.js';
9
+ import { promptEnvVariables, generateEnvFile, appendPluginEnv, promptBasePath, normalizeBasePath, validateBasePath, DEFAULT_BASE_PATH, } from './env-config.js';
10
+ import { fetchAvailablePlugins, promptPluginSelection, generatePluginConfig, parseConfigCredentials, promptPluginCredentials, generateDefaultPluginCredentials, } from './plugins.js';
10
11
  import { promptStartServices, startInfraServices, waitForInfraHealth, startAppServices, displayServiceStatus, } from './services.js';
11
12
  const program = new Command();
12
13
  program
13
14
  .name('@simplens/onboard')
14
15
  .description('A CLI tool to setup a SimpleNS instance on your machine/server')
15
16
  .version('1.0.0')
16
- .option('--infra', 'Setup infrastructure services (MongoDB, Kafka, Redis, etc.)')
17
+ .option('--full', 'Non-interactive mode - all options must be provided via CLI')
18
+ .option('--infra [services...]', 'Infrastructure services (mongo, kafka, kafka-ui, redis, nginx, loki, grafana)')
17
19
  .option('--env <mode>', 'Environment setup mode: "default" or "interactive"')
18
20
  .option('--dir <path>', 'Target directory for setup')
19
- .parse(process.argv);
20
- const options = program.opts();
21
+ .option('--base-path <path>', 'Dashboard BASE_PATH (example: /dashboard, default: root)')
22
+ .option('--plugin [plugins...]', 'Plugins to install (e.g., @simplens/mock @simplens/nodemailer-gmail)')
23
+ .option('--no-output', 'Suppress all console output (silent mode)');
24
+ function printStep(step, total, title) {
25
+ printStepHeader(step, total, title);
26
+ }
27
+ function shouldAutoEnableNginx(basePath) {
28
+ return normalizeBasePath(basePath) !== DEFAULT_BASE_PATH;
29
+ }
30
+ /**
31
+ * Valid infrastructure services
32
+ */
33
+ const VALID_INFRA_SERVICES = ['mongo', 'kafka', 'kafka-ui', 'redis', 'nginx', 'loki', 'grafana'];
34
+ /**
35
+ * Validate infrastructure service names
36
+ */
37
+ function validateInfraServices(services) {
38
+ const invalid = services.filter(s => !VALID_INFRA_SERVICES.includes(s));
39
+ return { valid: invalid.length === 0, invalid };
40
+ }
41
+ /**
42
+ * Validate plugin names (must start with @simplens/ or be a valid npm package)
43
+ */
44
+ function validatePlugins(plugins) {
45
+ const invalid = plugins.filter(p => {
46
+ // Must start with @ or be a valid npm package name
47
+ return !p.match(/^(@[\w-]+\/[\w-]+|[\w-]+)$/);
48
+ });
49
+ return { valid: invalid.length === 0, invalid };
50
+ }
51
+ function showSetupSummary(setupOptions, targetDir, autoNginx) {
52
+ const basePathLabel = setupOptions.basePath || '(root)';
53
+ const infraLabel = setupOptions.infra
54
+ ? `enabled (${setupOptions.infraServices.join(', ')})`
55
+ : 'disabled';
56
+ const pluginsLabel = setupOptions.plugins.length > 0
57
+ ? setupOptions.plugins.join(', ')
58
+ : 'none';
59
+ const summaryLines = [
60
+ `Target directory : ${targetDir}`,
61
+ `Infrastructure : ${infraLabel}`,
62
+ `Environment mode : ${setupOptions.envMode}`,
63
+ `BASE_PATH : ${basePathLabel}`,
64
+ `Plugins : ${pluginsLabel}`,
65
+ `Nginx auto-include : ${autoNginx ? 'enabled (BASE_PATH is non-default)' : 'disabled'}`,
66
+ ].join('\n');
67
+ note(summaryLines, 'Setup Summary');
68
+ }
21
69
  /**
22
70
  * Prompt for setup options if not provided via CLI args
71
+ * In --full mode, all required options must be provided via CLI
23
72
  */
24
- async function promptSetupOptions() {
25
- const answers = await inquirer.prompt([
26
- {
27
- type: 'confirm',
28
- name: 'infra',
29
- message: 'Do you want to setup infrastructure services (MongoDB, Kafka, Redis, etc.)?',
30
- default: true,
31
- when: () => options.infra === undefined,
32
- },
33
- {
34
- type: 'list',
35
- name: 'envMode',
73
+ async function promptSetupOptions(options) {
74
+ const isFullMode = options.full === true;
75
+ // --- Validate --full mode requirements ---
76
+ if (isFullMode) {
77
+ const errors = [];
78
+ // --env is required in full mode
79
+ if (!options.env) {
80
+ errors.push('--env <mode> is required in --full mode (use \"default\" or \"interactive\")');
81
+ }
82
+ else if (options.env !== 'default' && options.env !== 'interactive') {
83
+ errors.push('--env must be either \"default\" or \"interactive\"');
84
+ }
85
+ // Validate --base-path if provided
86
+ if (options.basePath) {
87
+ const validation = validateBasePath(normalizeBasePath(options.basePath));
88
+ if (validation !== true) {
89
+ errors.push(`Invalid --base-path: ${validation}`);
90
+ }
91
+ }
92
+ // Validate --infra services if provided
93
+ if (options.infra && Array.isArray(options.infra)) {
94
+ const { valid, invalid } = validateInfraServices(options.infra);
95
+ if (!valid) {
96
+ errors.push(`Invalid infrastructure services: ${invalid.join(', ')}. ` +
97
+ `Valid options: ${VALID_INFRA_SERVICES.join(', ')}`);
98
+ }
99
+ }
100
+ // Validate --plugin if provided
101
+ if (options.plugin && Array.isArray(options.plugin)) {
102
+ const { valid, invalid } = validatePlugins(options.plugin);
103
+ if (!valid) {
104
+ errors.push(`Invalid plugin names: ${invalid.join(', ')}`);
105
+ }
106
+ }
107
+ if (errors.length > 0) {
108
+ console.error('\\n❌ Validation errors in --full mode:\\n');
109
+ errors.forEach(err => console.error(` • ${err}`));
110
+ console.error('\\nRun with --help to see usage examples.\\n');
111
+ process.exit(1);
112
+ }
113
+ }
114
+ // --- BASE_PATH ---
115
+ let basePathValue;
116
+ const cliBasePath = typeof options.basePath === 'string'
117
+ ? normalizeBasePath(options.basePath)
118
+ : undefined;
119
+ if (cliBasePath !== undefined) {
120
+ const validation = validateBasePath(cliBasePath);
121
+ if (validation !== true) {
122
+ throw new Error(`Invalid --base-path value: ${validation}`);
123
+ }
124
+ basePathValue = cliBasePath;
125
+ }
126
+ else if (isFullMode) {
127
+ basePathValue = DEFAULT_BASE_PATH; // Default to root in full mode
128
+ }
129
+ else {
130
+ basePathValue = await promptBasePath(DEFAULT_BASE_PATH);
131
+ }
132
+ // --- Infra flag and services ---
133
+ let infraValue;
134
+ let infraServices = [];
135
+ if (Array.isArray(options.infra) && options.infra.length > 0) {
136
+ // --infra with services provided
137
+ infraValue = true;
138
+ infraServices = options.infra;
139
+ }
140
+ else if (options.infra === true) {
141
+ // --infra flag without services (backward compatibility - prompt for services)
142
+ infraValue = true;
143
+ if (isFullMode) {
144
+ // In full mode, empty --infra means no services selected (error)
145
+ console.error('\\n❌ In --full mode, --infra requires service names.\\n');
146
+ console.error('Example: --infra mongo kafka redis\\n');
147
+ process.exit(1);
148
+ }
149
+ // Not in full mode, will prompt later
150
+ }
151
+ else {
152
+ // No --infra flag provided
153
+ if (isFullMode) {
154
+ infraValue = false; // Default to no infrastructure in full mode
155
+ }
156
+ else {
157
+ const result = await confirm({
158
+ message: 'Do you want to setup infrastructure services (MongoDB, Kafka, Redis, etc.)?',
159
+ initialValue: true,
160
+ withGuide: true,
161
+ });
162
+ handleCancel(result);
163
+ infraValue = result;
164
+ }
165
+ }
166
+ // --- Env mode ---
167
+ let envModeValue;
168
+ if (options.env) {
169
+ envModeValue = options.env;
170
+ }
171
+ else if (isFullMode) {
172
+ // Already validated above, this shouldn't happen
173
+ envModeValue = 'default';
174
+ }
175
+ else {
176
+ const result = await select({
36
177
  message: 'Select environment configuration mode:',
37
- choices: [
38
- { name: 'Default (use preset values, prompt only for critical)', value: 'default' },
39
- { name: 'Interactive (prompt for all variables)', value: 'interactive' },
178
+ options: [
179
+ { value: 'default', label: 'Default', hint: 'use preset values, prompt only for critical' },
180
+ { value: 'interactive', label: 'Interactive', hint: 'prompt for all variables' },
40
181
  ],
41
- default: 'default',
42
- when: () => !options.env,
43
- },
44
- {
45
- type: 'input',
46
- name: 'targetDir',
182
+ initialValue: 'default',
183
+ withGuide: true,
184
+ });
185
+ handleCancel(result);
186
+ envModeValue = result;
187
+ }
188
+ // --- Target directory ---
189
+ let targetDirValue;
190
+ if (options.dir) {
191
+ targetDirValue = options.dir;
192
+ }
193
+ else if (isFullMode) {
194
+ targetDirValue = process.cwd(); // Default to current directory in full mode
195
+ }
196
+ else {
197
+ const result = await text({
47
198
  message: 'Target directory for setup:',
48
- default: process.cwd(),
49
- when: () => !options.dir,
50
- },
51
- ]);
199
+ defaultValue: process.cwd(),
200
+ initialValue: process.cwd(),
201
+ withGuide: true,
202
+ });
203
+ handleCancel(result);
204
+ targetDirValue = result;
205
+ }
206
+ // --- Plugins ---
207
+ let pluginsValue = [];
208
+ if (Array.isArray(options.plugin) && options.plugin.length > 0) {
209
+ pluginsValue = options.plugin;
210
+ }
211
+ // If not provided and not in full mode, will prompt later in the main workflow
52
212
  return {
53
- infra: options.infra !== undefined ? options.infra : answers.infra,
54
- envMode: options.env || answers.envMode || 'default',
55
- targetDir: options.dir || answers.targetDir || process.cwd(),
213
+ infra: infraValue,
214
+ infraServices: infraServices,
215
+ envMode: envModeValue || 'default',
216
+ targetDir: targetDirValue || process.cwd(),
217
+ basePath: basePathValue,
218
+ plugins: pluginsValue,
56
219
  };
57
220
  }
58
221
  /**
@@ -60,60 +223,127 @@ async function promptSetupOptions() {
60
223
  */
61
224
  async function main() {
62
225
  try {
63
- // Display banner
64
- displayBanner();
65
- // Initialize logger based on CLI flags
66
- const opts = program.opts();
226
+ const totalSteps = 6;
227
+ // Parse command line arguments FIRST
228
+ program.parse(process.argv);
229
+ const options = program.opts();
230
+ // Initialize logger based on CLI flags (before any output)
67
231
  initLogger({
68
- verbose: opts.verbose || false,
69
- debug: opts.debug || false,
70
- logFile: opts.debug ? path.join(process.cwd(), 'onboard-debug.log') : undefined,
232
+ verbose: options.verbose || false,
233
+ debug: options.debug || false,
234
+ silent: !options.output, // --no-output sets options.output to false
235
+ logFile: options.debug ? path.join(process.cwd(), 'onboard-debug.log') : undefined,
71
236
  });
237
+ // Display banner (after logger is initialized)
238
+ displayBanner();
239
+ // Clack intro
240
+ intro('SimpleNS Onboard');
72
241
  logDebug('Logger initialized');
73
- logDebug(`CLI options: ${JSON.stringify(opts)}`);
242
+ logDebug(`CLI options: ${JSON.stringify(options)}`);
74
243
  // Prompt for setup options if not provided
75
- const setupOptions = await promptSetupOptions();
244
+ const setupOptions = await promptSetupOptions(options);
76
245
  // Get target directory
77
246
  const targetDir = path.resolve(setupOptions.targetDir);
78
- logInfo(`Target directory: ${targetDir}`);
247
+ const autoEnableNginx = shouldAutoEnableNginx(setupOptions.basePath);
79
248
  logDebug(`Resolved target directory: ${targetDir}`);
249
+ showSetupSummary(setupOptions, targetDir, autoEnableNginx);
80
250
  // Step 1: Validate prerequisites
251
+ log.step('Step 1/6 — Prerequisites Validation');
81
252
  await validatePrerequisites();
82
253
  // Step 2: Infrastructure setup (if --infra flag is provided)
254
+ log.step('Step 2/6 — Infrastructure Setup');
83
255
  let selectedInfraServices = [];
84
256
  if (setupOptions.infra) {
85
- logInfo('\n🏗️ Infrastructure Setup\n');
86
- selectedInfraServices = await promptInfraServices();
257
+ // Use pre-provided services from CLI, or prompt for them
258
+ if (setupOptions.infraServices.length > 0) {
259
+ selectedInfraServices = setupOptions.infraServices;
260
+ log.info(`Using infrastructure services: ${selectedInfraServices.join(', ')}`);
261
+ }
262
+ else {
263
+ // Prompt for services (interactive mode)
264
+ if (!autoEnableNginx) {
265
+ log.info('BASE_PATH is empty, nginx reverse proxy is disabled.');
266
+ selectedInfraServices = await promptInfraServicesWithBasePath({ allowNginx: false });
267
+ }
268
+ else {
269
+ selectedInfraServices = await promptInfraServicesWithBasePath({ allowNginx: true });
270
+ }
271
+ }
272
+ if (autoEnableNginx && !selectedInfraServices.includes('nginx')) {
273
+ selectedInfraServices.push('nginx');
274
+ log.info('BASE_PATH is non-default, so nginx was added automatically.');
275
+ }
87
276
  await generateInfraCompose(targetDir, selectedInfraServices);
88
277
  }
89
278
  else {
90
- logInfo('\n⏭️ Skipping infrastructure setup (use --infra to enable)');
279
+ log.info('Skipping infrastructure setup (use --infra to enable).');
91
280
  }
92
- // Always write app docker-compose
93
- logInfo('\n📦 Application Services Setup\n');
94
- await writeAppCompose(targetDir);
95
- // Step 3: Environment configuration
96
- logInfo('\n⚙️ Environment Configuration\n');
281
+ // Step 3: Always write app docker-compose
282
+ log.step('Step 3/6 — Application Compose Setup');
283
+ const includeNginxInAppCompose = autoEnableNginx && !selectedInfraServices.includes('nginx');
284
+ if (includeNginxInAppCompose) {
285
+ log.info('Including nginx in docker-compose.yaml because BASE_PATH is non-default.');
286
+ }
287
+ await writeAppCompose(targetDir, { includeNginx: includeNginxInAppCompose });
288
+ // Step 4: Environment configuration
289
+ log.step('Step 4/6 — Environment Configuration');
97
290
  const envMode = setupOptions.envMode;
98
- const envVars = await promptEnvVariables(envMode, selectedInfraServices);
291
+ const envVars = await promptEnvVariables(envMode, selectedInfraServices, setupOptions.basePath, options.full || false);
99
292
  await generateEnvFile(targetDir, envVars);
100
- // Step 4: Plugin installation
101
- logInfo('\n🔌 Plugin Installation\n');
102
- const availablePlugins = await fetchAvailablePlugins();
103
- const selectedPlugins = await promptPluginSelection(availablePlugins);
293
+ // In full mode, notify user about auto-generated credentials
294
+ if (options.full) {
295
+ logWarning('⚠️ Auto-generated credentials in .env file. ' +
296
+ 'Please update NS_API_KEY, AUTH_SECRET, and ADMIN_PASSWORD before deploying to production!');
297
+ }
298
+ // Generate nginx.conf whenever nginx is active in either compose file
299
+ const nginxEnabled = selectedInfraServices.includes('nginx') || includeNginxInAppCompose;
300
+ if (nginxEnabled) {
301
+ await generateNginxConfig(targetDir, setupOptions.basePath);
302
+ }
303
+ // Step 5: Plugin installation
304
+ log.step('Step 5/6 — Plugin Installation');
305
+ let selectedPlugins = [];
306
+ let pluginCredentialKeys = [];
307
+ // Use pre-provided plugins from CLI, or prompt for them
308
+ if (setupOptions.plugins.length > 0) {
309
+ selectedPlugins = setupOptions.plugins;
310
+ log.info(`Using plugins: ${selectedPlugins.join(', ')}`);
311
+ }
312
+ else if (!options.full) {
313
+ // Only prompt in interactive mode
314
+ const availablePlugins = await fetchAvailablePlugins();
315
+ selectedPlugins = await promptPluginSelection(availablePlugins);
316
+ }
104
317
  if (selectedPlugins.length > 0) {
105
318
  await generatePluginConfig(targetDir, selectedPlugins);
106
319
  // Extract and prompt for plugin credentials
107
320
  const configPath = path.join(targetDir, 'simplens.config.yaml');
108
321
  const credentialKeys = await parseConfigCredentials(configPath);
322
+ pluginCredentialKeys = credentialKeys; // Store for later use
109
323
  if (credentialKeys.length > 0) {
110
- const pluginCreds = await promptPluginCredentials(credentialKeys);
111
- await appendPluginEnv(targetDir, pluginCreds);
324
+ if (options.full) {
325
+ // In full mode, auto-generate placeholder credentials
326
+ const pluginCreds = generateDefaultPluginCredentials(credentialKeys);
327
+ await appendPluginEnv(targetDir, pluginCreds);
328
+ logWarning(`⚠️ Auto-generated placeholder plugin credentials. ` +
329
+ `Please update these in .env file: ${credentialKeys.join(', ')}`);
330
+ }
331
+ else {
332
+ const pluginCreds = await promptPluginCredentials(credentialKeys);
333
+ await appendPluginEnv(targetDir, pluginCreds);
334
+ }
112
335
  }
113
336
  }
114
- // Step 5: Service orchestration
115
- logInfo('\n🚀 Service Orchestration\n');
116
- const shouldStart = await promptStartServices();
337
+ // Step 6: Service orchestration
338
+ log.step('Step 6/6 — Service Orchestration');
339
+ let shouldStart = false;
340
+ if (options.full) {
341
+ // In full mode, don't auto-start services, just show commands
342
+ log.info('In --full mode, services are not auto-started.');
343
+ }
344
+ else {
345
+ shouldStart = await promptStartServices();
346
+ }
117
347
  if (shouldStart) {
118
348
  // Start infra services first (if --infra was used)
119
349
  if (setupOptions.infra && selectedInfraServices.length > 0) {
@@ -126,19 +356,60 @@ async function main() {
126
356
  await displayServiceStatus();
127
357
  }
128
358
  else {
129
- logInfo('Services not started. You can start them later with:');
359
+ log.info('Services not started. You can start them later with:');
360
+ const commands = [];
130
361
  if (setupOptions.infra) {
131
- console.log(' docker-compose -f docker-compose.infra.yaml up -d');
362
+ commands.push('docker-compose -f docker-compose.infra.yaml up -d');
132
363
  }
133
- console.log(' docker-compose up -d\n');
364
+ commands.push('docker-compose up -d');
365
+ printCommandHints('Manual startup commands', commands);
134
366
  }
135
367
  // Final success message
136
- logSuccess('\n🎉 SimpleNS onboarding completed successfully!\n');
368
+ logSuccess('SimpleNS onboarding completed successfully.');
369
+ // In full mode, show a comprehensive security warning
370
+ if (options.full) {
371
+ const credentialWarnings = [
372
+ ' • NS_API_KEY - API authentication key',
373
+ ' • AUTH_SECRET - Session secret for dashboard',
374
+ ' • ADMIN_PASSWORD - Dashboard admin password',
375
+ ];
376
+ if (pluginCredentialKeys.length > 0) {
377
+ credentialWarnings.push(` • Plugin credentials: ${pluginCredentialKeys.join(', ')}`);
378
+ }
379
+ note('⚠️ IMPORTANT: Auto-generated credentials were used for non-interactive setup.\n' +
380
+ '\n' +
381
+ 'Please update the following in your .env file before production use:\n' +
382
+ credentialWarnings.join('\n') +
383
+ '\n\n' +
384
+ 'Default credentials are NOT secure for production environments.', 'Security Notice');
385
+ }
386
+ // Display access information
387
+ if (nginxEnabled) {
388
+ if (setupOptions.basePath) {
389
+ note(`Dashboard : http://localhost${setupOptions.basePath}\nAPI : http://localhost/api/notification/`, 'Service Access');
390
+ }
391
+ else {
392
+ note('Dashboard : http://localhost\nAPI : http://localhost/api/notification/', 'Service Access');
393
+ }
394
+ }
395
+ else {
396
+ note('Dashboard : http://localhost:3002\nAPI : http://localhost:3000', 'Service Access');
397
+ }
398
+ // Clack outro
399
+ outro('Setup complete — happy notifying! 🚀');
137
400
  }
138
401
  catch (error) {
139
402
  // Import at top of file
140
403
  const { formatErrorForUser } = await import('./types/errors.js');
141
- console.log('\n' + formatErrorForUser(error));
404
+ const { getLoggerConfig } = await import('./utils/logger.js');
405
+ // Always log errors to stderr, even in silent mode
406
+ if (!getLoggerConfig().silent) {
407
+ console.log('\n' + formatErrorForUser(error));
408
+ }
409
+ else {
410
+ // In silent mode, write to stderr
411
+ console.error(formatErrorForUser(error));
412
+ }
142
413
  // Log full error to stderr for debugging
143
414
  if (process.env.DEBUG) {
144
415
  console.error('\nFull error details:');
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/infra.d.ts CHANGED
@@ -1,23 +1,34 @@
1
1
  /**
2
2
  * Prompts user to select which infrastructure services to deploy.
3
- * Services include MongoDB, Kafka, Redis, Loki, and Grafana.
4
3
  *
5
4
  * @returns Array of selected service IDs (e.g., ['mongo', 'kafka', 'redis'])
6
5
  * @throws Error if no services are selected
7
- *
8
- * @example
9
- * ```ts
10
- * const services = await promptInfraServices();
11
- * // Returns: ['mongo', 'kafka', 'kafka-ui', 'redis']
12
- * ```
13
6
  */
14
7
  export declare function promptInfraServices(): Promise<string[]>;
8
+ /**
9
+ * Prompts infrastructure services with optional nginx availability.
10
+ * If nginx is disabled, it is removed from choices and from result safety-check.
11
+ */
12
+ export declare function promptInfraServicesWithBasePath(options: {
13
+ allowNginx: boolean;
14
+ }): Promise<string[]>;
15
15
  /**
16
16
  * Generate and write docker-compose.infra.yaml
17
17
  */
18
18
  export declare function generateInfraCompose(targetDir: string, selectedServices: string[]): Promise<void>;
19
+ /**
20
+ * Build app docker-compose content.
21
+ * Optionally inject nginx reverse-proxy service before the volumes section.
22
+ */
23
+ export declare function buildAppComposeContent(includeNginx: boolean): string;
19
24
  /**
20
25
  * Write app docker-compose.yaml
21
26
  */
22
- export declare function writeAppCompose(targetDir: string): Promise<void>;
27
+ export declare function writeAppCompose(targetDir: string, options?: {
28
+ includeNginx?: boolean;
29
+ }): Promise<void>;
30
+ /**
31
+ * Generate nginx.conf based on basePath configuration
32
+ */
33
+ export declare function generateNginxConfig(targetDir: string, basePath: string): Promise<void>;
23
34
  //# sourceMappingURL=infra.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"infra.d.ts","sourceRoot":"","sources":["../src/infra.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAiB7D;AA6KD;;GAEG;AACH,wBAAsB,oBAAoB,CACtC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE"}
1
+ {"version":3,"file":"infra.d.ts","sourceRoot":"","sources":["../src/infra.ts"],"names":[],"mappings":"AAiBA;;;;;GAKG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAE7D;AAED;;;GAGG;AACH,wBAAsB,+BAA+B,CAAC,OAAO,EAAE;IAC3D,UAAU,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BpB;AAuLD;;GAEG;AACH,wBAAsB,oBAAoB,CACtC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,CAWpE;AAED;;GAEG;AACH,wBAAsB,eAAe,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACzC,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACrC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAqGf"}