@simplens/onboard 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +331 -214
  2. package/dist/__tests__/env-config.test.d.ts +2 -0
  3. package/dist/__tests__/env-config.test.d.ts.map +1 -0
  4. package/dist/__tests__/env-config.test.js +23 -0
  5. package/dist/__tests__/env-config.test.js.map +1 -0
  6. package/dist/__tests__/infra-prompts.test.d.ts +2 -0
  7. package/dist/__tests__/infra-prompts.test.d.ts.map +1 -0
  8. package/dist/__tests__/infra-prompts.test.js +43 -0
  9. package/dist/__tests__/infra-prompts.test.js.map +1 -0
  10. package/dist/__tests__/infra.test.d.ts +2 -0
  11. package/dist/__tests__/infra.test.d.ts.map +1 -0
  12. package/dist/__tests__/infra.test.js +14 -0
  13. package/dist/__tests__/infra.test.js.map +1 -0
  14. package/dist/__tests__/nginx.test.d.ts +2 -0
  15. package/dist/__tests__/nginx.test.d.ts.map +1 -0
  16. package/dist/__tests__/nginx.test.js +16 -0
  17. package/dist/__tests__/nginx.test.js.map +1 -0
  18. package/dist/env-config.d.ts +27 -12
  19. package/dist/env-config.d.ts.map +1 -1
  20. package/dist/env-config.js +258 -141
  21. package/dist/env-config.js.map +1 -1
  22. package/dist/index.js +341 -71
  23. package/dist/index.js.map +1 -1
  24. package/dist/infra.d.ts +17 -14
  25. package/dist/infra.d.ts.map +1 -1
  26. package/dist/infra.js +265 -176
  27. package/dist/infra.js.map +1 -1
  28. package/dist/plugins.d.ts +5 -10
  29. package/dist/plugins.d.ts.map +1 -1
  30. package/dist/plugins.js +75 -44
  31. package/dist/plugins.js.map +1 -1
  32. package/dist/services.d.ts +1 -23
  33. package/dist/services.d.ts.map +1 -1
  34. package/dist/services.js +47 -62
  35. package/dist/services.js.map +1 -1
  36. package/dist/templates.d.ts +3 -2
  37. package/dist/templates.d.ts.map +1 -1
  38. package/dist/templates.js +203 -198
  39. package/dist/templates.js.map +1 -1
  40. package/dist/types/domain.d.ts +2 -0
  41. package/dist/types/domain.d.ts.map +1 -1
  42. package/dist/ui.d.ts +45 -0
  43. package/dist/ui.d.ts.map +1 -0
  44. package/dist/ui.js +93 -0
  45. package/dist/ui.js.map +1 -0
  46. package/dist/utils/logger.d.ts +1 -0
  47. package/dist/utils/logger.d.ts.map +1 -1
  48. package/dist/utils/logger.js +32 -7
  49. package/dist/utils/logger.js.map +1 -1
  50. package/dist/utils.d.ts +8 -0
  51. package/dist/utils.d.ts.map +1 -1
  52. package/dist/utils.js +66 -2
  53. package/dist/utils.js.map +1 -1
  54. package/dist/validators.d.ts +1 -52
  55. package/dist/validators.d.ts.map +1 -1
  56. package/dist/validators.js +10 -57
  57. package/dist/validators.js.map +1 -1
  58. package/package.json +3 -5
  59. package/src/__tests__/env-config.test.ts +28 -0
  60. package/src/__tests__/errors.test.ts +187 -187
  61. package/src/__tests__/infra-prompts.test.ts +54 -0
  62. package/src/__tests__/infra.test.ts +15 -0
  63. package/src/__tests__/utils.test.ts +142 -142
  64. package/src/__tests__/validators.test.ts +195 -195
  65. package/src/config/constants.ts +86 -86
  66. package/src/config/index.ts +1 -1
  67. package/src/env-config.ts +455 -320
  68. package/src/index.ts +534 -203
  69. package/src/infra.ts +404 -300
  70. package/src/plugins.ts +221 -190
  71. package/src/services.ts +175 -190
  72. package/src/templates.ts +209 -203
  73. package/src/types/domain.ts +129 -127
  74. package/src/types/errors.ts +173 -173
  75. package/src/types/index.ts +2 -2
  76. package/src/ui.ts +91 -0
  77. package/src/utils/index.ts +1 -1
  78. package/src/utils/logger.ts +144 -118
  79. package/src/utils.ts +183 -105
  80. package/src/validators.ts +145 -192
  81. package/tsconfig.json +18 -18
  82. package/vitest.config.ts +22 -20
@@ -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[], infraHost: 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,CAuG7D;AA0CD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,kBAAkB,CACpC,IAAI,EAAE,SAAS,GAAG,aAAa,EAC/B,aAAa,EAAE,MAAM,EAAE,EACvB,SAAS,EAAE,MAAM,GAClB,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,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
- # INFRASTRUCTURE HOST CONFIGURATION
13
- # ============================================
14
- INFRA_HOST=host.docker.internal
15
-
16
- # ============================================
17
- # CONNECTION URLS
18
- # ============================================
19
- NODE_ENV=production
20
- # ============================================
21
- # API SERVER
22
- # ============================================
23
- NS_API_KEY=
24
- PORT=3000
25
- MAX_BATCH_REQ_LIMIT=1000
26
-
27
- # ============================================
28
- # DATABASE
29
- # ============================================
30
- MONGO_URI=
31
-
32
- # ============================================
33
- # KAFKA
34
- # ============================================
35
- BROKERS=
36
-
37
- # Kafka Topic Partitions (Core Topics)
38
- DELAYED_PARTITION=1
39
- NOTIFICATION_STATUS_PARTITION=1
40
-
41
- # ============================================
42
- # REDIS
43
- # ============================================
44
- REDIS_URL=
45
-
46
- # ============================================
47
- # PLUGIN SYSTEM
48
- # ============================================
49
- SIMPLENS_CONFIG_PATH=./simplens.config.yaml
50
- PROCESSOR_CHANNEL=all
51
-
52
- # ============================================
53
- # BACKGROUND WORKER
54
- # ============================================
55
- OUTBOX_POLL_INTERVAL_MS=5000
56
- OUTBOX_CLEANUP_INTERVAL_MS=60000
57
- OUTBOX_BATCH_SIZE=100
58
- OUTBOX_RETENTION_MS=300000
59
- OUTBOX_CLAIM_TIMEOUT_MS=30000
60
-
61
- # ============================================
62
- # RETRY & IDEMPOTENCY
63
- # ============================================
64
- IDEMPOTENCY_TTL_SECONDS=86400
65
- MAX_RETRY_COUNT=5
66
- PROCESSING_TTL_SECONDS=120
67
-
68
- # ============================================
69
- # DELAYED NOTIFICATIONS
70
- # ============================================
71
- DELAYED_POLL_INTERVAL_MS=1000
72
- DELAYED_BATCH_SIZE=10
73
- MAX_POLLER_RETRIES=3
74
-
75
- # ============================================
76
- # RECOVERY SERVICE
77
- # ============================================
78
- RECOVERY_POLL_INTERVAL_MS=60000
79
- PROCESSING_STUCK_THRESHOLD_MS=300000
80
- PENDING_STUCK_THRESHOLD_MS=300000
81
- RECOVERY_BATCH_SIZE=50
82
- RECOVERY_CLAIM_TIMEOUT_MS=60000
83
-
84
- # ============================================
85
- # CLEANUP
86
- # ============================================
87
- CLEANUP_RESOLVED_ALERTS_RETENTION_MS=86400000
88
- CLEANUP_PROCESSED_STATUS_OUTBOX_RETENTION_MS=86400000
89
-
90
- # ============================================
91
- # LOGGING
92
- # ============================================
93
- LOKI_URL=
94
- LOG_LEVEL=info
95
- LOG_TO_FILE=true
96
-
97
- # ============================================
98
- # ADMIN DASHBOARD
99
- # ============================================
100
- AUTH_SECRET=
101
- ADMIN_USERNAME=admin
102
- ADMIN_PASSWORD=
103
- AUTH_TRUST_HOST=true
104
- API_BASE_URL=http://api:3000
105
- WEBHOOK_HOST=dashboard
106
- WEBHOOK_PORT=3002
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 infraHost - Host for infrastructure services
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, infraHost) {
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
- // Auto-fill infra connection URLs based on selected services and host
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
- ? (infraHost === "host.docker.internal" ? `mongodb://mongo:27017/simplens?replicaSet=rs0` : `mongodb://${infraHost}:27017/simplens?replicaSet=rs0`)
232
+ ? `mongodb://mongo:27017/simplens?replicaSet=rs0`
171
233
  : '',
172
234
  BROKERS: infraServices.includes('kafka')
173
- ? (infraHost === "host.docker.internal" ? "kafka:9093" : `${infraHost}:9092`)
235
+ ? 'kafka:9093'
174
236
  : '',
175
237
  REDIS_URL: infraServices.includes('redis')
176
- ? (infraHost === "host.docker.internal" ? "redis://redis:6379" : `redis://${infraHost}:6379`)
238
+ ? 'redis://redis:6379'
177
239
  : '',
178
240
  LOKI_URL: infraServices.includes('loki')
179
- ? (infraHost === "host.docker.internal" ? "http://loki:3100" : `http://${infraHost}:3100`)
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
- const answer = await inquirer.prompt([
198
- {
199
- type: envVar.key.includes('PASSWORD') ? 'password' : 'input',
200
- name: 'value',
201
- message: `${envVar.key}${envVar.description ? ` (${envVar.description})` : ''}:`,
202
- default: getSuggestedValue(envVar.key),
203
- validate: (input) => {
204
- if (!input && envVar.required) {
205
- return `${envVar.key} is required`;
206
- }
207
- return true;
208
- },
209
- },
210
- ]);
211
- 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
+ }
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
- const answer = await inquirer.prompt([
221
- {
222
- type: envVar.key.includes('PASSWORD') ? 'password' : 'input',
223
- name: 'value',
224
- message: `${envVar.key}${envVar.description ? ` (${envVar.description})` : ''}:`,
225
- 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,
226
329
  validate: (input) => {
227
330
  if (!input && envVar.required) {
228
331
  return `${envVar.key} is required`;
229
332
  }
230
- return true;
333
+ return undefined;
231
334
  },
232
- },
233
- ]);
234
- 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);
235
352
  }
236
353
  }
237
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":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAc,MAAM,YAAY,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE;IACpD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC5C,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;QACvB,OAAO,MAAM,oBAAoB,CAAC,EAAE,CAAC,EAAE,CAAC;IAC5C,CAAC;IACD,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;QACxB,OAAO,oBAAoB,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;QAC3B,OAAO,QAAQ,oBAAoB,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9C,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE3B,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,mDAAmD,CAAC;IAC/D,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,+BAA+B,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,kEAAkE,CAAC;IAC9E,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC3C,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,eAAuB,iBAAiB;IACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;QACtB,OAAO,EAAE,sEAAsE;QAC/E,WAAW,EAAE,YAAY,IAAI,sBAAsB;QACnD,YAAY;QACZ,QAAQ,EAAE,CAAC,KAAyB,EAAE,EAAE;YACpC,MAAM,CAAC,GAAG,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,SAAS,EAAE,IAAI;KAClB,CAAC,CAAC;IAEH,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,OAAO,iBAAiB,CAAC,MAAgB,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAChC,uEAAuE;IACvE,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiGvB,CAAC;IAEE,OAAO,eAAe,CAAC,WAAW,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,OAAe;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,IAAI,cAAc,GAAG,EAAE,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,mCAAmC;QACnC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC9C,SAAS;QACb,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,cAAc,GAAG,EAAE,CAAC;YACpB,SAAS;QACb,CAAC;QAED,wBAAwB;QACxB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAChD,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;YAC7B,SAAS,CAAC,IAAI,CAAC;gBACX,GAAG;gBACH,KAAK,EAAE,KAAK,IAAI,EAAE;gBAClB,WAAW,EAAE,cAAc,IAAI,SAAS;gBACxC,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK;aACtD,CAAC,CAAC;YACH,cAAc,GAAG,EAAE,CAAC;QACxB,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACpC,IAA+B,EAC/B,aAAuB,EACvB,WAAmB,iBAAiB,EACpC,WAAoB,KAAK;IAEzB,OAAO,CAAC,sCAAsC,CAAC,CAAC;IAEhD,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,kBAAkB,IAAI,QAAQ,CAAC;IACrD,OAAO,CAAC,uBAAuB,aAAa,EAAE,CAAC,CAAC;IAEhD,wFAAwF;IACxF,MAAM,aAAa,GAA2B;QAC1C,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC;YACtC,CAAC,CAAC,+CAA+C;YACjD,CAAC,CAAC,EAAE;QACR,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC;YACpC,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,EAAE;QACR,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC;YACtC,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,EAAE;QACR,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;YACpC,CAAC,CAAC,kBAAkB;YACpB,CAAC,CAAC,EAAE;KACX,CAAC;IAEF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,gDAAgD;QAChD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC3B,6BAA6B;YAC7B,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAClD,SAAS;YACb,CAAC;YAED,oDAAoD;YACpD,IAAI,MAAM,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;gBAC3C,SAAS;YACb,CAAC;YAED,iCAAiC;YACjC,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrC,SAAS;YACb,CAAC;YAED,uDAAuD;YACvD,IAAI,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzC,IAAI,QAAQ,EAAE,CAAC;oBACX,8CAA8C;oBAC9C,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACtD,IAAI,YAAY,EAAE,CAAC;wBACf,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;oBACzC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,4CAA4C;oBAC5C,IAAI,MAAM,CAAC,GAAG,KAAK,cAAc,IAAI,MAAM,CAAC,GAAG,KAAK,mBAAmB,EAAE,CAAC;wBACtE,OAAO,CAAC,iEAAiE,CAAC,CAAC;oBAC/E,CAAC;oBAED,MAAM,aAAa,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;oBAC9F,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;oBAExD,IAAI,MAAuB,CAAC;oBAC5B,IAAI,eAAe,EAAE,CAAC;wBAClB,MAAM,GAAG,MAAM,QAAQ,CAAC;4BACpB,OAAO,EAAE,aAAa;4BACtB,QAAQ,EAAE,CAAC,KAAyB,EAAE,EAAE;gCACpC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oCAC5B,OAAO,GAAG,MAAM,CAAC,GAAG,cAAc,CAAC;gCACvC,CAAC;gCACD,OAAO,SAAS,CAAC;4BACrB,CAAC;yBACJ,CAAC,CAAC;oBACP,CAAC;yBAAM,CAAC;wBACJ,MAAM,GAAG,MAAM,IAAI,CAAC;4BAChB,OAAO,EAAE,aAAa;4BACtB,WAAW,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,SAAS;4BACvD,YAAY,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,SAAS;4BACxD,QAAQ,EAAE,CAAC,KAAyB,EAAE,EAAE;gCACpC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oCAC5B,OAAO,GAAG,MAAM,CAAC,GAAG,cAAc,CAAC;gCACvC,CAAC;gCACD,OAAO,SAAS,CAAC;4BACrB,CAAC;yBACJ,CAAC,CAAC;oBACP,CAAC;oBAED,YAAY,CAAC,MAAM,CAAC,CAAC;oBACrB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAgB,CAAC,CAAC;gBAC7C,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,0CAA0C;QAC1C,OAAO,CAAC,uEAAuE,CAAC,CAAC;QAEjF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEhG,oDAAoD;YACpD,IAAI,MAAM,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;gBAC3C,SAAS;YACb,CAAC;YAED,4CAA4C;YAC5C,IAAI,MAAM,CAAC,GAAG,KAAK,cAAc,IAAI,MAAM,CAAC,GAAG,KAAK,mBAAmB,EAAE,CAAC;gBACtE,OAAO,CAAC,iEAAiE,CAAC,CAAC;YAC/E,CAAC;YAED,MAAM,aAAa,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;YAC9F,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAExD,IAAI,MAAuB,CAAC;YAC5B,IAAI,eAAe,EAAE,CAAC;gBAClB,MAAM,GAAG,MAAM,QAAQ,CAAC;oBACpB,OAAO,EAAE,aAAa;oBACtB,QAAQ,EAAE,CAAC,KAAyB,EAAE,EAAE;wBACpC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;4BAC5B,OAAO,GAAG,MAAM,CAAC,GAAG,cAAc,CAAC;wBACvC,CAAC;wBACD,OAAO,SAAS,CAAC;oBACrB,CAAC;iBACJ,CAAC,CAAC;YACP,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,MAAM,IAAI,CAAC;oBAChB,OAAO,EAAE,aAAa;oBACtB,WAAW,EAAE,YAAY,IAAI,SAAS;oBACtC,YAAY,EAAE,YAAY,IAAI,SAAS;oBACvC,QAAQ,EAAE,CAAC,KAAyB,EAAE,EAAE;wBACpC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;4BAC5B,OAAO,GAAG,MAAM,CAAC,GAAG,cAAc,CAAC;wBACvC,CAAC;wBACD,OAAO,SAAS,CAAC;oBACrB,CAAC;iBACJ,CAAC,CAAC;YACP,CAAC;YAED,YAAY,CAAC,MAAM,CAAC,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAgB,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC;IAED,UAAU,CAAC,kCAAkC,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,GAAW;IAClC,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;QAChD,OAAO,uCAAuC,CAAC;IACnD,CAAC;IACD,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACrB,OAAO,YAAY,CAAC;IACxB,CAAC;IACD,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACjC,SAAiB,EACjB,OAA4B;IAE5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAE7C,IAAI,OAAO,GAAG,wCAAwC,CAAC;IACvD,OAAO,IAAI,sCAAsC,CAAC;IAElD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3C,OAAO,IAAI,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC;IACnC,CAAC;IAED,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,CAAC,qBAAqB,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACjC,SAAiB,EACjB,aAAkC;IAElC,uDAAuD;IACvD,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,8BAA8B,CAAC,CAAC;QACxC,OAAO;IACX,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAE7C,IAAI,OAAO,GAAG,0BAA0B,CAAC;IACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,OAAO,IAAI,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC;IACnC,CAAC;IAED,MAAM,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,kCAAkC,CAAC,CAAC;AACnD,CAAC"}