@simplens/onboard 1.0.0

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 (94) hide show
  1. package/README.md +214 -0
  2. package/dist/__tests__/errors.test.d.ts +2 -0
  3. package/dist/__tests__/errors.test.d.ts.map +1 -0
  4. package/dist/__tests__/errors.test.js +125 -0
  5. package/dist/__tests__/errors.test.js.map +1 -0
  6. package/dist/__tests__/utils.test.d.ts +2 -0
  7. package/dist/__tests__/utils.test.d.ts.map +1 -0
  8. package/dist/__tests__/utils.test.js +105 -0
  9. package/dist/__tests__/utils.test.js.map +1 -0
  10. package/dist/__tests__/validators.test.d.ts +2 -0
  11. package/dist/__tests__/validators.test.d.ts.map +1 -0
  12. package/dist/__tests__/validators.test.js +148 -0
  13. package/dist/__tests__/validators.test.js.map +1 -0
  14. package/dist/config/constants.d.ts +69 -0
  15. package/dist/config/constants.d.ts.map +1 -0
  16. package/dist/config/constants.js +79 -0
  17. package/dist/config/constants.js.map +1 -0
  18. package/dist/config/index.d.ts +2 -0
  19. package/dist/config/index.d.ts.map +1 -0
  20. package/dist/config/index.js +2 -0
  21. package/dist/config/index.js.map +1 -0
  22. package/dist/env-config.d.ts +33 -0
  23. package/dist/env-config.d.ts.map +1 -0
  24. package/dist/env-config.js +285 -0
  25. package/dist/env-config.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +153 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/infra.d.ts +31 -0
  31. package/dist/infra.d.ts.map +1 -0
  32. package/dist/infra.js +267 -0
  33. package/dist/infra.js.map +1 -0
  34. package/dist/plugins.d.ts +35 -0
  35. package/dist/plugins.d.ts.map +1 -0
  36. package/dist/plugins.js +164 -0
  37. package/dist/plugins.js.map +1 -0
  38. package/dist/services.d.ts +52 -0
  39. package/dist/services.d.ts.map +1 -0
  40. package/dist/services.js +158 -0
  41. package/dist/services.js.map +1 -0
  42. package/dist/templates.d.ts +3 -0
  43. package/dist/templates.d.ts.map +1 -0
  44. package/dist/templates.js +202 -0
  45. package/dist/templates.js.map +1 -0
  46. package/dist/types/domain.d.ts +119 -0
  47. package/dist/types/domain.d.ts.map +1 -0
  48. package/dist/types/domain.js +5 -0
  49. package/dist/types/domain.js.map +1 -0
  50. package/dist/types/errors.d.ts +69 -0
  51. package/dist/types/errors.d.ts.map +1 -0
  52. package/dist/types/errors.js +129 -0
  53. package/dist/types/errors.js.map +1 -0
  54. package/dist/types/index.d.ts +3 -0
  55. package/dist/types/index.d.ts.map +1 -0
  56. package/dist/types/index.js +3 -0
  57. package/dist/types/index.js.map +1 -0
  58. package/dist/utils/index.d.ts +2 -0
  59. package/dist/utils/index.d.ts.map +1 -0
  60. package/dist/utils/index.js +2 -0
  61. package/dist/utils/index.js.map +1 -0
  62. package/dist/utils/logger.d.ts +54 -0
  63. package/dist/utils/logger.d.ts.map +1 -0
  64. package/dist/utils/logger.js +92 -0
  65. package/dist/utils/logger.js.map +1 -0
  66. package/dist/utils.d.ts +32 -0
  67. package/dist/utils.d.ts.map +1 -0
  68. package/dist/utils.js +79 -0
  69. package/dist/utils.js.map +1 -0
  70. package/dist/validators.d.ts +93 -0
  71. package/dist/validators.d.ts.map +1 -0
  72. package/dist/validators.js +180 -0
  73. package/dist/validators.js.map +1 -0
  74. package/package.json +45 -0
  75. package/src/__tests__/errors.test.ts +187 -0
  76. package/src/__tests__/utils.test.ts +142 -0
  77. package/src/__tests__/validators.test.ts +195 -0
  78. package/src/config/constants.ts +86 -0
  79. package/src/config/index.ts +1 -0
  80. package/src/env-config.ts +320 -0
  81. package/src/index.ts +203 -0
  82. package/src/infra.ts +300 -0
  83. package/src/plugins.ts +190 -0
  84. package/src/services.ts +190 -0
  85. package/src/templates.ts +203 -0
  86. package/src/types/domain.ts +127 -0
  87. package/src/types/errors.ts +173 -0
  88. package/src/types/index.ts +2 -0
  89. package/src/utils/index.ts +1 -0
  90. package/src/utils/logger.ts +118 -0
  91. package/src/utils.ts +105 -0
  92. package/src/validators.ts +192 -0
  93. package/tsconfig.json +19 -0
  94. package/vitest.config.ts +20 -0
@@ -0,0 +1,158 @@
1
+ import inquirer from 'inquirer';
2
+ import { execa } from 'execa';
3
+ import ora from 'ora';
4
+ import { logInfo, logWarning } from './utils.js';
5
+ import chalk from 'chalk';
6
+ import { HEALTH_CHECK, getServiceURL } from './config/constants.js';
7
+ /**
8
+ * Prompts user whether to start the services immediately after setup.
9
+ *
10
+ * @returns `true` if user wants to start services, `false` otherwise
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * if (await promptStartServices()) {
15
+ * await startInfraServices(targetDir);
16
+ * }
17
+ * ```
18
+ */
19
+ export async function promptStartServices() {
20
+ const answer = await inquirer.prompt([
21
+ {
22
+ type: 'confirm',
23
+ name: 'start',
24
+ message: 'Do you want to start the services now?',
25
+ default: true,
26
+ },
27
+ ]);
28
+ return answer.start;
29
+ }
30
+ /**
31
+ * Starts infrastructure services using docker-compose.
32
+ * Runs `docker-compose -f docker-compose.infra.yaml up -d` in the target directory.
33
+ *
34
+ * @param targetDir - Directory containing docker-compose.infra.yaml
35
+ * @throws Error if docker-compose command fails
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * await startInfraServices('/opt/simplens');
40
+ * ```
41
+ */
42
+ export async function startInfraServices(targetDir) {
43
+ logInfo('Starting infrastructure services...');
44
+ const spinner = ora('Starting docker-compose.infra.yaml...').start();
45
+ try {
46
+ await execa('docker-compose', ['-f', 'docker-compose.infra.yaml', 'up', '-d'], { cwd: targetDir });
47
+ spinner.succeed('Infrastructure services started');
48
+ }
49
+ catch (error) {
50
+ spinner.fail('Failed to start infrastructure services');
51
+ throw error;
52
+ }
53
+ }
54
+ /**
55
+ * Waits for infrastructure services to become healthy.
56
+ * Polls Docker health checks for up to 60 seconds (30 retries × 2s).
57
+ *
58
+ * @param targetDir - Directory where services are running
59
+ *
60
+ * @remarks
61
+ * Checks for healthy containers running MongoDB or Redis.
62
+ * Configuration: 30 max retries, 2000ms delay between retries.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * await startInfraServices(targetDir);
67
+ * await waitForInfraHealth(targetDir); // Wait for services to be ready
68
+ * ```
69
+ */
70
+ export async function waitForInfraHealth(targetDir) {
71
+ logInfo('Waiting for infrastructure services to be healthy...');
72
+ const spinner = ora('Checking service health...').start();
73
+ // Wait for mongo, redis health checks
74
+ const maxRetries = HEALTH_CHECK.MAX_RETRIES;
75
+ const retryDelay = HEALTH_CHECK.RETRY_DELAY_MS;
76
+ for (let i = 0; i < maxRetries; i++) {
77
+ try {
78
+ // Check if containers are healthy
79
+ const { stdout } = await execa('docker', ['ps', '--filter', 'health=healthy', '--format', '{{.Names}}']);
80
+ const healthyContainers = stdout.split('\n').filter(Boolean);
81
+ // Check for critical services
82
+ const hasMongoOrRedis = healthyContainers.some(name => name.includes('mongo') || name.includes('redis'));
83
+ if (hasMongoOrRedis) {
84
+ spinner.succeed('Infrastructure services are healthy');
85
+ return;
86
+ }
87
+ spinner.text = `Waiting for services... (${i + 1}/${maxRetries})`;
88
+ await sleep(retryDelay);
89
+ }
90
+ catch (error) {
91
+ spinner.text = `Checking health... (${i + 1}/${maxRetries})`;
92
+ await sleep(retryDelay);
93
+ }
94
+ }
95
+ spinner.warn('Health check timed out, but services may still be starting');
96
+ logWarning('You may need to wait a bit longer for all services to be ready.');
97
+ }
98
+ /**
99
+ * Start application services
100
+ */
101
+ export async function startAppServices(targetDir) {
102
+ logInfo('Starting application services...');
103
+ const spinner = ora('Starting docker-compose.yaml...').start();
104
+ try {
105
+ await execa('docker-compose', ['up', '-d'], { cwd: targetDir });
106
+ spinner.succeed('Application services started');
107
+ }
108
+ catch (error) {
109
+ spinner.fail('Failed to start application services');
110
+ throw error;
111
+ }
112
+ }
113
+ /**
114
+ * Display service status and URLs
115
+ */
116
+ export async function displayServiceStatus() {
117
+ console.log('\n' + chalk.green('═'.repeat(60)));
118
+ console.log(chalk.green.bold(' ✅ Services Started Successfully!'));
119
+ console.log(chalk.green('═'.repeat(60)) + '\n');
120
+ try {
121
+ // Get running containers
122
+ const { stdout } = await execa('docker', ['ps', '--format', '{{.Names}}']);
123
+ const containers = stdout.split('\n').filter(Boolean);
124
+ console.log(chalk.cyan.bold('🔗 Access URLs:\n'));
125
+ // Display URLs for known services
126
+ if (containers.some(c => c.includes('api'))) {
127
+ console.log(` ${chalk.bold('API Server:')} ${chalk.underline(getServiceURL('API'))}`);
128
+ console.log(` ${chalk.bold('API Health:')} ${chalk.underline(getServiceURL('API') + '/health')}\n`);
129
+ }
130
+ if (containers.some(c => c.includes('dashboard'))) {
131
+ console.log(` ${chalk.bold('Dashboard:')} ${chalk.underline(getServiceURL('DASHBOARD'))}\n`);
132
+ }
133
+ if (containers.some(c => c.includes('kafka-ui'))) {
134
+ console.log(` ${chalk.bold('Kafka UI:')} ${chalk.underline(getServiceURL('KAFKA_UI'))}\n`);
135
+ }
136
+ if (containers.some(c => c.includes('grafana'))) {
137
+ console.log(` ${chalk.bold('Grafana:')} ${chalk.underline(getServiceURL('GRAFANA'))}`);
138
+ console.log(` ${chalk.gray('(default login: admin/admin)')}\n`);
139
+ }
140
+ console.log(chalk.cyan.bold('📦 Running Containers:\n'));
141
+ for (const container of containers) {
142
+ console.log(` ${chalk.green('✓')} ${container}`);
143
+ }
144
+ console.log('\n' + chalk.cyan('To view logs:') + ' docker-compose logs -f');
145
+ console.log(chalk.cyan('To stop services:') + ' docker-compose down\n');
146
+ console.log(chalk.green('═'.repeat(60)) + '\n');
147
+ }
148
+ catch (error) {
149
+ logWarning('Could not fetch container status');
150
+ }
151
+ }
152
+ /**
153
+ * Helper: Sleep for specified milliseconds
154
+ */
155
+ function sleep(ms) {
156
+ return new Promise(resolve => setTimeout(resolve, ms));
157
+ }
158
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const INFRA_COMPOSE_TEMPLATE = "# ============================================\n# INFRA_HOST: Set this in .env to your machine's IP/hostname when running\n# infrastructure on a separate system from application services.\n# Default: host.docker.internal (for same-system deployment)\n# ============================================\n\nservices:\n # ============================================\n # Infrastructure Services\n # ============================================\n mongo:\n image: mongo:7.0\n container_name: mongo\n command: [ \"--replSet\", \"rs0\", \"--bind_ip_all\", \"--port\", \"27017\" ]\n ports:\n - 27017:27017\n extra_hosts:\n - \"host.docker.internal:host-gateway\"\n healthcheck:\n test: echo \"try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'{{INFRA_HOST}}:27017'}]}) }\" | mongosh --port 27017 --quiet\n interval: 5s\n timeout: 30s\n start_period: 0s\n start_interval: 1s\n retries: 30\n volumes:\n - \"mongo_data:/data/db\"\n - \"mongo_config:/data/configdb\"\n\n kafka:\n image: apache/kafka-native\n container_name: kafka\n ports:\n - \"9092:9092\"\n environment:\n # Configure listeners for both docker and host communication\n KAFKA_LISTENERS: CONTROLLER://localhost:9091,HOST://0.0.0.0:9092,DOCKER://0.0.0.0:9093\n KAFKA_ADVERTISED_LISTENERS: HOST://{{INFRA_HOST}}:9092,DOCKER://kafka:9093\n KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,DOCKER:PLAINTEXT,HOST:PLAINTEXT\n\n # Settings required for KRaft mode\n KAFKA_NODE_ID: 1\n KAFKA_PROCESS_ROLES: broker,controller\n KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER\n KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9091\n\n # Listener to use for broker-to-broker communication\n KAFKA_INTER_BROKER_LISTENER_NAME: DOCKER\n\n # Required for a single node cluster\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n\n # Disable auto-topic creation - API server will create topics with correct partitions\n KAFKA_AUTO_CREATE_TOPICS_ENABLE: \"false\"\n volumes:\n - \"kafka_data:/var/lib/kafka/data\"\n\n kafka-ui:\n image: kafbat/kafka-ui:main\n container_name: kafka-ui\n ports:\n - 8080:8080\n environment:\n DYNAMIC_CONFIG_ENABLED: \"true\"\n KAFKA_CLUSTERS_0_NAME: local\n KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9093\n depends_on:\n - kafka\n\n redis:\n image: redis:7-alpine\n container_name: redis\n ports:\n - \"6379:6379\"\n command: redis-server --appendonly yes\n volumes:\n - \"redis_data:/data\"\n healthcheck:\n test: [ \"CMD\", \"redis-cli\", \"ping\" ]\n interval: 5s\n timeout: 3s\n retries: 5\n\n # ============================================\n # Observability Services\n # ============================================\n\n loki:\n image: grafana/loki:2.9.0\n container_name: loki\n ports:\n - \"3100:3100\"\n command: -config.file=/etc/loki/local-config.yaml\n volumes:\n - \"loki_data:/loki\"\n healthcheck:\n test: [ \"CMD-SHELL\", \"wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1\" ]\n interval: 10s\n timeout: 5s\n retries: 5\n\n grafana:\n image: grafana/grafana:10.2.0\n container_name: grafana\n ports:\n - \"3001:3000\"\n environment:\n - GF_PATHS_PROVISIONING=/etc/grafana/provisioning\n - GF_AUTH_ANONYMOUS_ENABLED=true\n - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin\n - GF_SECURITY_ADMIN_PASSWORD=admin\n volumes:\n - \"grafana_data:/var/lib/grafana\"\n depends_on:\n loki:\n condition: service_healthy\n\nvolumes:\n mongo_data:\n mongo_config:\n kafka_data:\n redis_data:\n loki_data:\n grafana_data:\n";
2
+ export declare const APP_COMPOSE_TEMPLATE = "services:\n api:\n image: ghcr.io/simplenotificationsystem/simplens-core:latest\n container_name: api\n ports:\n - 3000:3000\n env_file:\n - .env\n volumes:\n - plugin-data:/app/.plugins\n - ./simplens.config.yaml:/app/simplens.config.yaml:ro\n command: [ \"node\", \"dist/api/server.js\" ]\n restart: unless-stopped\n healthcheck:\n test: [ \"CMD\", \"node\", \"-e\", \"require('http').get('http://localhost:3000/health', (r) => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))\" ]\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 10s\n\n worker:\n image: ghcr.io/simplenotificationsystem/simplens-core:latest\n env_file:\n - .env\n command: [ \"node\", \"dist/workers/worker.js\" ]\n restart: unless-stopped\n\n notification_processor:\n image: ghcr.io/simplenotificationsystem/simplens-core:latest\n env_file:\n - .env\n volumes:\n - plugin-data:/app/.plugins\n - ./simplens.config.yaml:/app/simplens.config.yaml:ro\n command: [ \"node\", \"dist/processors/unified/unified.processor.js\" ]\n depends_on:\n api:\n condition: service_healthy\n restart: unless-stopped\n\n delayed_processor:\n image: ghcr.io/simplenotificationsystem/simplens-core:latest\n env_file:\n - .env\n command: [ \"node\", \"dist/processors/delayed/delayed.processor.js\" ]\n restart: unless-stopped\n\n recovery:\n image: ghcr.io/simplenotificationsystem/simplens-core:latest\n env_file:\n - .env\n command: [ \"node\", \"dist/workers/recovery/recovery.service.js\" ]\n restart: unless-stopped\n\n dashboard:\n image: ghcr.io/simplenotificationsystem/simplens-dashboard:latest\n ports:\n - 3002:3002\n container_name: dashboard\n env_file:\n - .env\n environment:\n PORT: ${DASHBOARD_PORT:-3002}\n API_BASE_URL: http://api:${PORT:-3000}\n WEBHOOK_HOST: dashboard\n WEBHOOK_PORT: ${DASHBOARD_PORT:-3002}\n restart: unless-stopped\n\nvolumes:\n plugin-data:\n\nnetworks:\n default:\n name: simplens\n";
3
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,gwHA4HlC,CAAC;AAEF,eAAO,MAAM,oBAAoB,imEA0EhC,CAAC"}
@@ -0,0 +1,202 @@
1
+ // Docker Compose templates as constants
2
+ export const INFRA_COMPOSE_TEMPLATE = `# ============================================
3
+ # INFRA_HOST: Set this in .env to your machine's IP/hostname when running
4
+ # infrastructure on a separate system from application services.
5
+ # Default: host.docker.internal (for same-system deployment)
6
+ # ============================================
7
+
8
+ services:
9
+ # ============================================
10
+ # Infrastructure Services
11
+ # ============================================
12
+ mongo:
13
+ image: mongo:7.0
14
+ container_name: mongo
15
+ command: [ "--replSet", "rs0", "--bind_ip_all", "--port", "27017" ]
16
+ ports:
17
+ - 27017:27017
18
+ extra_hosts:
19
+ - "host.docker.internal:host-gateway"
20
+ healthcheck:
21
+ test: echo "try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'{{INFRA_HOST}}:27017'}]}) }" | mongosh --port 27017 --quiet
22
+ interval: 5s
23
+ timeout: 30s
24
+ start_period: 0s
25
+ start_interval: 1s
26
+ retries: 30
27
+ volumes:
28
+ - "mongo_data:/data/db"
29
+ - "mongo_config:/data/configdb"
30
+
31
+ kafka:
32
+ image: apache/kafka-native
33
+ container_name: kafka
34
+ ports:
35
+ - "9092:9092"
36
+ environment:
37
+ # Configure listeners for both docker and host communication
38
+ KAFKA_LISTENERS: CONTROLLER://localhost:9091,HOST://0.0.0.0:9092,DOCKER://0.0.0.0:9093
39
+ KAFKA_ADVERTISED_LISTENERS: HOST://{{INFRA_HOST}}:9092,DOCKER://kafka:9093
40
+ KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,DOCKER:PLAINTEXT,HOST:PLAINTEXT
41
+
42
+ # Settings required for KRaft mode
43
+ KAFKA_NODE_ID: 1
44
+ KAFKA_PROCESS_ROLES: broker,controller
45
+ KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
46
+ KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9091
47
+
48
+ # Listener to use for broker-to-broker communication
49
+ KAFKA_INTER_BROKER_LISTENER_NAME: DOCKER
50
+
51
+ # Required for a single node cluster
52
+ KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
53
+
54
+ # Disable auto-topic creation - API server will create topics with correct partitions
55
+ KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
56
+ volumes:
57
+ - "kafka_data:/var/lib/kafka/data"
58
+
59
+ kafka-ui:
60
+ image: kafbat/kafka-ui:main
61
+ container_name: kafka-ui
62
+ ports:
63
+ - 8080:8080
64
+ environment:
65
+ DYNAMIC_CONFIG_ENABLED: "true"
66
+ KAFKA_CLUSTERS_0_NAME: local
67
+ KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9093
68
+ depends_on:
69
+ - kafka
70
+
71
+ redis:
72
+ image: redis:7-alpine
73
+ container_name: redis
74
+ ports:
75
+ - "6379:6379"
76
+ command: redis-server --appendonly yes
77
+ volumes:
78
+ - "redis_data:/data"
79
+ healthcheck:
80
+ test: [ "CMD", "redis-cli", "ping" ]
81
+ interval: 5s
82
+ timeout: 3s
83
+ retries: 5
84
+
85
+ # ============================================
86
+ # Observability Services
87
+ # ============================================
88
+
89
+ loki:
90
+ image: grafana/loki:2.9.0
91
+ container_name: loki
92
+ ports:
93
+ - "3100:3100"
94
+ command: -config.file=/etc/loki/local-config.yaml
95
+ volumes:
96
+ - "loki_data:/loki"
97
+ healthcheck:
98
+ test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1" ]
99
+ interval: 10s
100
+ timeout: 5s
101
+ retries: 5
102
+
103
+ grafana:
104
+ image: grafana/grafana:10.2.0
105
+ container_name: grafana
106
+ ports:
107
+ - "3001:3000"
108
+ environment:
109
+ - GF_PATHS_PROVISIONING=/etc/grafana/provisioning
110
+ - GF_AUTH_ANONYMOUS_ENABLED=true
111
+ - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
112
+ - GF_SECURITY_ADMIN_PASSWORD=admin
113
+ volumes:
114
+ - "grafana_data:/var/lib/grafana"
115
+ depends_on:
116
+ loki:
117
+ condition: service_healthy
118
+
119
+ volumes:
120
+ mongo_data:
121
+ mongo_config:
122
+ kafka_data:
123
+ redis_data:
124
+ loki_data:
125
+ grafana_data:
126
+ `;
127
+ export const APP_COMPOSE_TEMPLATE = `services:
128
+ api:
129
+ image: ghcr.io/simplenotificationsystem/simplens-core:latest
130
+ container_name: api
131
+ ports:
132
+ - 3000:3000
133
+ env_file:
134
+ - .env
135
+ volumes:
136
+ - plugin-data:/app/.plugins
137
+ - ./simplens.config.yaml:/app/simplens.config.yaml:ro
138
+ command: [ "node", "dist/api/server.js" ]
139
+ restart: unless-stopped
140
+ healthcheck:
141
+ test: [ "CMD", "node", "-e", "require('http').get('http://localhost:3000/health', (r) => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))" ]
142
+ interval: 30s
143
+ timeout: 10s
144
+ retries: 3
145
+ start_period: 10s
146
+
147
+ worker:
148
+ image: ghcr.io/simplenotificationsystem/simplens-core:latest
149
+ env_file:
150
+ - .env
151
+ command: [ "node", "dist/workers/worker.js" ]
152
+ restart: unless-stopped
153
+
154
+ notification_processor:
155
+ image: ghcr.io/simplenotificationsystem/simplens-core:latest
156
+ env_file:
157
+ - .env
158
+ volumes:
159
+ - plugin-data:/app/.plugins
160
+ - ./simplens.config.yaml:/app/simplens.config.yaml:ro
161
+ command: [ "node", "dist/processors/unified/unified.processor.js" ]
162
+ depends_on:
163
+ api:
164
+ condition: service_healthy
165
+ restart: unless-stopped
166
+
167
+ delayed_processor:
168
+ image: ghcr.io/simplenotificationsystem/simplens-core:latest
169
+ env_file:
170
+ - .env
171
+ command: [ "node", "dist/processors/delayed/delayed.processor.js" ]
172
+ restart: unless-stopped
173
+
174
+ recovery:
175
+ image: ghcr.io/simplenotificationsystem/simplens-core:latest
176
+ env_file:
177
+ - .env
178
+ command: [ "node", "dist/workers/recovery/recovery.service.js" ]
179
+ restart: unless-stopped
180
+
181
+ dashboard:
182
+ image: ghcr.io/simplenotificationsystem/simplens-dashboard:latest
183
+ ports:
184
+ - 3002:3002
185
+ container_name: dashboard
186
+ env_file:
187
+ - .env
188
+ environment:
189
+ PORT: \${DASHBOARD_PORT:-3002}
190
+ API_BASE_URL: http://api:\${PORT:-3000}
191
+ WEBHOOK_HOST: dashboard
192
+ WEBHOOK_PORT: \${DASHBOARD_PORT:-3002}
193
+ restart: unless-stopped
194
+
195
+ volumes:
196
+ plugin-data:
197
+
198
+ networks:
199
+ default:
200
+ name: simplens
201
+ `;
202
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4HrC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0EnC,CAAC"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Domain type definitions for the onboarding system
3
+ */
4
+ /**
5
+ * Plugin information returned by config-gen
6
+ */
7
+ export interface PluginInfo {
8
+ /** Package name (e.g., '@simplens/nodemailer-gmail') */
9
+ package: string;
10
+ /** Display name */
11
+ name: string;
12
+ /** Description of what the plugin does */
13
+ description: string;
14
+ }
15
+ /**
16
+ * Infrastructure service option
17
+ */
18
+ export interface InfraService {
19
+ /** Display name (e.g., 'MongoDB (Database)') */
20
+ name: string;
21
+ /** Service identifier (e.g., 'mongo') */
22
+ value: string;
23
+ /** Whether checked by default */
24
+ checked: boolean;
25
+ }
26
+ /**
27
+ * Environment variable definition
28
+ */
29
+ export interface EnvVariable {
30
+ /** Environment variable key */
31
+ key: string;
32
+ /** Current or default value */
33
+ value: string;
34
+ /** Optional description/comment */
35
+ description?: string;
36
+ /** Whether this variable is required */
37
+ required: boolean;
38
+ }
39
+ /**
40
+ * Setup options provided via CLI or prompts
41
+ */
42
+ export interface SetupOptions {
43
+ /** Whether to setup infrastructure services */
44
+ infra: boolean;
45
+ /** Environment configuration mode */
46
+ envMode: 'default' | 'interactive';
47
+ /** Target directory for setup */
48
+ targetDir: string;
49
+ }
50
+ /**
51
+ * Service definition for docker-compose generation
52
+ */
53
+ export interface ServiceDefinition {
54
+ /** Service identifier */
55
+ id: string;
56
+ /** Display name */
57
+ name: string;
58
+ /** Docker compose YAML block */
59
+ dockerCompose: string;
60
+ /** Required volumes */
61
+ volumes: string[];
62
+ /** Service dependencies */
63
+ dependencies?: string[];
64
+ /** Whether service has health check */
65
+ healthCheck?: boolean;
66
+ }
67
+ /**
68
+ * SimplensConfig YAML structure
69
+ */
70
+ export interface SimplensConfig {
71
+ providers: ProviderConfig[];
72
+ }
73
+ /**
74
+ * Provider configuration in simplens.config.yaml
75
+ */
76
+ export interface ProviderConfig {
77
+ /** Package name */
78
+ package: string;
79
+ /** Provider ID */
80
+ id: string;
81
+ /** Required credentials as key-value pairs */
82
+ credentials: Record<string, string>;
83
+ /** Optional configuration */
84
+ optionalConfig?: Record<string, string | number | boolean>;
85
+ }
86
+ /**
87
+ * Docker compose file structure (simplified)
88
+ */
89
+ export interface DockerComposeFile {
90
+ services: Record<string, DockerService>;
91
+ volumes?: Record<string, DockerVolume>;
92
+ networks?: Record<string, DockerNetwork>;
93
+ }
94
+ export interface DockerService {
95
+ image: string;
96
+ container_name?: string;
97
+ ports?: string[];
98
+ environment?: Record<string, string> | string[];
99
+ volumes?: string[];
100
+ command?: string | string[];
101
+ depends_on?: string[] | Record<string, {
102
+ condition: string;
103
+ }>;
104
+ healthcheck?: {
105
+ test: string | string[];
106
+ interval?: string;
107
+ timeout?: string;
108
+ retries?: number;
109
+ start_period?: string;
110
+ };
111
+ }
112
+ export interface DockerVolume {
113
+ driver?: string;
114
+ driver_opts?: Record<string, string>;
115
+ }
116
+ export interface DockerNetwork {
117
+ driver?: string;
118
+ }
119
+ //# sourceMappingURL=domain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../src/types/domain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Domain type definitions for the onboarding system
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=domain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.js","sourceRoot":"","sources":["../../src/types/domain.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Custom error types for better error handling and troubleshooting
3
+ */
4
+ /**
5
+ * Base error class for all onboarding errors
6
+ */
7
+ export declare class OnboardingError extends Error {
8
+ readonly code: string;
9
+ readonly troubleshooting?: string | undefined;
10
+ constructor(code: string, message: string, troubleshooting?: string | undefined);
11
+ }
12
+ /**
13
+ * Docker-related errors
14
+ */
15
+ export declare class DockerError extends OnboardingError {
16
+ constructor(message: string, troubleshooting?: string);
17
+ }
18
+ export declare class DockerNotInstalledError extends DockerError {
19
+ constructor();
20
+ }
21
+ export declare class DockerNotRunningError extends DockerError {
22
+ constructor();
23
+ }
24
+ export declare class DockerPermissionError extends DockerError {
25
+ constructor();
26
+ }
27
+ export declare class DockerComposeError extends DockerError {
28
+ constructor(operation: string, details?: string);
29
+ }
30
+ /**
31
+ * File system errors
32
+ */
33
+ export declare class FileSystemError extends OnboardingError {
34
+ readonly path: string;
35
+ constructor(message: string, path: string, troubleshooting?: string);
36
+ }
37
+ export declare class DirectoryNotWritableError extends FileSystemError {
38
+ constructor(path: string);
39
+ }
40
+ export declare class FileNotFoundError extends FileSystemError {
41
+ constructor(path: string);
42
+ }
43
+ /**
44
+ * Configuration errors
45
+ */
46
+ export declare class ConfigurationError extends OnboardingError {
47
+ constructor(message: string, troubleshooting?: string);
48
+ }
49
+ export declare class InvalidEnvironmentValueError extends ConfigurationError {
50
+ constructor(key: string, value: string, expectedFormat: string);
51
+ }
52
+ export declare class PluginConfigurationError extends ConfigurationError {
53
+ constructor(pluginName: string, details: string);
54
+ }
55
+ /**
56
+ * Service health errors
57
+ */
58
+ export declare class ServiceHealthError extends OnboardingError {
59
+ constructor(serviceName: string, timeout: number);
60
+ }
61
+ /**
62
+ * Type guard to check if an error is an OnboardingError
63
+ */
64
+ export declare function isOnboardingError(error: unknown): error is OnboardingError;
65
+ /**
66
+ * Format error for user display
67
+ */
68
+ export declare function formatErrorForUser(error: unknown): string;
69
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAElB,IAAI,EAAE,MAAM;aAEZ,eAAe,CAAC,EAAE,MAAM;gBAFxB,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,eAAe,CAAC,EAAE,MAAM,YAAA;CAM/C;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,eAAe;gBAChC,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM;CAIxD;AAED,qBAAa,uBAAwB,SAAQ,WAAW;;CAQvD;AAED,qBAAa,qBAAsB,SAAQ,WAAW;;CAQrD;AAED,qBAAa,qBAAsB,SAAQ,WAAW;;CAUrD;AAED,qBAAa,kBAAmB,SAAQ,WAAW;gBACnC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAOlD;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,eAAe;aACH,IAAI,EAAE,MAAM;gBAA7C,OAAO,EAAE,MAAM,EAAkB,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM;CAItF;AAED,qBAAa,yBAA0B,SAAQ,eAAe;gBAC9C,IAAI,EAAE,MAAM;CAQ3B;AAED,qBAAa,iBAAkB,SAAQ,eAAe;gBACtC,IAAI,EAAE,MAAM;CAQ3B;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,eAAe;gBACvC,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM;CAIxD;AAED,qBAAa,4BAA6B,SAAQ,kBAAkB;gBACpD,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;CAOjE;AAED,qBAAa,wBAAyB,SAAQ,kBAAkB;gBAChD,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAOlD;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,eAAe;gBACvC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CASnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAczD"}