@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
package/src/templates.ts CHANGED
@@ -1,203 +1,209 @@
1
- // Docker Compose templates as constants
2
-
3
- export const INFRA_COMPOSE_TEMPLATE = `# ============================================
4
- # INFRA_HOST: Set this in .env to your machine's IP/hostname when running
5
- # infrastructure on a separate system from application services.
6
- # Default: host.docker.internal (for same-system deployment)
7
- # ============================================
8
-
9
- services:
10
- # ============================================
11
- # Infrastructure Services
12
- # ============================================
13
- mongo:
14
- image: mongo:7.0
15
- container_name: mongo
16
- command: [ "--replSet", "rs0", "--bind_ip_all", "--port", "27017" ]
17
- ports:
18
- - 27017:27017
19
- extra_hosts:
20
- - "host.docker.internal:host-gateway"
21
- healthcheck:
22
- test: echo "try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'{{INFRA_HOST}}:27017'}]}) }" | mongosh --port 27017 --quiet
23
- interval: 5s
24
- timeout: 30s
25
- start_period: 0s
26
- start_interval: 1s
27
- retries: 30
28
- volumes:
29
- - "mongo_data:/data/db"
30
- - "mongo_config:/data/configdb"
31
-
32
- kafka:
33
- image: apache/kafka-native
34
- container_name: kafka
35
- ports:
36
- - "9092:9092"
37
- environment:
38
- # Configure listeners for both docker and host communication
39
- KAFKA_LISTENERS: CONTROLLER://localhost:9091,HOST://0.0.0.0:9092,DOCKER://0.0.0.0:9093
40
- KAFKA_ADVERTISED_LISTENERS: HOST://{{INFRA_HOST}}:9092,DOCKER://kafka:9093
41
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,DOCKER:PLAINTEXT,HOST:PLAINTEXT
42
-
43
- # Settings required for KRaft mode
44
- KAFKA_NODE_ID: 1
45
- KAFKA_PROCESS_ROLES: broker,controller
46
- KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
47
- KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9091
48
-
49
- # Listener to use for broker-to-broker communication
50
- KAFKA_INTER_BROKER_LISTENER_NAME: DOCKER
51
-
52
- # Required for a single node cluster
53
- KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
54
-
55
- # Disable auto-topic creation - API server will create topics with correct partitions
56
- KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
57
- volumes:
58
- - "kafka_data:/var/lib/kafka/data"
59
-
60
- kafka-ui:
61
- image: kafbat/kafka-ui:main
62
- container_name: kafka-ui
63
- ports:
64
- - 8080:8080
65
- environment:
66
- DYNAMIC_CONFIG_ENABLED: "true"
67
- KAFKA_CLUSTERS_0_NAME: local
68
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9093
69
- depends_on:
70
- - kafka
71
-
72
- redis:
73
- image: redis:7-alpine
74
- container_name: redis
75
- ports:
76
- - "6379:6379"
77
- command: redis-server --appendonly yes
78
- volumes:
79
- - "redis_data:/data"
80
- healthcheck:
81
- test: [ "CMD", "redis-cli", "ping" ]
82
- interval: 5s
83
- timeout: 3s
84
- retries: 5
85
-
86
- # ============================================
87
- # Observability Services
88
- # ============================================
89
-
90
- loki:
91
- image: grafana/loki:2.9.0
92
- container_name: loki
93
- ports:
94
- - "3100:3100"
95
- command: -config.file=/etc/loki/local-config.yaml
96
- volumes:
97
- - "loki_data:/loki"
98
- healthcheck:
99
- test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1" ]
100
- interval: 10s
101
- timeout: 5s
102
- retries: 5
103
-
104
- grafana:
105
- image: grafana/grafana:10.2.0
106
- container_name: grafana
107
- ports:
108
- - "3001:3000"
109
- environment:
110
- - GF_PATHS_PROVISIONING=/etc/grafana/provisioning
111
- - GF_AUTH_ANONYMOUS_ENABLED=true
112
- - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
113
- - GF_SECURITY_ADMIN_PASSWORD=admin
114
- volumes:
115
- - "grafana_data:/var/lib/grafana"
116
- depends_on:
117
- loki:
118
- condition: service_healthy
119
-
120
- volumes:
121
- mongo_data:
122
- mongo_config:
123
- kafka_data:
124
- redis_data:
125
- loki_data:
126
- grafana_data:
127
- `;
128
-
129
- export const APP_COMPOSE_TEMPLATE = `services:
130
- api:
131
- image: ghcr.io/simplenotificationsystem/simplens-core:latest
132
- container_name: api
133
- ports:
134
- - 3000:3000
135
- env_file:
136
- - .env
137
- volumes:
138
- - plugin-data:/app/.plugins
139
- - ./simplens.config.yaml:/app/simplens.config.yaml:ro
140
- command: [ "node", "dist/api/server.js" ]
141
- restart: unless-stopped
142
- healthcheck:
143
- test: [ "CMD", "node", "-e", "require('http').get('http://localhost:3000/health', (r) => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))" ]
144
- interval: 30s
145
- timeout: 10s
146
- retries: 3
147
- start_period: 10s
148
-
149
- worker:
150
- image: ghcr.io/simplenotificationsystem/simplens-core:latest
151
- env_file:
152
- - .env
153
- command: [ "node", "dist/workers/worker.js" ]
154
- restart: unless-stopped
155
-
156
- notification_processor:
157
- image: ghcr.io/simplenotificationsystem/simplens-core:latest
158
- env_file:
159
- - .env
160
- volumes:
161
- - plugin-data:/app/.plugins
162
- - ./simplens.config.yaml:/app/simplens.config.yaml:ro
163
- command: [ "node", "dist/processors/unified/unified.processor.js" ]
164
- depends_on:
165
- api:
166
- condition: service_healthy
167
- restart: unless-stopped
168
-
169
- delayed_processor:
170
- image: ghcr.io/simplenotificationsystem/simplens-core:latest
171
- env_file:
172
- - .env
173
- command: [ "node", "dist/processors/delayed/delayed.processor.js" ]
174
- restart: unless-stopped
175
-
176
- recovery:
177
- image: ghcr.io/simplenotificationsystem/simplens-core:latest
178
- env_file:
179
- - .env
180
- command: [ "node", "dist/workers/recovery/recovery.service.js" ]
181
- restart: unless-stopped
182
-
183
- dashboard:
184
- image: ghcr.io/simplenotificationsystem/simplens-dashboard:latest
185
- ports:
186
- - 3002:3002
187
- container_name: dashboard
188
- env_file:
189
- - .env
190
- environment:
191
- PORT: \${DASHBOARD_PORT:-3002}
192
- API_BASE_URL: http://api:\${PORT:-3000}
193
- WEBHOOK_HOST: dashboard
194
- WEBHOOK_PORT: \${DASHBOARD_PORT:-3002}
195
- restart: unless-stopped
196
-
197
- volumes:
198
- plugin-data:
199
-
200
- networks:
201
- default:
202
- name: simplens
203
- `;
1
+ // Docker Compose templates as constants
2
+
3
+ export const INFRA_COMPOSE_TEMPLATE = `
4
+ services:
5
+ # ============================================
6
+ # Infrastructure Services
7
+ # ============================================
8
+ mongo:
9
+ image: mongo:7.0
10
+ container_name: mongo
11
+ command: [ "--replSet", "rs0", "--bind_ip_all", "--port", "27017" ]
12
+ ports:
13
+ - 27017:27017
14
+ healthcheck:
15
+ test: echo "try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'mongo:27017'}]}) }" | mongosh --port 27017 --quiet
16
+ interval: 5s
17
+ timeout: 30s
18
+ start_period: 0s
19
+ start_interval: 1s
20
+ retries: 30
21
+ volumes:
22
+ - "mongo_data:/data/db"
23
+ - "mongo_config:/data/configdb"
24
+
25
+ kafka:
26
+ image: apache/kafka-native
27
+ container_name: kafka
28
+ ports:
29
+ - "9092:9092"
30
+ environment:
31
+ # Configure listeners for both docker and host communication
32
+ KAFKA_LISTENERS: CONTROLLER://localhost:9091,HOST://0.0.0.0:9092,DOCKER://0.0.0.0:9093
33
+ KAFKA_ADVERTISED_LISTENERS: HOST://kafka:9092,DOCKER://kafka:9093
34
+ KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,DOCKER:PLAINTEXT,HOST:PLAINTEXT
35
+
36
+ # Settings required for KRaft mode
37
+ KAFKA_NODE_ID: 1
38
+ KAFKA_PROCESS_ROLES: broker,controller
39
+ KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
40
+ KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9091
41
+
42
+ # Listener to use for broker-to-broker communication
43
+ KAFKA_INTER_BROKER_LISTENER_NAME: DOCKER
44
+
45
+ # Required for a single node cluster
46
+ KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
47
+
48
+ # Disable auto-topic creation - API server will create topics with correct partitions
49
+ KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
50
+ volumes:
51
+ - "kafka_data:/var/lib/kafka/data"
52
+
53
+ kafka-ui:
54
+ image: kafbat/kafka-ui:main
55
+ container_name: kafka-ui
56
+ ports:
57
+ - 8080:8080
58
+ environment:
59
+ DYNAMIC_CONFIG_ENABLED: "true"
60
+ KAFKA_CLUSTERS_0_NAME: local
61
+ KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9093
62
+ depends_on:
63
+ - kafka
64
+
65
+ redis:
66
+ image: redis:7-alpine
67
+ container_name: redis
68
+ ports:
69
+ - "6379:6379"
70
+ command: redis-server --appendonly yes
71
+ volumes:
72
+ - "redis_data:/data"
73
+ healthcheck:
74
+ test: [ "CMD", "redis-cli", "ping" ]
75
+ interval: 5s
76
+ timeout: 3s
77
+ retries: 5
78
+
79
+ # ============================================
80
+ # Observability Services
81
+ # ============================================
82
+
83
+ loki:
84
+ image: grafana/loki:2.9.0
85
+ container_name: loki
86
+ ports:
87
+ - "3100:3100"
88
+ command: -config.file=/etc/loki/local-config.yaml
89
+ volumes:
90
+ - "loki_data:/loki"
91
+ healthcheck:
92
+ test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1" ]
93
+ interval: 10s
94
+ timeout: 5s
95
+ retries: 5
96
+
97
+ grafana:
98
+ image: grafana/grafana:10.2.0
99
+ container_name: grafana
100
+ ports:
101
+ - "3001:3000"
102
+ environment:
103
+ - GF_PATHS_PROVISIONING=/etc/grafana/provisioning
104
+ - GF_AUTH_ANONYMOUS_ENABLED=true
105
+ - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
106
+ - GF_SECURITY_ADMIN_PASSWORD=admin
107
+ volumes:
108
+ - "grafana_data:/var/lib/grafana"
109
+ depends_on:
110
+ loki:
111
+ condition: service_healthy
112
+
113
+ volumes:
114
+ mongo_data:
115
+ mongo_config:
116
+ kafka_data:
117
+ redis_data:
118
+ loki_data:
119
+ grafana_data:
120
+ `;
121
+
122
+ export const APP_COMPOSE_TEMPLATE = `services:
123
+ api:
124
+ image: ghcr.io/simplenotificationsystem/simplens-core:\${CORE_VERSION:-latest}
125
+ container_name: api
126
+ ports:
127
+ - 3000:3000
128
+ env_file:
129
+ - .env
130
+ volumes:
131
+ - plugin-data:/app/.plugins
132
+ - ./simplens.config.yaml:/app/simplens.config.yaml:ro
133
+ command: [ "node", "dist/api/server.js" ]
134
+ restart: unless-stopped
135
+ healthcheck:
136
+ test: [ "CMD", "node", "-e", "require('http').get('http://localhost:3000/health', (r) => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))" ]
137
+ interval: 30s
138
+ timeout: 10s
139
+ retries: 3
140
+ start_period: 10s
141
+
142
+ worker:
143
+ image: ghcr.io/simplenotificationsystem/simplens-core:\${CORE_VERSION:-latest}
144
+ env_file:
145
+ - .env
146
+ command: [ "node", "dist/workers/worker.js" ]
147
+ restart: unless-stopped
148
+
149
+ notification_processor:
150
+ image: ghcr.io/simplenotificationsystem/simplens-core:\${CORE_VERSION:-latest}
151
+ env_file:
152
+ - .env
153
+ volumes:
154
+ - plugin-data:/app/.plugins
155
+ - ./simplens.config.yaml:/app/simplens.config.yaml:ro
156
+ command: [ "node", "dist/processors/unified/unified.processor.js" ]
157
+ depends_on:
158
+ api:
159
+ condition: service_healthy
160
+ restart: unless-stopped
161
+
162
+ delayed_processor:
163
+ image: ghcr.io/simplenotificationsystem/simplens-core:\${CORE_VERSION:-latest}
164
+ env_file:
165
+ - .env
166
+ command: [ "node", "dist/processors/delayed/delayed.processor.js" ]
167
+ restart: unless-stopped
168
+
169
+ recovery:
170
+ image: ghcr.io/simplenotificationsystem/simplens-core:\${CORE_VERSION:-latest}
171
+ env_file:
172
+ - .env
173
+ command: [ "node", "dist/workers/recovery/recovery.service.js" ]
174
+ restart: unless-stopped
175
+
176
+ dashboard:
177
+ image: ghcr.io/simplenotificationsystem/simplens-dashboard:\${DASHBOARD_VERSION:-latest}
178
+ ports:
179
+ - 3002:3002
180
+ container_name: dashboard
181
+ env_file:
182
+ - .env
183
+ environment:
184
+ PORT: \${DASHBOARD_PORT:-3002}
185
+ API_BASE_URL: http://api:\${PORT:-3000}
186
+ WEBHOOK_HOST: dashboard
187
+ WEBHOOK_PORT: \${DASHBOARD_PORT:-3002}
188
+ NEXT_PUBLIC_BASE_PATH: \${BASE_PATH:-}
189
+ restart: unless-stopped
190
+
191
+ volumes:
192
+ plugin-data:
193
+
194
+ networks:
195
+ default:
196
+ name: simplens
197
+ `;
198
+
199
+ export const APP_NGINX_SERVICE_TEMPLATE = ` nginx:
200
+ image: nginx:alpine
201
+ container_name: nginx
202
+ ports:
203
+ - "80:80"
204
+ volumes:
205
+ - "./nginx.conf:/etc/nginx/conf.d/default.conf:ro"
206
+ depends_on:
207
+ - api
208
+ - dashboard
209
+ restart: unless-stopped`;