@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.
- 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 +253 -128
- package/dist/env-config.js.map +1 -1
- package/dist/index.js +340 -69
- package/dist/index.js.map +1 -1
- package/dist/infra.d.ts +19 -8
- package/dist/infra.d.ts.map +1 -1
- package/dist/infra.js +267 -128
- 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 +2 -1
- package/dist/templates.d.ts.map +1 -1
- package/dist/templates.js +203 -191
- 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 -311
- package/src/index.ts +534 -202
- package/src/infra.ts +404 -245
- package/src/plugins.ts +221 -190
- package/src/services.ts +175 -190
- package/src/templates.ts +209 -196
- 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 -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 @@
|
|
|
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[]): 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
|
*/
|
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,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
|
-
#
|
|
91
|
-
# ============================================
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|
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
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
|
|
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
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
|
333
|
+
return undefined;
|
|
223
334
|
},
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
|
|
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');
|
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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"}
|