@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra.test.js","sourceRoot":"","sources":["../../src/__tests__/infra.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC3C,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,gDAAgD,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=nginx.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nginx.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/nginx.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import os from 'os';
3
+ import path from 'path';
4
+ import fs from 'fs/promises';
5
+ import { generateNginxConfig } from '../infra.js';
6
+ describe('nginx config generation', () => {
7
+ it('generates a basic nginx config without upstream', async () => {
8
+ const tempDir = path.join(os.tmpdir(), `onboard-nginx-${Date.now()}`);
9
+ await fs.mkdir(tempDir, { recursive: true });
10
+ await generateNginxConfig(tempDir, '');
11
+ const content = await fs.readFile(path.join(tempDir, 'nginx.conf'), 'utf-8');
12
+ expect(content).toContain('proxy_pass http://api:3000');
13
+ expect(content).not.toContain('upstream api_upstream');
14
+ });
15
+ });
16
+ //# sourceMappingURL=nginx.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nginx.test.js","sourceRoot":"","sources":["../../src/__tests__/nginx.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7C,MAAM,mBAAmB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QAE7E,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1,4 +1,28 @@
1
1
  import type { EnvVariable } from './types/domain.js';
2
+ export declare const DEFAULT_BASE_PATH = "";
3
+ /**
4
+ * Generate a secure random string for credentials
5
+ */
6
+ export declare function generateSecureRandom(length?: number): string;
7
+ /**
8
+ * Generate default value for a critical environment variable
9
+ */
10
+ export declare function generateDefaultValue(key: string): string;
11
+ /**
12
+ * Validate BASE_PATH value.
13
+ * Accepts:
14
+ * - Empty value for root path
15
+ * - Slash-prefixed lowercase segments (e.g. /dashboard, /admin/v1)
16
+ */
17
+ export declare function validateBasePath(input: string): true | string;
18
+ /**
19
+ * Normalize BASE_PATH for consistent downstream use.
20
+ */
21
+ export declare function normalizeBasePath(input: string): string;
22
+ /**
23
+ * Prompt BASE_PATH once at the beginning of onboarding.
24
+ */
25
+ export declare function promptBasePath(defaultValue?: string): Promise<string>;
2
26
  /**
3
27
  * Load and parse .env.example from embedded template
4
28
  */
@@ -8,20 +32,11 @@ export declare function loadEnvExample(): Promise<EnvVariable[]>;
8
32
  *
9
33
  * @param mode - 'default' prompts only for critical vars, 'interactive' prompts for all
10
34
  * @param infraServices - List of selected infrastructure service IDs
11
- * @param infraHost - Host for infrastructure services
35
+ * @param basePath - BASE_PATH value already collected
36
+ * @param fullMode - If true, auto-generate critical values without prompting
12
37
  * @returns Map of environment variable keys to values
13
- *
14
- * @remarks
15
- * Critical variables (always prompted): NS_API_KEY, MONGO_URI, BROKERS, etc.
16
- * Interactive mode prompts for all variables including optional ones.
17
- *
18
- * @example
19
- * ```ts
20
- * const envVars = await promptEnvVariables('default', ['mongo', 'kafka'], 'localhost');
21
- * // Prompts only for critical variables
22
- * ```
23
38
  */
24
- export declare function promptEnvVariables(mode: 'default' | 'interactive', infraServices: string[]): Promise<Map<string, string>>;
39
+ export declare function promptEnvVariables(mode: 'default' | 'interactive', infraServices: string[], basePath?: string, fullMode?: boolean): Promise<Map<string, string>>;
25
40
  /**
26
41
  * Generate .env file from variables
27
42
  */
@@ -1 +1 @@
1
- {"version":3,"file":"env-config.d.ts","sourceRoot":"","sources":["../src/env-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CA+F7D;AA0CD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,kBAAkB,CACpC,IAAI,EAAE,SAAS,GAAG,aAAa,EAC/B,aAAa,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAmF9B;AAkBD;;GAEG;AACH,wBAAsB,eAAe,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;GAEG;AACH,wBAAsB,eAAe,CACjC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,IAAI,CAAC,CAgBf"}
1
+ {"version":3,"file":"env-config.d.ts","sourceRoot":"","sources":["../src/env-config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAEhE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAoB7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,YAAY,GAAE,MAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAc9F;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAsG7D;AA0CD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACpC,IAAI,EAAE,SAAS,GAAG,aAAa,EAC/B,aAAa,EAAE,MAAM,EAAE,EACvB,QAAQ,GAAE,MAA0B,EACpC,QAAQ,GAAE,OAAe,GAC1B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAkJ9B;AAkBD;;GAEG;AACH,wBAAsB,eAAe,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;GAEG;AACH,wBAAsB,eAAe,CACjC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -1,102 +1,178 @@
1
- import inquirer from 'inquirer';
2
1
  import { writeFile, appendFile, logInfo, logSuccess } from './utils.js';
2
+ import { text, password } from '@clack/prompts';
3
+ import { handleCancel } from './ui.js';
3
4
  import path from 'path';
5
+ import crypto from 'crypto';
4
6
  import { CRITICAL_ENV_KEYS } from './config/constants.js';
7
+ export const DEFAULT_BASE_PATH = '';
8
+ /**
9
+ * Generate a secure random string for credentials
10
+ */
11
+ export function generateSecureRandom(length = 32) {
12
+ return crypto.randomBytes(length).toString('base64').slice(0, length);
13
+ }
14
+ /**
15
+ * Generate default value for a critical environment variable
16
+ */
17
+ export function generateDefaultValue(key) {
18
+ if (key === 'NS_API_KEY') {
19
+ return `sk_${generateSecureRandom(48)}`;
20
+ }
21
+ if (key === 'AUTH_SECRET') {
22
+ return generateSecureRandom(64);
23
+ }
24
+ if (key === 'ADMIN_PASSWORD') {
25
+ return `Admin${generateSecureRandom(16)}`;
26
+ }
27
+ return '';
28
+ }
29
+ /**
30
+ * Validate BASE_PATH value.
31
+ * Accepts:
32
+ * - Empty value for root path
33
+ * - Slash-prefixed lowercase segments (e.g. /dashboard, /admin/v1)
34
+ */
35
+ export function validateBasePath(input) {
36
+ const value = input.trim();
37
+ if (!value) {
38
+ return true;
39
+ }
40
+ if (!value.startsWith('/')) {
41
+ return 'Base path must start with / (example: /dashboard)';
42
+ }
43
+ if (value.endsWith('/')) {
44
+ return 'Base path must not end with /';
45
+ }
46
+ if (!/^\/[a-z0-9-]+(?:\/[a-z0-9-]+)*$/.test(value)) {
47
+ return 'Use lowercase letters, numbers, hyphens, and "/" separators only';
48
+ }
49
+ return true;
50
+ }
51
+ /**
52
+ * Normalize BASE_PATH for consistent downstream use.
53
+ */
54
+ export function normalizeBasePath(input) {
55
+ return input.trim();
56
+ }
57
+ /**
58
+ * Prompt BASE_PATH once at the beginning of onboarding.
59
+ */
60
+ export async function promptBasePath(defaultValue = DEFAULT_BASE_PATH) {
61
+ const result = await text({
62
+ message: 'BASE_PATH for dashboard (leave empty for root, example: /dashboard):',
63
+ placeholder: defaultValue || 'leave empty for root',
64
+ defaultValue,
65
+ validate: (value) => {
66
+ const v = validateBasePath(value ?? '');
67
+ return v === true ? undefined : v;
68
+ },
69
+ withGuide: true,
70
+ });
71
+ handleCancel(result);
72
+ return normalizeBasePath(result);
73
+ }
5
74
  /**
6
75
  * Load and parse .env.example from embedded template
7
76
  */
8
77
  export async function loadEnvExample() {
9
78
  // Embedded .env template - always available regardless of installation
10
- const envTemplate = `
11
- NODE_ENV=production
12
- # ============================================
13
- # API SERVER
14
- # ============================================
15
- NS_API_KEY=
16
- PORT=3000
17
- MAX_BATCH_REQ_LIMIT=1000
18
-
19
- # ============================================
20
- # DATABASE
21
- # ============================================
22
- MONGO_URI=
23
-
24
- # ============================================
25
- # KAFKA
26
- # ============================================
27
- BROKERS=
28
-
29
- # Kafka Topic Partitions (Core Topics)
30
- DELAYED_PARTITION=1
31
- NOTIFICATION_STATUS_PARTITION=1
32
-
33
- # ============================================
34
- # REDIS
35
- # ============================================
36
- REDIS_URL=
37
-
38
- # ============================================
39
- # PLUGIN SYSTEM
40
- # ============================================
41
- SIMPLENS_CONFIG_PATH=./simplens.config.yaml
42
- PROCESSOR_CHANNEL=all
43
-
44
- # ============================================
45
- # BACKGROUND WORKER
46
- # ============================================
47
- OUTBOX_POLL_INTERVAL_MS=5000
48
- OUTBOX_CLEANUP_INTERVAL_MS=60000
49
- OUTBOX_BATCH_SIZE=100
50
- OUTBOX_RETENTION_MS=300000
51
- OUTBOX_CLAIM_TIMEOUT_MS=30000
52
-
53
- # ============================================
54
- # RETRY & IDEMPOTENCY
55
- # ============================================
56
- IDEMPOTENCY_TTL_SECONDS=86400
57
- MAX_RETRY_COUNT=5
58
- PROCESSING_TTL_SECONDS=120
59
-
60
- # ============================================
61
- # DELAYED NOTIFICATIONS
62
- # ============================================
63
- DELAYED_POLL_INTERVAL_MS=1000
64
- DELAYED_BATCH_SIZE=10
65
- MAX_POLLER_RETRIES=3
66
-
67
- # ============================================
68
- # RECOVERY SERVICE
69
- # ============================================
70
- RECOVERY_POLL_INTERVAL_MS=60000
71
- PROCESSING_STUCK_THRESHOLD_MS=300000
72
- PENDING_STUCK_THRESHOLD_MS=300000
73
- RECOVERY_BATCH_SIZE=50
74
- RECOVERY_CLAIM_TIMEOUT_MS=60000
75
-
76
- # ============================================
77
- # CLEANUP
78
- # ============================================
79
- CLEANUP_RESOLVED_ALERTS_RETENTION_MS=86400000
80
- CLEANUP_PROCESSED_STATUS_OUTBOX_RETENTION_MS=86400000
81
-
82
- # ============================================
83
- # LOGGING
84
- # ============================================
85
- LOKI_URL=
86
- LOG_LEVEL=info
87
- LOG_TO_FILE=true
88
-
89
- # ============================================
90
- # ADMIN DASHBOARD
91
- # ============================================
92
- AUTH_SECRET=
93
- ADMIN_USERNAME=admin
94
- ADMIN_PASSWORD=
95
- AUTH_TRUST_HOST=true
96
- API_BASE_URL=http://api:3000
97
- WEBHOOK_HOST=dashboard
98
- WEBHOOK_PORT=3002
99
- DASHBOARD_PORT=3002
79
+ const envTemplate = `
80
+ NODE_ENV=production
81
+ # ============================================
82
+ # API SERVER
83
+ # ============================================
84
+ NS_API_KEY=
85
+ PORT=3000
86
+ MAX_BATCH_REQ_LIMIT=1000
87
+
88
+ # ============================================
89
+ # DATABASE
90
+ # ============================================
91
+ MONGO_URI=
92
+
93
+ # ============================================
94
+ # KAFKA
95
+ # ============================================
96
+ BROKERS=
97
+
98
+ # Kafka Topic Partitions (Core Topics)
99
+ DELAYED_PARTITION=1
100
+ NOTIFICATION_STATUS_PARTITION=1
101
+
102
+ # ============================================
103
+ # REDIS
104
+ # ============================================
105
+ REDIS_URL=
106
+
107
+ # ============================================
108
+ # PLUGIN SYSTEM
109
+ # ============================================
110
+ SIMPLENS_CONFIG_PATH=./simplens.config.yaml
111
+ PROCESSOR_CHANNEL=all
112
+
113
+ # ============================================
114
+ # BACKGROUND WORKER
115
+ # ============================================
116
+ OUTBOX_POLL_INTERVAL_MS=5000
117
+ OUTBOX_CLEANUP_INTERVAL_MS=60000
118
+ OUTBOX_BATCH_SIZE=100
119
+ OUTBOX_RETENTION_MS=300000
120
+ OUTBOX_CLAIM_TIMEOUT_MS=30000
121
+
122
+ # ============================================
123
+ # RETRY & IDEMPOTENCY
124
+ # ============================================
125
+ IDEMPOTENCY_TTL_SECONDS=86400
126
+ MAX_RETRY_COUNT=5
127
+ PROCESSING_TTL_SECONDS=120
128
+
129
+ # ============================================
130
+ # DELAYED NOTIFICATIONS
131
+ # ============================================
132
+ DELAYED_POLL_INTERVAL_MS=1000
133
+ DELAYED_BATCH_SIZE=10
134
+ MAX_POLLER_RETRIES=3
135
+
136
+ # ============================================
137
+ # RECOVERY SERVICE
138
+ # ============================================
139
+ RECOVERY_POLL_INTERVAL_MS=60000
140
+ PROCESSING_STUCK_THRESHOLD_MS=300000
141
+ PENDING_STUCK_THRESHOLD_MS=300000
142
+ RECOVERY_BATCH_SIZE=50
143
+ RECOVERY_CLAIM_TIMEOUT_MS=60000
144
+
145
+ # ============================================
146
+ # CLEANUP
147
+ # ============================================
148
+ CLEANUP_RESOLVED_ALERTS_RETENTION_MS=86400000
149
+ CLEANUP_PROCESSED_STATUS_OUTBOX_RETENTION_MS=86400000
150
+
151
+ # ============================================
152
+ # LOGGING
153
+ # ============================================
154
+ LOKI_URL=
155
+ LOG_LEVEL=info
156
+ LOG_TO_FILE=true
157
+
158
+ # ============================================
159
+ # DOCKER IMAGE VERSIONS
160
+ # ============================================
161
+ CORE_VERSION=latest
162
+ DASHBOARD_VERSION=latest
163
+
164
+ # ============================================
165
+ # ADMIN DASHBOARD
166
+ # ============================================
167
+ AUTH_SECRET=
168
+ ADMIN_USERNAME=admin
169
+ ADMIN_PASSWORD=
170
+ AUTH_TRUST_HOST=true
171
+ API_BASE_URL=http://api:3000
172
+ WEBHOOK_HOST=dashboard
173
+ WEBHOOK_PORT=3002
174
+ BASE_PATH=
175
+ DASHBOARD_PORT=3002
100
176
  `;
101
177
  return parseEnvContent(envTemplate);
102
178
  }
@@ -139,23 +215,17 @@ function parseEnvContent(content) {
139
215
  *
140
216
  * @param mode - 'default' prompts only for critical vars, 'interactive' prompts for all
141
217
  * @param infraServices - List of selected infrastructure service IDs
142
- * @param infraHost - Host for infrastructure services
218
+ * @param basePath - BASE_PATH value already collected
219
+ * @param fullMode - If true, auto-generate critical values without prompting
143
220
  * @returns Map of environment variable keys to values
144
- *
145
- * @remarks
146
- * Critical variables (always prompted): NS_API_KEY, MONGO_URI, BROKERS, etc.
147
- * Interactive mode prompts for all variables including optional ones.
148
- *
149
- * @example
150
- * ```ts
151
- * const envVars = await promptEnvVariables('default', ['mongo', 'kafka'], 'localhost');
152
- * // Prompts only for critical variables
153
- * ```
154
221
  */
155
- export async function promptEnvVariables(mode, infraServices) {
222
+ export async function promptEnvVariables(mode, infraServices, basePath = DEFAULT_BASE_PATH, fullMode = false) {
156
223
  logInfo('Configuring environment variables...');
157
224
  const envVars = await loadEnvExample();
158
225
  const result = new Map();
226
+ const normalizedBasePath = normalizeBasePath(basePath);
227
+ const basePathLabel = normalizedBasePath || '(root)';
228
+ logInfo(`BASE_PATH selected: ${basePathLabel}`);
159
229
  // Auto-fill infra connection URLs based on selected services using Docker service names
160
230
  const autoInfraUrls = {
161
231
  MONGO_URI: infraServices.includes('mongo')
@@ -179,6 +249,11 @@ export async function promptEnvVariables(mode, infraServices) {
179
249
  result.set(envVar.key, autoInfraUrls[envVar.key]);
180
250
  continue;
181
251
  }
252
+ // BASE_PATH is collected upfront in onboarding flow
253
+ if (envVar.key === 'BASE_PATH') {
254
+ result.set(envVar.key, normalizedBasePath);
255
+ continue;
256
+ }
182
257
  // Use default value if available
183
258
  if (envVar.value && !CRITICAL_ENV_KEYS.includes(envVar.key)) {
184
259
  result.set(envVar.key, envVar.value);
@@ -186,21 +261,48 @@ export async function promptEnvVariables(mode, infraServices) {
186
261
  }
187
262
  // Prompt for critical values (only if not auto-filled)
188
263
  if (CRITICAL_ENV_KEYS.includes(envVar.key)) {
189
- const answer = await inquirer.prompt([
190
- {
191
- type: envVar.key.includes('PASSWORD') ? 'password' : 'input',
192
- name: 'value',
193
- message: `${envVar.key}${envVar.description ? ` (${envVar.description})` : ''}:`,
194
- default: getSuggestedValue(envVar.key),
195
- validate: (input) => {
196
- if (!input && envVar.required) {
197
- return `${envVar.key} is required`;
198
- }
199
- return true;
200
- },
201
- },
202
- ]);
203
- result.set(envVar.key, answer.value);
264
+ if (fullMode) {
265
+ // In full mode, auto-generate critical values
266
+ const defaultValue = generateDefaultValue(envVar.key);
267
+ if (defaultValue) {
268
+ result.set(envVar.key, defaultValue);
269
+ }
270
+ }
271
+ else {
272
+ // Show changelog info for version variables
273
+ if (envVar.key === 'CORE_VERSION' || envVar.key === 'DASHBOARD_VERSION') {
274
+ logInfo('ℹ️ Visit https://simplens.in/changelog for version information');
275
+ }
276
+ const promptMessage = `${envVar.key}${envVar.description ? ` (${envVar.description})` : ''}:`;
277
+ const isPasswordField = envVar.key.includes('PASSWORD');
278
+ let answer;
279
+ if (isPasswordField) {
280
+ answer = await password({
281
+ message: promptMessage,
282
+ validate: (input) => {
283
+ if (!input && envVar.required) {
284
+ return `${envVar.key} is required`;
285
+ }
286
+ return undefined;
287
+ },
288
+ });
289
+ }
290
+ else {
291
+ answer = await text({
292
+ message: promptMessage,
293
+ placeholder: getSuggestedValue(envVar.key) || undefined,
294
+ defaultValue: getSuggestedValue(envVar.key) || undefined,
295
+ validate: (input) => {
296
+ if (!input && envVar.required) {
297
+ return `${envVar.key} is required`;
298
+ }
299
+ return undefined;
300
+ },
301
+ });
302
+ }
303
+ handleCancel(answer);
304
+ result.set(envVar.key, answer);
305
+ }
204
306
  }
205
307
  }
206
308
  }
@@ -209,21 +311,44 @@ export async function promptEnvVariables(mode, infraServices) {
209
311
  logInfo('Interactive mode: You will be prompted for each environment variable.');
210
312
  for (const envVar of envVars) {
211
313
  const defaultValue = autoInfraUrls[envVar.key] || envVar.value || getSuggestedValue(envVar.key);
212
- const answer = await inquirer.prompt([
213
- {
214
- type: envVar.key.includes('PASSWORD') ? 'password' : 'input',
215
- name: 'value',
216
- message: `${envVar.key}${envVar.description ? ` (${envVar.description})` : ''}:`,
217
- default: defaultValue,
314
+ // BASE_PATH is collected upfront in onboarding flow
315
+ if (envVar.key === 'BASE_PATH') {
316
+ result.set(envVar.key, normalizedBasePath);
317
+ continue;
318
+ }
319
+ // Show changelog info for version variables
320
+ if (envVar.key === 'CORE_VERSION' || envVar.key === 'DASHBOARD_VERSION') {
321
+ logInfo('ℹ️ Visit https://simplens.in/changelog for version information');
322
+ }
323
+ const promptMessage = `${envVar.key}${envVar.description ? ` (${envVar.description})` : ''}:`;
324
+ const isPasswordField = envVar.key.includes('PASSWORD');
325
+ let answer;
326
+ if (isPasswordField) {
327
+ answer = await password({
328
+ message: promptMessage,
218
329
  validate: (input) => {
219
330
  if (!input && envVar.required) {
220
331
  return `${envVar.key} is required`;
221
332
  }
222
- return true;
333
+ return undefined;
223
334
  },
224
- },
225
- ]);
226
- result.set(envVar.key, answer.value);
335
+ });
336
+ }
337
+ else {
338
+ answer = await text({
339
+ message: promptMessage,
340
+ placeholder: defaultValue || undefined,
341
+ defaultValue: defaultValue || undefined,
342
+ validate: (input) => {
343
+ if (!input && envVar.required) {
344
+ return `${envVar.key} is required`;
345
+ }
346
+ return undefined;
347
+ },
348
+ });
349
+ }
350
+ handleCancel(answer);
351
+ result.set(envVar.key, answer);
227
352
  }
228
353
  }
229
354
  logSuccess('Environment variables configured');
@@ -1 +1 @@
1
- {"version":3,"file":"env-config.js","sourceRoot":"","sources":["../src/env-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env-config.js","sourceRoot":"","sources":["../src/env-config.ts"],"names":[],"mappings":"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"}