@git.zone/cli 1.16.8 → 1.17.1
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/dist_ts/00_commitinfo_data.js +2 -2
- package/dist_ts/gitzone.cli.js +8 -1
- package/dist_ts/mod_format/classes.baseformatter.js +12 -2
- package/dist_ts/mod_format/format.gitignore.js +27 -7
- package/dist_ts/mod_format/format.packagejson.js +3 -3
- package/dist_ts/mod_format/formatters/prettier.formatter.js +61 -37
- package/dist_ts/mod_format/index.js +1 -1
- package/dist_ts/mod_services/classes.dockercontainer.d.ts +68 -0
- package/dist_ts/mod_services/classes.dockercontainer.js +194 -0
- package/dist_ts/mod_services/classes.serviceconfiguration.d.ts +69 -0
- package/dist_ts/mod_services/classes.serviceconfiguration.js +195 -0
- package/dist_ts/mod_services/classes.servicemanager.d.ts +49 -0
- package/dist_ts/mod_services/classes.servicemanager.js +363 -0
- package/dist_ts/mod_services/helpers.d.ts +24 -0
- package/dist_ts/mod_services/helpers.js +108 -0
- package/dist_ts/mod_services/index.d.ts +1 -0
- package/dist_ts/mod_services/index.js +184 -0
- package/dist_ts/mod_services/mod.plugins.d.ts +7 -0
- package/dist_ts/mod_services/mod.plugins.js +8 -0
- package/dist_ts/plugins.d.ts +6 -1
- package/dist_ts/plugins.js +7 -2
- package/npmextra.json +1 -1
- package/package.json +29 -24
- package/readme.hints.md +8 -3
- package/readme.md +151 -17
- package/readme.plan.md +119 -168
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/gitzone.cli.ts +8 -0
- package/ts/mod_format/classes.baseformatter.ts +13 -1
- package/ts/mod_format/format.gitignore.ts +31 -6
- package/ts/mod_format/format.packagejson.ts +2 -2
- package/ts/mod_format/formatters/prettier.formatter.ts +76 -43
- package/ts/mod_format/index.ts +4 -1
- package/ts/mod_services/classes.dockercontainer.ts +227 -0
- package/ts/mod_services/classes.serviceconfiguration.ts +246 -0
- package/ts/mod_services/classes.servicemanager.ts +423 -0
- package/ts/mod_services/helpers.ts +123 -0
- package/ts/mod_services/index.ts +219 -0
- package/ts/mod_services/mod.plugins.ts +9 -0
- package/ts/plugins.ts +10 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import * as plugins from './mod.plugins.js';
|
|
2
|
+
import * as helpers from './helpers.js';
|
|
3
|
+
import { ServiceConfiguration } from './classes.serviceconfiguration.js';
|
|
4
|
+
import { DockerContainer } from './classes.dockercontainer.js';
|
|
5
|
+
import { logger } from '../gitzone.logging.js';
|
|
6
|
+
export class ServiceManager {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.config = new ServiceConfiguration();
|
|
9
|
+
this.docker = new DockerContainer();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Initialize the service manager
|
|
13
|
+
*/
|
|
14
|
+
async init() {
|
|
15
|
+
// Check Docker availability
|
|
16
|
+
if (!(await this.docker.checkDocker())) {
|
|
17
|
+
logger.log('error', 'Error: Docker is not installed. Please install Docker first.');
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
// Load or create configuration
|
|
21
|
+
await this.config.loadOrCreate();
|
|
22
|
+
logger.log('info', `📋 Project: ${this.config.getConfig().PROJECT_NAME}`);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Start MongoDB service
|
|
26
|
+
*/
|
|
27
|
+
async startMongoDB() {
|
|
28
|
+
logger.log('note', '📦 MongoDB:');
|
|
29
|
+
const config = this.config.getConfig();
|
|
30
|
+
const containers = this.config.getContainerNames();
|
|
31
|
+
const directories = this.config.getDataDirectories();
|
|
32
|
+
// Ensure data directory exists
|
|
33
|
+
await plugins.smartfile.fs.ensureDir(directories.mongo);
|
|
34
|
+
const status = await this.docker.getStatus(containers.mongo);
|
|
35
|
+
switch (status) {
|
|
36
|
+
case 'running':
|
|
37
|
+
logger.log('ok', ' Already running ✓');
|
|
38
|
+
break;
|
|
39
|
+
case 'stopped':
|
|
40
|
+
if (await this.docker.start(containers.mongo)) {
|
|
41
|
+
logger.log('ok', ' Started ✓');
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
logger.log('error', ' Failed to start');
|
|
45
|
+
}
|
|
46
|
+
break;
|
|
47
|
+
case 'not_exists':
|
|
48
|
+
logger.log('note', ' Creating container...');
|
|
49
|
+
const success = await this.docker.run({
|
|
50
|
+
name: containers.mongo,
|
|
51
|
+
image: 'mongo:7.0',
|
|
52
|
+
ports: {
|
|
53
|
+
[`0.0.0.0:${config.MONGODB_PORT}`]: '27017'
|
|
54
|
+
},
|
|
55
|
+
volumes: {
|
|
56
|
+
[directories.mongo]: '/data/db'
|
|
57
|
+
},
|
|
58
|
+
environment: {
|
|
59
|
+
MONGO_INITDB_ROOT_USERNAME: config.MONGODB_USER,
|
|
60
|
+
MONGO_INITDB_ROOT_PASSWORD: config.MONGODB_PASS,
|
|
61
|
+
MONGO_INITDB_DATABASE: config.MONGODB_NAME
|
|
62
|
+
},
|
|
63
|
+
restart: 'unless-stopped'
|
|
64
|
+
});
|
|
65
|
+
if (success) {
|
|
66
|
+
logger.log('ok', ' Created and started ✓');
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
logger.log('error', ' Failed to create container');
|
|
70
|
+
}
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
logger.log('info', ` Container: ${containers.mongo}`);
|
|
74
|
+
logger.log('info', ` Port: ${config.MONGODB_PORT}`);
|
|
75
|
+
logger.log('info', ` Connection: ${this.config.getMongoConnectionString()}`);
|
|
76
|
+
// Show Compass connection string
|
|
77
|
+
const networkIp = await helpers.getLocalNetworkIp();
|
|
78
|
+
const compassString = `mongodb://${config.MONGODB_USER}:${config.MONGODB_PASS}@${networkIp}:${config.MONGODB_PORT}/${config.MONGODB_NAME}?authSource=admin`;
|
|
79
|
+
logger.log('ok', ` Compass: ${compassString}`);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Start MinIO service
|
|
83
|
+
*/
|
|
84
|
+
async startMinIO() {
|
|
85
|
+
logger.log('note', '📦 S3/MinIO:');
|
|
86
|
+
const config = this.config.getConfig();
|
|
87
|
+
const containers = this.config.getContainerNames();
|
|
88
|
+
const directories = this.config.getDataDirectories();
|
|
89
|
+
// Ensure data directory exists
|
|
90
|
+
await plugins.smartfile.fs.ensureDir(directories.minio);
|
|
91
|
+
const status = await this.docker.getStatus(containers.minio);
|
|
92
|
+
switch (status) {
|
|
93
|
+
case 'running':
|
|
94
|
+
logger.log('ok', ' Already running ✓');
|
|
95
|
+
break;
|
|
96
|
+
case 'stopped':
|
|
97
|
+
if (await this.docker.start(containers.minio)) {
|
|
98
|
+
logger.log('ok', ' Started ✓');
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
logger.log('error', ' Failed to start');
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
case 'not_exists':
|
|
105
|
+
logger.log('note', ' Creating container...');
|
|
106
|
+
const success = await this.docker.run({
|
|
107
|
+
name: containers.minio,
|
|
108
|
+
image: 'minio/minio',
|
|
109
|
+
ports: {
|
|
110
|
+
[config.S3_PORT]: '9000',
|
|
111
|
+
[config.S3_CONSOLE_PORT]: '9001'
|
|
112
|
+
},
|
|
113
|
+
volumes: {
|
|
114
|
+
[directories.minio]: '/data'
|
|
115
|
+
},
|
|
116
|
+
environment: {
|
|
117
|
+
MINIO_ROOT_USER: config.S3_USER,
|
|
118
|
+
MINIO_ROOT_PASSWORD: config.S3_PASS
|
|
119
|
+
},
|
|
120
|
+
restart: 'unless-stopped',
|
|
121
|
+
command: 'server /data --console-address ":9001"'
|
|
122
|
+
});
|
|
123
|
+
if (success) {
|
|
124
|
+
logger.log('ok', ' Created and started ✓');
|
|
125
|
+
// Wait for MinIO to be ready
|
|
126
|
+
await plugins.smartdelay.delayFor(3000);
|
|
127
|
+
// Create default bucket
|
|
128
|
+
await this.docker.exec(containers.minio, `mc alias set local http://localhost:9000 ${config.S3_USER} ${config.S3_PASS}`);
|
|
129
|
+
await this.docker.exec(containers.minio, `mc mb local/${config.S3_BUCKET}`);
|
|
130
|
+
logger.log('ok', ` Bucket '${config.S3_BUCKET}' created ✓`);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
logger.log('error', ' Failed to create container');
|
|
134
|
+
}
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
logger.log('info', ` Container: ${containers.minio}`);
|
|
138
|
+
logger.log('info', ` Port: ${config.S3_PORT}`);
|
|
139
|
+
logger.log('info', ` Bucket: ${config.S3_BUCKET}`);
|
|
140
|
+
logger.log('info', ` API: http://${config.S3_HOST}:${config.S3_PORT}`);
|
|
141
|
+
logger.log('info', ` Console: http://${config.S3_HOST}:${config.S3_CONSOLE_PORT} (login: ${config.S3_USER}/***)`);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Stop MongoDB service
|
|
145
|
+
*/
|
|
146
|
+
async stopMongoDB() {
|
|
147
|
+
logger.log('note', '📦 MongoDB:');
|
|
148
|
+
const containers = this.config.getContainerNames();
|
|
149
|
+
const status = await this.docker.getStatus(containers.mongo);
|
|
150
|
+
if (status === 'running') {
|
|
151
|
+
if (await this.docker.stop(containers.mongo)) {
|
|
152
|
+
logger.log('ok', ' Stopped ✓');
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
logger.log('error', ' Failed to stop');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
logger.log('note', ' Not running');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Stop MinIO service
|
|
164
|
+
*/
|
|
165
|
+
async stopMinIO() {
|
|
166
|
+
logger.log('note', '📦 S3/MinIO:');
|
|
167
|
+
const containers = this.config.getContainerNames();
|
|
168
|
+
const status = await this.docker.getStatus(containers.minio);
|
|
169
|
+
if (status === 'running') {
|
|
170
|
+
if (await this.docker.stop(containers.minio)) {
|
|
171
|
+
logger.log('ok', ' Stopped ✓');
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
logger.log('error', ' Failed to stop');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
logger.log('note', ' Not running');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Show service status
|
|
183
|
+
*/
|
|
184
|
+
async showStatus() {
|
|
185
|
+
helpers.printHeader('Service Status');
|
|
186
|
+
const config = this.config.getConfig();
|
|
187
|
+
const containers = this.config.getContainerNames();
|
|
188
|
+
logger.log('info', `Project: ${config.PROJECT_NAME}`);
|
|
189
|
+
console.log();
|
|
190
|
+
// MongoDB status
|
|
191
|
+
const mongoStatus = await this.docker.getStatus(containers.mongo);
|
|
192
|
+
switch (mongoStatus) {
|
|
193
|
+
case 'running':
|
|
194
|
+
logger.log('ok', '📦 MongoDB: 🟢 Running');
|
|
195
|
+
logger.log('info', ` ├─ Container: ${containers.mongo}`);
|
|
196
|
+
logger.log('info', ` ├─ Connection: ${this.config.getMongoConnectionString()}`);
|
|
197
|
+
// Show Compass connection string
|
|
198
|
+
const networkIp = await helpers.getLocalNetworkIp();
|
|
199
|
+
const compassString = `mongodb://${config.MONGODB_USER}:${config.MONGODB_PASS}@${networkIp}:${config.MONGODB_PORT}/${config.MONGODB_NAME}?authSource=admin`;
|
|
200
|
+
logger.log('ok', ` └─ Compass: ${compassString}`);
|
|
201
|
+
break;
|
|
202
|
+
case 'stopped':
|
|
203
|
+
logger.log('note', '📦 MongoDB: 🟡 Stopped');
|
|
204
|
+
logger.log('info', ` └─ Container: ${containers.mongo}`);
|
|
205
|
+
break;
|
|
206
|
+
case 'not_exists':
|
|
207
|
+
logger.log('info', '📦 MongoDB: ⚪ Not installed');
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
// MinIO status
|
|
211
|
+
const minioStatus = await this.docker.getStatus(containers.minio);
|
|
212
|
+
switch (minioStatus) {
|
|
213
|
+
case 'running':
|
|
214
|
+
logger.log('ok', '📦 S3/MinIO: 🟢 Running');
|
|
215
|
+
logger.log('info', ` ├─ Container: ${containers.minio}`);
|
|
216
|
+
logger.log('info', ` ├─ API: http://${config.S3_HOST}:${config.S3_PORT}`);
|
|
217
|
+
logger.log('info', ` ├─ Console: http://${config.S3_HOST}:${config.S3_CONSOLE_PORT}`);
|
|
218
|
+
logger.log('info', ` └─ Bucket: ${config.S3_BUCKET}`);
|
|
219
|
+
break;
|
|
220
|
+
case 'stopped':
|
|
221
|
+
logger.log('note', '📦 S3/MinIO: 🟡 Stopped');
|
|
222
|
+
logger.log('info', ` └─ Container: ${containers.minio}`);
|
|
223
|
+
break;
|
|
224
|
+
case 'not_exists':
|
|
225
|
+
logger.log('info', '📦 S3/MinIO: ⚪ Not installed');
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Show configuration
|
|
231
|
+
*/
|
|
232
|
+
async showConfig() {
|
|
233
|
+
helpers.printHeader('Current Configuration');
|
|
234
|
+
const config = this.config.getConfig();
|
|
235
|
+
logger.log('info', `Project: ${config.PROJECT_NAME}`);
|
|
236
|
+
console.log();
|
|
237
|
+
logger.log('note', 'MongoDB:');
|
|
238
|
+
logger.log('info', ` Host: ${config.MONGODB_HOST}:${config.MONGODB_PORT}`);
|
|
239
|
+
logger.log('info', ` Database: ${config.MONGODB_NAME}`);
|
|
240
|
+
logger.log('info', ` User: ${config.MONGODB_USER}`);
|
|
241
|
+
logger.log('info', ' Password: ***');
|
|
242
|
+
logger.log('info', ` Container: ${this.config.getContainerNames().mongo}`);
|
|
243
|
+
logger.log('info', ` Data: ${this.config.getDataDirectories().mongo}`);
|
|
244
|
+
logger.log('info', ` Connection: ${this.config.getMongoConnectionString()}`);
|
|
245
|
+
console.log();
|
|
246
|
+
logger.log('note', 'S3/MinIO:');
|
|
247
|
+
logger.log('info', ` Host: ${config.S3_HOST}`);
|
|
248
|
+
logger.log('info', ` API Port: ${config.S3_PORT}`);
|
|
249
|
+
logger.log('info', ` Console Port: ${config.S3_CONSOLE_PORT}`);
|
|
250
|
+
logger.log('info', ` User: ${config.S3_USER}`);
|
|
251
|
+
logger.log('info', ' Password: ***');
|
|
252
|
+
logger.log('info', ` Bucket: ${config.S3_BUCKET}`);
|
|
253
|
+
logger.log('info', ` Container: ${this.config.getContainerNames().minio}`);
|
|
254
|
+
logger.log('info', ` Data: ${this.config.getDataDirectories().minio}`);
|
|
255
|
+
logger.log('info', ` API URL: http://${config.S3_HOST}:${config.S3_PORT}`);
|
|
256
|
+
logger.log('info', ` Console URL: http://${config.S3_HOST}:${config.S3_CONSOLE_PORT}`);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Show MongoDB Compass connection string
|
|
260
|
+
*/
|
|
261
|
+
async showCompassConnection() {
|
|
262
|
+
helpers.printHeader('MongoDB Compass Connection');
|
|
263
|
+
const config = this.config.getConfig();
|
|
264
|
+
const networkIp = await helpers.getLocalNetworkIp();
|
|
265
|
+
const connectionString = `mongodb://${config.MONGODB_USER}:${config.MONGODB_PASS}@${networkIp}:${config.MONGODB_PORT}/${config.MONGODB_NAME}?authSource=admin`;
|
|
266
|
+
logger.log('info', 'MongoDB Compass is a GUI tool for MongoDB. To connect:');
|
|
267
|
+
console.log();
|
|
268
|
+
logger.log('info', '1. Download MongoDB Compass from:');
|
|
269
|
+
logger.log('info', ' https://www.mongodb.com/products/compass');
|
|
270
|
+
console.log();
|
|
271
|
+
logger.log('info', '2. Open Compass and paste this connection string:');
|
|
272
|
+
logger.log('ok', ` ${connectionString}`);
|
|
273
|
+
console.log();
|
|
274
|
+
logger.log('note', 'Connection Details:');
|
|
275
|
+
logger.log('info', ` Network IP: ${networkIp}`);
|
|
276
|
+
logger.log('info', ` Port: ${config.MONGODB_PORT}`);
|
|
277
|
+
logger.log('info', ` Database: ${config.MONGODB_NAME}`);
|
|
278
|
+
logger.log('info', ` Username: ${config.MONGODB_USER}`);
|
|
279
|
+
logger.log('info', ` Auth Source: admin`);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Show logs for a service
|
|
283
|
+
*/
|
|
284
|
+
async showLogs(service, lines = 20) {
|
|
285
|
+
const containers = this.config.getContainerNames();
|
|
286
|
+
switch (service) {
|
|
287
|
+
case 'mongo':
|
|
288
|
+
case 'mongodb':
|
|
289
|
+
if (await this.docker.isRunning(containers.mongo)) {
|
|
290
|
+
helpers.printHeader(`MongoDB Logs (last ${lines} lines)`);
|
|
291
|
+
const logs = await this.docker.logs(containers.mongo, lines);
|
|
292
|
+
console.log(logs);
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
logger.log('note', 'MongoDB container is not running');
|
|
296
|
+
}
|
|
297
|
+
break;
|
|
298
|
+
case 'minio':
|
|
299
|
+
case 's3':
|
|
300
|
+
if (await this.docker.isRunning(containers.minio)) {
|
|
301
|
+
helpers.printHeader(`S3/MinIO Logs (last ${lines} lines)`);
|
|
302
|
+
const logs = await this.docker.logs(containers.minio, lines);
|
|
303
|
+
console.log(logs);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
logger.log('note', 'S3/MinIO container is not running');
|
|
307
|
+
}
|
|
308
|
+
break;
|
|
309
|
+
case 'all':
|
|
310
|
+
case '':
|
|
311
|
+
await this.showLogs('mongo', lines);
|
|
312
|
+
console.log();
|
|
313
|
+
await this.showLogs('minio', lines);
|
|
314
|
+
break;
|
|
315
|
+
default:
|
|
316
|
+
logger.log('note', 'Usage: gitzone services logs [mongo|s3|all] [lines]');
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Remove containers
|
|
322
|
+
*/
|
|
323
|
+
async removeContainers() {
|
|
324
|
+
const containers = this.config.getContainerNames();
|
|
325
|
+
let removed = false;
|
|
326
|
+
if (await this.docker.exists(containers.mongo)) {
|
|
327
|
+
if (await this.docker.remove(containers.mongo, true)) {
|
|
328
|
+
logger.log('ok', ' MongoDB container removed ✓');
|
|
329
|
+
removed = true;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (await this.docker.exists(containers.minio)) {
|
|
333
|
+
if (await this.docker.remove(containers.minio, true)) {
|
|
334
|
+
logger.log('ok', ' S3/MinIO container removed ✓');
|
|
335
|
+
removed = true;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
if (!removed) {
|
|
339
|
+
logger.log('note', ' No containers to remove');
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Clean data directories
|
|
344
|
+
*/
|
|
345
|
+
async cleanData() {
|
|
346
|
+
const directories = this.config.getDataDirectories();
|
|
347
|
+
let cleaned = false;
|
|
348
|
+
if (await plugins.smartfile.fs.fileExists(directories.mongo)) {
|
|
349
|
+
await plugins.smartfile.fs.remove(directories.mongo);
|
|
350
|
+
logger.log('ok', ' MongoDB data removed ✓');
|
|
351
|
+
cleaned = true;
|
|
352
|
+
}
|
|
353
|
+
if (await plugins.smartfile.fs.fileExists(directories.minio)) {
|
|
354
|
+
await plugins.smartfile.fs.remove(directories.minio);
|
|
355
|
+
logger.log('ok', ' S3/MinIO data removed ✓');
|
|
356
|
+
cleaned = true;
|
|
357
|
+
}
|
|
358
|
+
if (!cleaned) {
|
|
359
|
+
logger.log('note', ' No data to clean');
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXJ2aWNlbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL21vZF9zZXJ2aWNlcy9jbGFzc2VzLnNlcnZpY2VtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxNQUFNLE9BQU8sY0FBYztJQUl6QjtRQUNFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsSUFBSTtRQUNmLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLDhEQUE4RCxDQUFDLENBQUM7WUFDcEYsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBRUQsK0JBQStCO1FBQy9CLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxlQUFlLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsWUFBWTtR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
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if a port is available
|
|
3
|
+
*/
|
|
4
|
+
export declare const isPortAvailable: (port: number) => Promise<boolean>;
|
|
5
|
+
/**
|
|
6
|
+
* Get a random available port between 20000 and 30000
|
|
7
|
+
*/
|
|
8
|
+
export declare const getRandomAvailablePort: () => Promise<number>;
|
|
9
|
+
/**
|
|
10
|
+
* Get the project name from package.json or directory
|
|
11
|
+
*/
|
|
12
|
+
export declare const getProjectName: () => string;
|
|
13
|
+
/**
|
|
14
|
+
* Print a header with decorative lines
|
|
15
|
+
*/
|
|
16
|
+
export declare const printHeader: (title: string) => void;
|
|
17
|
+
/**
|
|
18
|
+
* Format bytes to human readable string
|
|
19
|
+
*/
|
|
20
|
+
export declare const formatBytes: (bytes: number) => string;
|
|
21
|
+
/**
|
|
22
|
+
* Get the local network IP address
|
|
23
|
+
*/
|
|
24
|
+
export declare const getLocalNetworkIp: () => Promise<string>;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import * as plugins from './mod.plugins.js';
|
|
2
|
+
import * as net from 'net';
|
|
3
|
+
import { logger } from '../gitzone.logging.js';
|
|
4
|
+
/**
|
|
5
|
+
* Check if a port is available
|
|
6
|
+
*/
|
|
7
|
+
export const isPortAvailable = async (port) => {
|
|
8
|
+
return new Promise((resolve) => {
|
|
9
|
+
const server = net.createServer();
|
|
10
|
+
server.once('error', () => {
|
|
11
|
+
resolve(false);
|
|
12
|
+
});
|
|
13
|
+
server.once('listening', () => {
|
|
14
|
+
server.close();
|
|
15
|
+
resolve(true);
|
|
16
|
+
});
|
|
17
|
+
server.listen(port, '0.0.0.0');
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Get a random available port between 20000 and 30000
|
|
22
|
+
*/
|
|
23
|
+
export const getRandomAvailablePort = async () => {
|
|
24
|
+
const maxAttempts = 100;
|
|
25
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
26
|
+
const port = Math.floor(Math.random() * 10001) + 20000;
|
|
27
|
+
if (await isPortAvailable(port)) {
|
|
28
|
+
return port;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Fallback: let the system assign a port
|
|
32
|
+
return 0;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Get the project name from package.json or directory
|
|
36
|
+
*/
|
|
37
|
+
export const getProjectName = () => {
|
|
38
|
+
try {
|
|
39
|
+
const packageJsonPath = plugins.path.join(process.cwd(), 'package.json');
|
|
40
|
+
if (plugins.smartfile.fs.fileExistsSync(packageJsonPath)) {
|
|
41
|
+
const packageJson = plugins.smartfile.fs.toObjectSync(packageJsonPath);
|
|
42
|
+
if (packageJson.name) {
|
|
43
|
+
// Sanitize: @fin.cx/skr → fin-cx-skr
|
|
44
|
+
return packageJson.name.replace(/@/g, '').replace(/[\/\.]/g, '-');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
// Ignore errors and fall back to directory name
|
|
50
|
+
}
|
|
51
|
+
return plugins.path.basename(process.cwd());
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Print a header with decorative lines
|
|
55
|
+
*/
|
|
56
|
+
export const printHeader = (title) => {
|
|
57
|
+
console.log();
|
|
58
|
+
logger.log('info', '═══════════════════════════════════════════════════════════════');
|
|
59
|
+
logger.log('info', ` ${title}`);
|
|
60
|
+
logger.log('info', '═══════════════════════════════════════════════════════════════');
|
|
61
|
+
console.log();
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Format bytes to human readable string
|
|
65
|
+
*/
|
|
66
|
+
export const formatBytes = (bytes) => {
|
|
67
|
+
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
68
|
+
let size = bytes;
|
|
69
|
+
let unitIndex = 0;
|
|
70
|
+
while (size >= 1024 && unitIndex < units.length - 1) {
|
|
71
|
+
size /= 1024;
|
|
72
|
+
unitIndex++;
|
|
73
|
+
}
|
|
74
|
+
return `${size.toFixed(2)} ${units[unitIndex]}`;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Get the local network IP address
|
|
78
|
+
*/
|
|
79
|
+
export const getLocalNetworkIp = async () => {
|
|
80
|
+
const smartnetworkInstance = new plugins.smartnetwork.SmartNetwork();
|
|
81
|
+
const gateways = await smartnetworkInstance.getGateways();
|
|
82
|
+
// Find the best local IP from network interfaces
|
|
83
|
+
for (const interfaceName of Object.keys(gateways)) {
|
|
84
|
+
const interfaces = gateways[interfaceName];
|
|
85
|
+
for (const iface of interfaces) {
|
|
86
|
+
// Skip loopback and internal interfaces
|
|
87
|
+
if (!iface.internal && iface.family === 'IPv4') {
|
|
88
|
+
const address = iface.address;
|
|
89
|
+
// Prefer LAN IPs
|
|
90
|
+
if (address.startsWith('192.168.') || address.startsWith('10.') || address.startsWith('172.')) {
|
|
91
|
+
return address;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Fallback: try to get any non-internal IPv4
|
|
97
|
+
for (const interfaceName of Object.keys(gateways)) {
|
|
98
|
+
const interfaces = gateways[interfaceName];
|
|
99
|
+
for (const iface of interfaces) {
|
|
100
|
+
if (!iface.internal && iface.family === 'IPv4') {
|
|
101
|
+
return iface.address;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Last resort: localhost
|
|
106
|
+
return 'localhost';
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL21vZF9zZXJ2aWNlcy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRS9DOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEtBQUssRUFBRSxJQUFZLEVBQW9CLEVBQUU7SUFDdEUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDeEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1lBQzVCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLElBQXFCLEVBQUU7SUFDaEUsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0lBRXhCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLENB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const run: (argvArg: any) => Promise<void>;
|