@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.
- package/README.md +214 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +125 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/utils.test.d.ts +2 -0
- package/dist/__tests__/utils.test.d.ts.map +1 -0
- package/dist/__tests__/utils.test.js +105 -0
- package/dist/__tests__/utils.test.js.map +1 -0
- package/dist/__tests__/validators.test.d.ts +2 -0
- package/dist/__tests__/validators.test.d.ts.map +1 -0
- package/dist/__tests__/validators.test.js +148 -0
- package/dist/__tests__/validators.test.js.map +1 -0
- package/dist/config/constants.d.ts +69 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +79 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/env-config.d.ts +33 -0
- package/dist/env-config.d.ts.map +1 -0
- package/dist/env-config.js +285 -0
- package/dist/env-config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +153 -0
- package/dist/index.js.map +1 -0
- package/dist/infra.d.ts +31 -0
- package/dist/infra.d.ts.map +1 -0
- package/dist/infra.js +267 -0
- package/dist/infra.js.map +1 -0
- package/dist/plugins.d.ts +35 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +164 -0
- package/dist/plugins.js.map +1 -0
- package/dist/services.d.ts +52 -0
- package/dist/services.d.ts.map +1 -0
- package/dist/services.js +158 -0
- package/dist/services.js.map +1 -0
- package/dist/templates.d.ts +3 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +202 -0
- package/dist/templates.js.map +1 -0
- package/dist/types/domain.d.ts +119 -0
- package/dist/types/domain.d.ts.map +1 -0
- package/dist/types/domain.js +5 -0
- package/dist/types/domain.js.map +1 -0
- package/dist/types/errors.d.ts +69 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +129 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +54 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +92 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils.d.ts +32 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +79 -0
- package/dist/utils.js.map +1 -0
- package/dist/validators.d.ts +93 -0
- package/dist/validators.d.ts.map +1 -0
- package/dist/validators.js +180 -0
- package/dist/validators.js.map +1 -0
- package/package.json +45 -0
- package/src/__tests__/errors.test.ts +187 -0
- package/src/__tests__/utils.test.ts +142 -0
- package/src/__tests__/validators.test.ts +195 -0
- package/src/config/constants.ts +86 -0
- package/src/config/index.ts +1 -0
- package/src/env-config.ts +320 -0
- package/src/index.ts +203 -0
- package/src/infra.ts +300 -0
- package/src/plugins.ts +190 -0
- package/src/services.ts +190 -0
- package/src/templates.ts +203 -0
- package/src/types/domain.ts +127 -0
- package/src/types/errors.ts +173 -0
- package/src/types/index.ts +2 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/logger.ts +118 -0
- package/src/utils.ts +105 -0
- package/src/validators.ts +192 -0
- package/tsconfig.json +19 -0
- package/vitest.config.ts +20 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/infra.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompts user to select which infrastructure services to deploy.
|
|
3
|
+
* Services include MongoDB, Kafka, Redis, Loki, and Grafana.
|
|
4
|
+
*
|
|
5
|
+
* @returns Array of selected service IDs (e.g., ['mongo', 'kafka', 'redis'])
|
|
6
|
+
* @throws Error if no services are selected
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* const services = await promptInfraServices();
|
|
11
|
+
* // Returns: ['mongo', 'kafka', 'kafka-ui', 'redis']
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare function promptInfraServices(): Promise<string[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Get infrastructure host based on OS
|
|
17
|
+
*/
|
|
18
|
+
export declare function getInfraHost(): string;
|
|
19
|
+
/**
|
|
20
|
+
* Replace INFRA_HOST placeholder in template
|
|
21
|
+
*/
|
|
22
|
+
export declare function replaceInfraHost(template: string, infraHost: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Generate and write docker-compose.infra.yaml
|
|
25
|
+
*/
|
|
26
|
+
export declare function generateInfraCompose(targetDir: string, selectedServices: string[]): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Write app docker-compose.yaml
|
|
29
|
+
*/
|
|
30
|
+
export declare function writeAppCompose(targetDir: string): Promise<void>;
|
|
31
|
+
//# sourceMappingURL=infra.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infra.d.ts","sourceRoot":"","sources":["../src/infra.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAiB7D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAmCrC;AA2KD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACtC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EAAE,GAC3B,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE"}
|
package/dist/infra.js
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import { APP_COMPOSE_TEMPLATE } from './templates.js';
|
|
3
|
+
import { writeFile, logInfo, logSuccess } from './utils.js';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
const INFRA_SERVICES = [
|
|
6
|
+
{ name: 'MongoDB (Database)', value: 'mongo', checked: true },
|
|
7
|
+
{ name: 'Kafka (Message Queue)', value: 'kafka', checked: true },
|
|
8
|
+
{ name: 'Kafka UI (Dashboard)', value: 'kafka-ui', checked: true },
|
|
9
|
+
{ name: 'Redis (Cache)', value: 'redis', checked: true },
|
|
10
|
+
{ name: 'Loki (Log Aggregation)', value: 'loki', checked: false },
|
|
11
|
+
{ name: 'Grafana (Observability Dashboard)', value: 'grafana', checked: false },
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Prompts user to select which infrastructure services to deploy.
|
|
15
|
+
* Services include MongoDB, Kafka, Redis, Loki, and Grafana.
|
|
16
|
+
*
|
|
17
|
+
* @returns Array of selected service IDs (e.g., ['mongo', 'kafka', 'redis'])
|
|
18
|
+
* @throws Error if no services are selected
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const services = await promptInfraServices();
|
|
23
|
+
* // Returns: ['mongo', 'kafka', 'kafka-ui', 'redis']
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export async function promptInfraServices() {
|
|
27
|
+
const answer = await inquirer.prompt([
|
|
28
|
+
{
|
|
29
|
+
type: 'checkbox',
|
|
30
|
+
name: 'services',
|
|
31
|
+
message: 'Select infrastructure services to run:',
|
|
32
|
+
choices: INFRA_SERVICES,
|
|
33
|
+
validate: (input) => {
|
|
34
|
+
if (input.length === 0) {
|
|
35
|
+
return 'Please select at least one service';
|
|
36
|
+
}
|
|
37
|
+
return true;
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
]);
|
|
41
|
+
return answer.services;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get infrastructure host based on OS
|
|
45
|
+
*/
|
|
46
|
+
export function getInfraHost() {
|
|
47
|
+
// const os = detectOS();
|
|
48
|
+
// if (os === 'linux') {
|
|
49
|
+
// logWarning('Linux detected: host.docker.internal does not work by default.');
|
|
50
|
+
// const answer = await inquirer.prompt<{ hostChoice: string; customHost?: string }>([
|
|
51
|
+
// {
|
|
52
|
+
// type: 'list',
|
|
53
|
+
// name: 'hostChoice',
|
|
54
|
+
// message: 'Select host configuration:',
|
|
55
|
+
// choices: [
|
|
56
|
+
// { name: 'Use Docker bridge IP (172.17.0.1)', value: '172.17.0.1' },
|
|
57
|
+
// { name: 'Enter custom IP/hostname', value: 'custom' },
|
|
58
|
+
// ],
|
|
59
|
+
// },
|
|
60
|
+
// {
|
|
61
|
+
// type: 'input',
|
|
62
|
+
// name: 'customHost',
|
|
63
|
+
// message: 'Enter your machine IP or hostname:',
|
|
64
|
+
// when: (answers) => answers.hostChoice === 'custom',
|
|
65
|
+
// validate: (input: string) => {
|
|
66
|
+
// if (!input || input.trim().length === 0) {
|
|
67
|
+
// return 'Please enter a valid IP or hostname';
|
|
68
|
+
// }
|
|
69
|
+
// return true;
|
|
70
|
+
// },
|
|
71
|
+
// },
|
|
72
|
+
// ]);
|
|
73
|
+
// return answer.hostChoice === 'custom' ? answer.customHost! : answer.hostChoice;
|
|
74
|
+
// }
|
|
75
|
+
// For Windows, linux and macOS, use host.docker.internal
|
|
76
|
+
return 'host.docker.internal';
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Service chunk definitions - each service as a complete block
|
|
80
|
+
*/
|
|
81
|
+
const SERVICE_CHUNKS = {
|
|
82
|
+
'mongo': ` mongo:
|
|
83
|
+
image: mongo:7.0
|
|
84
|
+
container_name: mongo
|
|
85
|
+
command: [ "--replSet", "rs0", "--bind_ip_all", "--port", "27017" ]
|
|
86
|
+
ports:
|
|
87
|
+
- 27017:27017
|
|
88
|
+
extra_hosts:
|
|
89
|
+
- "host.docker.internal:host-gateway"
|
|
90
|
+
healthcheck:
|
|
91
|
+
test: echo "try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'{{INFRA_HOST}}:27017'}]}) }" | mongosh --port 27017 --quiet
|
|
92
|
+
interval: 5s
|
|
93
|
+
timeout: 30s
|
|
94
|
+
start_period: 0s
|
|
95
|
+
start_interval: 1s
|
|
96
|
+
retries: 30
|
|
97
|
+
volumes:
|
|
98
|
+
- "mongo_data:/data/db"
|
|
99
|
+
- "mongo_config:/data/configdb"`,
|
|
100
|
+
'kafka': ` kafka:
|
|
101
|
+
image: apache/kafka-native
|
|
102
|
+
container_name: kafka
|
|
103
|
+
ports:
|
|
104
|
+
- "9092:9092"
|
|
105
|
+
environment:
|
|
106
|
+
# Configure listeners for both docker and host communication
|
|
107
|
+
KAFKA_LISTENERS: CONTROLLER://localhost:9091,HOST://0.0.0.0:9092,DOCKER://0.0.0.0:9093
|
|
108
|
+
KAFKA_ADVERTISED_LISTENERS: HOST://{{INFRA_HOST}}:9092,DOCKER://kafka:9093
|
|
109
|
+
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,DOCKER:PLAINTEXT,HOST:PLAINTEXT
|
|
110
|
+
|
|
111
|
+
# Settings required for KRaft mode
|
|
112
|
+
KAFKA_NODE_ID: 1
|
|
113
|
+
KAFKA_PROCESS_ROLES: broker,controller
|
|
114
|
+
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
|
|
115
|
+
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9091
|
|
116
|
+
|
|
117
|
+
# Listener to use for broker-to-broker communication
|
|
118
|
+
KAFKA_INTER_BROKER_LISTENER_NAME: DOCKER
|
|
119
|
+
|
|
120
|
+
# Required for a single node cluster
|
|
121
|
+
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
|
|
122
|
+
|
|
123
|
+
# Disable auto-topic creation - API server will create topics with correct partitions
|
|
124
|
+
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
|
|
125
|
+
volumes:
|
|
126
|
+
- "kafka_data:/var/lib/kafka/data"`,
|
|
127
|
+
'kafka-ui': ` kafka-ui:
|
|
128
|
+
image: kafbat/kafka-ui:main
|
|
129
|
+
container_name: kafka-ui
|
|
130
|
+
ports:
|
|
131
|
+
- 8080:8080
|
|
132
|
+
environment:
|
|
133
|
+
DYNAMIC_CONFIG_ENABLED: "true"
|
|
134
|
+
KAFKA_CLUSTERS_0_NAME: local
|
|
135
|
+
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9093
|
|
136
|
+
depends_on:
|
|
137
|
+
- kafka`,
|
|
138
|
+
'redis': ` redis:
|
|
139
|
+
image: redis:7-alpine
|
|
140
|
+
container_name: redis
|
|
141
|
+
ports:
|
|
142
|
+
- "6379:6379"
|
|
143
|
+
command: redis-server --appendonly yes
|
|
144
|
+
volumes:
|
|
145
|
+
- "redis_data:/data"
|
|
146
|
+
healthcheck:
|
|
147
|
+
test: [ "CMD", "redis-cli", "ping" ]
|
|
148
|
+
interval: 5s
|
|
149
|
+
timeout: 3s
|
|
150
|
+
retries: 5`,
|
|
151
|
+
'loki': ` loki:
|
|
152
|
+
image: grafana/loki:2.9.0
|
|
153
|
+
container_name: loki
|
|
154
|
+
ports:
|
|
155
|
+
- "3100:3100"
|
|
156
|
+
command: -config.file=/etc/loki/local-config.yaml
|
|
157
|
+
volumes:
|
|
158
|
+
- "loki_data:/loki"
|
|
159
|
+
healthcheck:
|
|
160
|
+
test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1" ]
|
|
161
|
+
interval: 10s
|
|
162
|
+
timeout: 5s
|
|
163
|
+
retries: 5`,
|
|
164
|
+
'grafana': ` grafana:
|
|
165
|
+
image: grafana/grafana:10.2.0
|
|
166
|
+
container_name: grafana
|
|
167
|
+
ports:
|
|
168
|
+
- "3001:3000"
|
|
169
|
+
environment:
|
|
170
|
+
- GF_PATHS_PROVISIONING=/etc/grafana/provisioning
|
|
171
|
+
- GF_AUTH_ANONYMOUS_ENABLED=true
|
|
172
|
+
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
|
|
173
|
+
- GF_SECURITY_ADMIN_PASSWORD=admin
|
|
174
|
+
volumes:
|
|
175
|
+
- "grafana_data:/var/lib/grafana"
|
|
176
|
+
depends_on:
|
|
177
|
+
loki:
|
|
178
|
+
condition: service_healthy`,
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* Service-to-volumes mapping
|
|
182
|
+
*/
|
|
183
|
+
const SERVICE_VOLUMES = {
|
|
184
|
+
'mongo': ['mongo_data', 'mongo_config'],
|
|
185
|
+
'kafka': ['kafka_data'],
|
|
186
|
+
'kafka-ui': [],
|
|
187
|
+
'redis': ['redis_data'],
|
|
188
|
+
'loki': ['loki_data'],
|
|
189
|
+
'grafana': ['grafana_data'],
|
|
190
|
+
};
|
|
191
|
+
/**
|
|
192
|
+
* Build docker-compose content from selected services
|
|
193
|
+
*/
|
|
194
|
+
function buildInfraCompose(selectedServices) {
|
|
195
|
+
// Header
|
|
196
|
+
const header = `# ============================================
|
|
197
|
+
# INFRA_HOST: Set this in .env to your machine's IP/hostname when running
|
|
198
|
+
# infrastructure on a separate system from application services.
|
|
199
|
+
# Default: host.docker.internal (for same-system deployment)
|
|
200
|
+
# ============================================
|
|
201
|
+
|
|
202
|
+
services:
|
|
203
|
+
# ============================================
|
|
204
|
+
# Infrastructure Services
|
|
205
|
+
# ============================================`;
|
|
206
|
+
// Assemble selected service chunks
|
|
207
|
+
const serviceBlocks = [];
|
|
208
|
+
for (const service of selectedServices) {
|
|
209
|
+
if (SERVICE_CHUNKS[service]) {
|
|
210
|
+
serviceBlocks.push(SERVICE_CHUNKS[service]);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Collect volumes for selected services
|
|
214
|
+
const volumeSet = new Set();
|
|
215
|
+
for (const service of selectedServices) {
|
|
216
|
+
const volumes = SERVICE_VOLUMES[service] || [];
|
|
217
|
+
volumes.forEach(v => volumeSet.add(v));
|
|
218
|
+
}
|
|
219
|
+
// Build volumes section
|
|
220
|
+
const volumeLines = ['', 'volumes:'];
|
|
221
|
+
for (const volume of Array.from(volumeSet).sort()) {
|
|
222
|
+
volumeLines.push(` ${volume}:`);
|
|
223
|
+
}
|
|
224
|
+
// Build networks section with custom default network name
|
|
225
|
+
const networkLines = ['', 'networks:', ' default:', ' name: simplens'];
|
|
226
|
+
// Combine all parts
|
|
227
|
+
return [
|
|
228
|
+
header,
|
|
229
|
+
serviceBlocks.join('\n\n'),
|
|
230
|
+
volumeLines.join('\n'),
|
|
231
|
+
networkLines.join('\n'),
|
|
232
|
+
].join('\n');
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Replace INFRA_HOST placeholder in template
|
|
236
|
+
*/
|
|
237
|
+
export function replaceInfraHost(template, infraHost) {
|
|
238
|
+
return template.replace(/\{\{INFRA_HOST\}\}/g, infraHost);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Generate and write docker-compose.infra.yaml
|
|
242
|
+
*/
|
|
243
|
+
export async function generateInfraCompose(targetDir, selectedServices) {
|
|
244
|
+
logInfo('Generating docker-compose.infra.yaml...');
|
|
245
|
+
// Get infrastructure host
|
|
246
|
+
const infraHost = getInfraHost();
|
|
247
|
+
logSuccess(`Using infrastructure host: ${infraHost}`);
|
|
248
|
+
// Build compose content from service chunks
|
|
249
|
+
let infraContent = buildInfraCompose(selectedServices);
|
|
250
|
+
// Replace host placeholder
|
|
251
|
+
infraContent = replaceInfraHost(infraContent, infraHost);
|
|
252
|
+
// Write infrastructure compose file
|
|
253
|
+
const infraPath = path.join(targetDir, 'docker-compose.infra.yaml');
|
|
254
|
+
await writeFile(infraPath, infraContent);
|
|
255
|
+
logSuccess('Generated docker-compose.infra.yaml');
|
|
256
|
+
// Return infraHost for env configuration
|
|
257
|
+
return infraHost;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Write app docker-compose.yaml
|
|
261
|
+
*/
|
|
262
|
+
export async function writeAppCompose(targetDir) {
|
|
263
|
+
const appPath = path.join(targetDir, 'docker-compose.yaml');
|
|
264
|
+
await writeFile(appPath, APP_COMPOSE_TEMPLATE);
|
|
265
|
+
logSuccess('Generated docker-compose.yaml');
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=infra.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infra.js","sourceRoot":"","sources":["../src/infra.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { PluginInfo } from './types/domain.js';
|
|
2
|
+
/**
|
|
3
|
+
* Fetches available SimpleNS plugins using the config-gen CLI tool.
|
|
4
|
+
* Falls back to default plugins if fetching fails.
|
|
5
|
+
*
|
|
6
|
+
* @returns Array of available plugin information
|
|
7
|
+
*
|
|
8
|
+
* @remarks
|
|
9
|
+
* Uses `npx @simplens/config-gen list --official` to fetch plugins.
|
|
10
|
+
* Default fallback plugins: mock, nodemailer-gmail, resend
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const plugins = await fetchAvailablePlugins();
|
|
15
|
+
* // Returns: [{ package: '@simplens/mock', name: 'Mock Provider', ... }, ...]
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare function fetchAvailablePlugins(): Promise<PluginInfo[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Prompt user to select plugins
|
|
21
|
+
*/
|
|
22
|
+
export declare function promptPluginSelection(availablePlugins: PluginInfo[]): Promise<string[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Generate plugin configuration using config-gen
|
|
25
|
+
*/
|
|
26
|
+
export declare function generatePluginConfig(targetDir: string, selectedPlugins: string[]): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Parse simplens.config.yaml to extract credential keys
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseConfigCredentials(configPath: string): Promise<string[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Prompt for plugin-specific credentials
|
|
33
|
+
*/
|
|
34
|
+
export declare function promptPluginCredentials(credentialKeys: string[]): Promise<Map<string, string>>;
|
|
35
|
+
//# sourceMappingURL=plugins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,mBAAmB,CAAC;AAEpE;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAwCnE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,gBAAgB,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoB7F;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACtC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BlF;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA+BpG"}
|
package/dist/plugins.js
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import yaml from 'js-yaml';
|
|
4
|
+
import { readFile, logInfo, logSuccess, logError, logWarning } from './utils.js';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
/**
|
|
7
|
+
* Fetches available SimpleNS plugins using the config-gen CLI tool.
|
|
8
|
+
* Falls back to default plugins if fetching fails.
|
|
9
|
+
*
|
|
10
|
+
* @returns Array of available plugin information
|
|
11
|
+
*
|
|
12
|
+
* @remarks
|
|
13
|
+
* Uses `npx @simplens/config-gen list --official` to fetch plugins.
|
|
14
|
+
* Default fallback plugins: mock, nodemailer-gmail, resend
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const plugins = await fetchAvailablePlugins();
|
|
19
|
+
* // Returns: [{ package: '@simplens/mock', name: 'Mock Provider', ... }, ...]
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export async function fetchAvailablePlugins() {
|
|
23
|
+
logInfo('Fetching available plugins...');
|
|
24
|
+
try {
|
|
25
|
+
// Execute config-gen list command
|
|
26
|
+
const { stdout } = await execa('npx', ['@simplens/config-gen', 'list', '--official'], {
|
|
27
|
+
stdio: 'pipe',
|
|
28
|
+
});
|
|
29
|
+
// Parse output to extract plugins
|
|
30
|
+
// Expected format: " @simplens/package-name Plugin Name"
|
|
31
|
+
const plugins = [];
|
|
32
|
+
const lines = stdout.split('\n');
|
|
33
|
+
for (const line of lines) {
|
|
34
|
+
// Match plugin lines (starts with @simplens/)
|
|
35
|
+
const match = line.match(/^\s+(@simplens\/[\w-]+)\s+(.+)$/);
|
|
36
|
+
if (match) {
|
|
37
|
+
const [, packageName, rest] = match;
|
|
38
|
+
// Extract name and description
|
|
39
|
+
const parts = rest.split(/\s{2,}/); // Split by multiple spaces
|
|
40
|
+
plugins.push({
|
|
41
|
+
package: packageName.trim(),
|
|
42
|
+
name: parts[0]?.trim() || packageName,
|
|
43
|
+
description: parts[1]?.trim() || '',
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
logSuccess(`Found ${plugins.length} available plugins`);
|
|
48
|
+
return plugins;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
logWarning('Could not fetch plugins list. Using defaults.');
|
|
52
|
+
// Return default plugins as fallback
|
|
53
|
+
return [
|
|
54
|
+
{ package: '@simplens/mock', name: 'Mock Provider', description: 'Mock notification provider for testing' },
|
|
55
|
+
{ package: '@simplens/nodemailer-gmail', name: 'Gmail', description: 'Send emails via Gmail' },
|
|
56
|
+
{ package: '@simplens/resend', name: 'Resend', description: 'Send emails via Resend' },
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Prompt user to select plugins
|
|
62
|
+
*/
|
|
63
|
+
export async function promptPluginSelection(availablePlugins) {
|
|
64
|
+
if (availablePlugins.length === 0) {
|
|
65
|
+
logWarning('No plugins available to select.');
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
const answer = await inquirer.prompt([
|
|
69
|
+
{
|
|
70
|
+
type: 'checkbox',
|
|
71
|
+
name: 'plugins',
|
|
72
|
+
message: 'Select plugins to install:',
|
|
73
|
+
choices: availablePlugins.map(p => ({
|
|
74
|
+
name: `${p.name} (${p.package}) - ${p.description}`,
|
|
75
|
+
value: p.package,
|
|
76
|
+
checked: p.package === '@simplens/mock', // Mock checked by default
|
|
77
|
+
})),
|
|
78
|
+
},
|
|
79
|
+
]);
|
|
80
|
+
return answer.plugins;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Generate plugin configuration using config-gen
|
|
84
|
+
*/
|
|
85
|
+
export async function generatePluginConfig(targetDir, selectedPlugins) {
|
|
86
|
+
if (selectedPlugins.length === 0) {
|
|
87
|
+
logInfo('No plugins selected, skipping config generation.');
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
logInfo(`Generating configuration for ${selectedPlugins.length} plugin(s)...`);
|
|
91
|
+
try {
|
|
92
|
+
const configPath = path.join(targetDir, 'simplens.config.yaml');
|
|
93
|
+
// Execute config-gen for all selected plugins
|
|
94
|
+
// Use relative path to avoid WSL path issues when npx runs Windows binaries
|
|
95
|
+
await execa('npx', ['@simplens/config-gen', 'gen', ...selectedPlugins, '-o', 'simplens.config.yaml'], { cwd: targetDir, stdio: 'inherit' });
|
|
96
|
+
logSuccess('Generated simplens.config.yaml');
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
logError('Failed to generate plugin configuration');
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Parse simplens.config.yaml to extract credential keys
|
|
105
|
+
*/
|
|
106
|
+
export async function parseConfigCredentials(configPath) {
|
|
107
|
+
try {
|
|
108
|
+
const content = await readFile(configPath);
|
|
109
|
+
const config = yaml.load(content);
|
|
110
|
+
const credentialKeys = new Set();
|
|
111
|
+
// Extract credential keys from providers (ONLY from credentials, not optionalConfig)
|
|
112
|
+
if (config.providers && Array.isArray(config.providers)) {
|
|
113
|
+
for (const provider of config.providers) {
|
|
114
|
+
if (provider.credentials && typeof provider.credentials === 'object') {
|
|
115
|
+
for (const [key, value] of Object.entries(provider.credentials)) {
|
|
116
|
+
// Extract env var name from ${ENV_VAR} format
|
|
117
|
+
if (typeof value === 'string' && value.startsWith('${') && value.endsWith('}')) {
|
|
118
|
+
const envVar = value.slice(2, -1);
|
|
119
|
+
credentialKeys.add(envVar);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// NOTE: We intentionally skip optionalConfig - those are optional!
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return Array.from(credentialKeys);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
logWarning('Could not parse config file for credentials');
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Prompt for plugin-specific credentials
|
|
135
|
+
*/
|
|
136
|
+
export async function promptPluginCredentials(credentialKeys) {
|
|
137
|
+
if (credentialKeys.length === 0) {
|
|
138
|
+
logInfo('No plugin credentials required.');
|
|
139
|
+
return new Map();
|
|
140
|
+
}
|
|
141
|
+
logInfo('Configuring plugin credentials...');
|
|
142
|
+
const result = new Map();
|
|
143
|
+
for (const key of credentialKeys) {
|
|
144
|
+
const answer = await inquirer.prompt([
|
|
145
|
+
{
|
|
146
|
+
type: key.toLowerCase().includes('password') || key.toLowerCase().includes('key')
|
|
147
|
+
? 'password'
|
|
148
|
+
: 'input',
|
|
149
|
+
name: 'value',
|
|
150
|
+
message: `${key}:`,
|
|
151
|
+
validate: (input) => {
|
|
152
|
+
if (!input || input.trim().length === 0) {
|
|
153
|
+
return `${key} is required`;
|
|
154
|
+
}
|
|
155
|
+
return true;
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
]);
|
|
159
|
+
result.set(key, answer.value);
|
|
160
|
+
}
|
|
161
|
+
logSuccess('Plugin credentials configured');
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompts user whether to start the services immediately after setup.
|
|
3
|
+
*
|
|
4
|
+
* @returns `true` if user wants to start services, `false` otherwise
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* if (await promptStartServices()) {
|
|
9
|
+
* await startInfraServices(targetDir);
|
|
10
|
+
* }
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export declare function promptStartServices(): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Starts infrastructure services using docker-compose.
|
|
16
|
+
* Runs `docker-compose -f docker-compose.infra.yaml up -d` in the target directory.
|
|
17
|
+
*
|
|
18
|
+
* @param targetDir - Directory containing docker-compose.infra.yaml
|
|
19
|
+
* @throws Error if docker-compose command fails
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* await startInfraServices('/opt/simplens');
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function startInfraServices(targetDir: string): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Waits for infrastructure services to become healthy.
|
|
29
|
+
* Polls Docker health checks for up to 60 seconds (30 retries × 2s).
|
|
30
|
+
*
|
|
31
|
+
* @param targetDir - Directory where services are running
|
|
32
|
+
*
|
|
33
|
+
* @remarks
|
|
34
|
+
* Checks for healthy containers running MongoDB or Redis.
|
|
35
|
+
* Configuration: 30 max retries, 2000ms delay between retries.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* await startInfraServices(targetDir);
|
|
40
|
+
* await waitForInfraHealth(targetDir); // Wait for services to be ready
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function waitForInfraHealth(targetDir: string): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Start application services
|
|
46
|
+
*/
|
|
47
|
+
export declare function startAppServices(targetDir: string): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Display service status and URLs
|
|
50
|
+
*/
|
|
51
|
+
export declare function displayServiceStatus(): Promise<void>;
|
|
52
|
+
//# sourceMappingURL=services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAW5D;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCzE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2C1D"}
|