@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.
- package/README.md +331 -214
- package/dist/__tests__/env-config.test.d.ts +2 -0
- package/dist/__tests__/env-config.test.d.ts.map +1 -0
- package/dist/__tests__/env-config.test.js +23 -0
- package/dist/__tests__/env-config.test.js.map +1 -0
- package/dist/__tests__/infra-prompts.test.d.ts +2 -0
- package/dist/__tests__/infra-prompts.test.d.ts.map +1 -0
- package/dist/__tests__/infra-prompts.test.js +43 -0
- package/dist/__tests__/infra-prompts.test.js.map +1 -0
- package/dist/__tests__/infra.test.d.ts +2 -0
- package/dist/__tests__/infra.test.d.ts.map +1 -0
- package/dist/__tests__/infra.test.js +14 -0
- package/dist/__tests__/infra.test.js.map +1 -0
- package/dist/__tests__/nginx.test.d.ts +2 -0
- package/dist/__tests__/nginx.test.d.ts.map +1 -0
- package/dist/__tests__/nginx.test.js +16 -0
- package/dist/__tests__/nginx.test.js.map +1 -0
- package/dist/env-config.d.ts +27 -12
- package/dist/env-config.d.ts.map +1 -1
- package/dist/env-config.js +258 -141
- package/dist/env-config.js.map +1 -1
- package/dist/index.js +341 -71
- package/dist/index.js.map +1 -1
- package/dist/infra.d.ts +17 -14
- package/dist/infra.d.ts.map +1 -1
- package/dist/infra.js +265 -176
- package/dist/infra.js.map +1 -1
- package/dist/plugins.d.ts +5 -10
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +75 -44
- package/dist/plugins.js.map +1 -1
- package/dist/services.d.ts +1 -23
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +47 -62
- package/dist/services.js.map +1 -1
- package/dist/templates.d.ts +3 -2
- package/dist/templates.d.ts.map +1 -1
- package/dist/templates.js +203 -198
- package/dist/templates.js.map +1 -1
- package/dist/types/domain.d.ts +2 -0
- package/dist/types/domain.d.ts.map +1 -1
- package/dist/ui.d.ts +45 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +93 -0
- package/dist/ui.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +32 -7
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils.d.ts +8 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +66 -2
- package/dist/utils.js.map +1 -1
- package/dist/validators.d.ts +1 -52
- package/dist/validators.d.ts.map +1 -1
- package/dist/validators.js +10 -57
- package/dist/validators.js.map +1 -1
- package/package.json +3 -5
- package/src/__tests__/env-config.test.ts +28 -0
- package/src/__tests__/errors.test.ts +187 -187
- package/src/__tests__/infra-prompts.test.ts +54 -0
- package/src/__tests__/infra.test.ts +15 -0
- package/src/__tests__/utils.test.ts +142 -142
- package/src/__tests__/validators.test.ts +195 -195
- package/src/config/constants.ts +86 -86
- package/src/config/index.ts +1 -1
- package/src/env-config.ts +455 -320
- package/src/index.ts +534 -203
- package/src/infra.ts +404 -300
- package/src/plugins.ts +221 -190
- package/src/services.ts +175 -190
- package/src/templates.ts +209 -203
- package/src/types/domain.ts +129 -127
- package/src/types/errors.ts +173 -173
- package/src/types/index.ts +2 -2
- package/src/ui.ts +91 -0
- package/src/utils/index.ts +1 -1
- package/src/utils/logger.ts +144 -118
- package/src/utils.ts +183 -105
- package/src/validators.ts +145 -192
- package/tsconfig.json +18 -18
- package/vitest.config.ts +22 -20
|
@@ -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 @@
|
|
|
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"}
|
package/dist/env-config.d.ts
CHANGED
|
@@ -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
|
|
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[],
|
|
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
|
*/
|
package/dist/env-config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-config.d.ts","sourceRoot":"","sources":["../src/env-config.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/env-config.js
CHANGED
|
@@ -1,110 +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
|
-
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
#
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
#
|
|
34
|
-
#
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
# ============================================
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
#
|
|
54
|
-
#
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
#
|
|
62
|
-
#
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
#
|
|
69
|
-
#
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
#
|
|
77
|
-
#
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
# ============================================
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
#
|
|
91
|
-
#
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
# ============================================
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
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
|
|
108
176
|
`;
|
|
109
177
|
return parseEnvContent(envTemplate);
|
|
110
178
|
}
|
|
@@ -147,36 +215,30 @@ function parseEnvContent(content) {
|
|
|
147
215
|
*
|
|
148
216
|
* @param mode - 'default' prompts only for critical vars, 'interactive' prompts for all
|
|
149
217
|
* @param infraServices - List of selected infrastructure service IDs
|
|
150
|
-
* @param
|
|
218
|
+
* @param basePath - BASE_PATH value already collected
|
|
219
|
+
* @param fullMode - If true, auto-generate critical values without prompting
|
|
151
220
|
* @returns Map of environment variable keys to values
|
|
152
|
-
*
|
|
153
|
-
* @remarks
|
|
154
|
-
* Critical variables (always prompted): NS_API_KEY, MONGO_URI, BROKERS, etc.
|
|
155
|
-
* Interactive mode prompts for all variables including optional ones.
|
|
156
|
-
*
|
|
157
|
-
* @example
|
|
158
|
-
* ```ts
|
|
159
|
-
* const envVars = await promptEnvVariables('default', ['mongo', 'kafka'], 'localhost');
|
|
160
|
-
* // Prompts only for critical variables
|
|
161
|
-
* ```
|
|
162
221
|
*/
|
|
163
|
-
export async function promptEnvVariables(mode, infraServices,
|
|
222
|
+
export async function promptEnvVariables(mode, infraServices, basePath = DEFAULT_BASE_PATH, fullMode = false) {
|
|
164
223
|
logInfo('Configuring environment variables...');
|
|
165
224
|
const envVars = await loadEnvExample();
|
|
166
225
|
const result = new Map();
|
|
167
|
-
|
|
226
|
+
const normalizedBasePath = normalizeBasePath(basePath);
|
|
227
|
+
const basePathLabel = normalizedBasePath || '(root)';
|
|
228
|
+
logInfo(`BASE_PATH selected: ${basePathLabel}`);
|
|
229
|
+
// Auto-fill infra connection URLs based on selected services using Docker service names
|
|
168
230
|
const autoInfraUrls = {
|
|
169
231
|
MONGO_URI: infraServices.includes('mongo')
|
|
170
|
-
?
|
|
232
|
+
? `mongodb://mongo:27017/simplens?replicaSet=rs0`
|
|
171
233
|
: '',
|
|
172
234
|
BROKERS: infraServices.includes('kafka')
|
|
173
|
-
?
|
|
235
|
+
? 'kafka:9093'
|
|
174
236
|
: '',
|
|
175
237
|
REDIS_URL: infraServices.includes('redis')
|
|
176
|
-
?
|
|
238
|
+
? 'redis://redis:6379'
|
|
177
239
|
: '',
|
|
178
240
|
LOKI_URL: infraServices.includes('loki')
|
|
179
|
-
?
|
|
241
|
+
? 'http://loki:3100'
|
|
180
242
|
: '',
|
|
181
243
|
};
|
|
182
244
|
if (mode === 'default') {
|
|
@@ -187,6 +249,11 @@ export async function promptEnvVariables(mode, infraServices, infraHost) {
|
|
|
187
249
|
result.set(envVar.key, autoInfraUrls[envVar.key]);
|
|
188
250
|
continue;
|
|
189
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
|
+
}
|
|
190
257
|
// Use default value if available
|
|
191
258
|
if (envVar.value && !CRITICAL_ENV_KEYS.includes(envVar.key)) {
|
|
192
259
|
result.set(envVar.key, envVar.value);
|
|
@@ -194,21 +261,48 @@ export async function promptEnvVariables(mode, infraServices, infraHost) {
|
|
|
194
261
|
}
|
|
195
262
|
// Prompt for critical values (only if not auto-filled)
|
|
196
263
|
if (CRITICAL_ENV_KEYS.includes(envVar.key)) {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
|
|
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
|
+
}
|
|
212
306
|
}
|
|
213
307
|
}
|
|
214
308
|
}
|
|
@@ -217,21 +311,44 @@ export async function promptEnvVariables(mode, infraServices, infraHost) {
|
|
|
217
311
|
logInfo('Interactive mode: You will be prompted for each environment variable.');
|
|
218
312
|
for (const envVar of envVars) {
|
|
219
313
|
const defaultValue = autoInfraUrls[envVar.key] || envVar.value || getSuggestedValue(envVar.key);
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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,
|
|
226
329
|
validate: (input) => {
|
|
227
330
|
if (!input && envVar.required) {
|
|
228
331
|
return `${envVar.key} is required`;
|
|
229
332
|
}
|
|
230
|
-
return
|
|
333
|
+
return undefined;
|
|
231
334
|
},
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
|
|
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);
|
|
235
352
|
}
|
|
236
353
|
}
|
|
237
354
|
logSuccess('Environment variables configured');
|
package/dist/env-config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-config.js","sourceRoot":"","sources":["../src/env-config.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"env-config.js","sourceRoot":"","sources":["../src/env-config.ts"],"names":[],"mappings":"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"}
|