jenkins-generator 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/.prettierrc +4 -0
- package/README.md +365 -0
- package/dist/app.controller.d.ts +6 -0
- package/dist/app.controller.js +35 -0
- package/dist/app.controller.js.map +1 -0
- package/dist/app.controller.spec.d.ts +1 -0
- package/dist/app.controller.spec.js +21 -0
- package/dist/app.controller.spec.js.map +1 -0
- package/dist/app.module.d.ts +2 -0
- package/dist/app.module.js +35 -0
- package/dist/app.module.js.map +1 -0
- package/dist/app.service.d.ts +3 -0
- package/dist/app.service.js +20 -0
- package/dist/app.service.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +32 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/config.interface.d.ts +70 -0
- package/dist/interfaces/config.interface.js +3 -0
- package/dist/interfaces/config.interface.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +3 -0
- package/dist/main.js.map +1 -0
- package/dist/services/cicd-generator.service.d.ts +14 -0
- package/dist/services/cicd-generator.service.js +158 -0
- package/dist/services/cicd-generator.service.js.map +1 -0
- package/dist/services/cloud-provider.service.d.ts +9 -0
- package/dist/services/cloud-provider.service.js +230 -0
- package/dist/services/cloud-provider.service.js.map +1 -0
- package/dist/services/jenkinsfile.service.d.ts +14 -0
- package/dist/services/jenkinsfile.service.js +414 -0
- package/dist/services/jenkinsfile.service.js.map +1 -0
- package/dist/services/notification.service.d.ts +10 -0
- package/dist/services/notification.service.js +235 -0
- package/dist/services/notification.service.js.map +1 -0
- package/dist/services/prompt.service.d.ts +16 -0
- package/dist/services/prompt.service.js +415 -0
- package/dist/services/prompt.service.js.map +1 -0
- package/dist/services/security.service.d.ts +9 -0
- package/dist/services/security.service.js +95 -0
- package/dist/services/security.service.js.map +1 -0
- package/dist/services/validation.service.d.ts +8 -0
- package/dist/services/validation.service.js +140 -0
- package/dist/services/validation.service.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/eslint.config.mjs +34 -0
- package/nest-cli.json +8 -0
- package/package.json +67 -0
- package/tsconfig.build.json +4 -0
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.PromptService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
18
|
+
const validation_service_1 = require("./validation.service");
|
|
19
|
+
let PromptService = class PromptService {
|
|
20
|
+
validationService;
|
|
21
|
+
constructor(validationService) {
|
|
22
|
+
this.validationService = validationService;
|
|
23
|
+
}
|
|
24
|
+
async collectAllConfigurations() {
|
|
25
|
+
const projectConfig = await this.collectProjectConfig();
|
|
26
|
+
const cloudConfig = await this.collectCloudConfig();
|
|
27
|
+
const notificationConfig = await this.collectNotificationConfig();
|
|
28
|
+
const jenkinsConfig = await this.collectJenkinsConfig();
|
|
29
|
+
return {
|
|
30
|
+
project: projectConfig,
|
|
31
|
+
cloud: cloudConfig,
|
|
32
|
+
notifications: notificationConfig,
|
|
33
|
+
jenkinsConfig,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
async collectProjectConfig() {
|
|
37
|
+
const answers = await inquirer_1.default.prompt([
|
|
38
|
+
{
|
|
39
|
+
type: 'input',
|
|
40
|
+
name: 'projectName',
|
|
41
|
+
message: 'Enter your project name:',
|
|
42
|
+
default: 'my-project',
|
|
43
|
+
validate: (input) => input.length > 0 || 'Project name is required',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
type: 'list',
|
|
47
|
+
name: 'projectType',
|
|
48
|
+
message: 'Select project type',
|
|
49
|
+
choices: ['frontend', 'backend', 'fullstack'],
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
type: 'list',
|
|
53
|
+
name: 'language',
|
|
54
|
+
message: 'Select programming language',
|
|
55
|
+
choices: ['javascript', 'typescript'],
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
type: 'input',
|
|
59
|
+
name: 'repository',
|
|
60
|
+
message: 'Enter Git repository URL:',
|
|
61
|
+
validate: (input) => {
|
|
62
|
+
try {
|
|
63
|
+
return (this.validationService.validateGitRepository(input) ||
|
|
64
|
+
'Invalid Git repository URL');
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return error.message;
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
type: 'input',
|
|
73
|
+
name: 'branch',
|
|
74
|
+
message: 'Enter branch name to deploy:',
|
|
75
|
+
default: 'master',
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
type: 'confirm',
|
|
79
|
+
name: 'hasDockerfile',
|
|
80
|
+
message: 'Does your project have a Dockerfile?',
|
|
81
|
+
default: true,
|
|
82
|
+
},
|
|
83
|
+
]);
|
|
84
|
+
if (answers.hasDockerfile) {
|
|
85
|
+
const dockerConfig = await inquirer_1.default.prompt([
|
|
86
|
+
{
|
|
87
|
+
type: 'input',
|
|
88
|
+
name: 'dockerfilePath',
|
|
89
|
+
message: 'Enter Dockerfile path (relative to project root):',
|
|
90
|
+
default: './Dockerfile',
|
|
91
|
+
},
|
|
92
|
+
]);
|
|
93
|
+
answers.dockerfilePath = dockerConfig.dockerfilePath;
|
|
94
|
+
await this.validationService.validateDockerfile(answers.dockerfilePath);
|
|
95
|
+
}
|
|
96
|
+
const buildAnswers = await inquirer_1.default.prompt([
|
|
97
|
+
{
|
|
98
|
+
type: 'confirm',
|
|
99
|
+
name: 'runTests',
|
|
100
|
+
message: 'Do you want to run tests during pipeline?',
|
|
101
|
+
default: true,
|
|
102
|
+
},
|
|
103
|
+
]);
|
|
104
|
+
answers.runTests = buildAnswers.runTests;
|
|
105
|
+
if (answers.runTests) {
|
|
106
|
+
const testCommand = await inquirer_1.default.prompt([
|
|
107
|
+
{
|
|
108
|
+
type: 'input',
|
|
109
|
+
name: 'testCommand',
|
|
110
|
+
message: 'Enter test command:',
|
|
111
|
+
default: 'npm test',
|
|
112
|
+
},
|
|
113
|
+
]);
|
|
114
|
+
answers.testCommand = testCommand.testCommand;
|
|
115
|
+
}
|
|
116
|
+
const buildConfig = await inquirer_1.default.prompt([
|
|
117
|
+
{
|
|
118
|
+
type: 'input',
|
|
119
|
+
name: 'buildCommand',
|
|
120
|
+
message: 'Enter build command:',
|
|
121
|
+
default: answers.language === 'typescript' ? 'npm run build' : 'npm run build',
|
|
122
|
+
},
|
|
123
|
+
]);
|
|
124
|
+
answers.buildCommand = buildConfig.buildCommand;
|
|
125
|
+
return answers;
|
|
126
|
+
}
|
|
127
|
+
async collectCloudConfig() {
|
|
128
|
+
const providerAnswer = await inquirer_1.default.prompt([
|
|
129
|
+
{
|
|
130
|
+
type: 'list',
|
|
131
|
+
name: 'provider',
|
|
132
|
+
message: 'Select cloud provider:',
|
|
133
|
+
choices: ['aws', 'azure', 'gcp', 'digitalocean'],
|
|
134
|
+
},
|
|
135
|
+
]);
|
|
136
|
+
const provider = providerAnswer.provider;
|
|
137
|
+
let credentials;
|
|
138
|
+
switch (provider) {
|
|
139
|
+
case 'aws':
|
|
140
|
+
credentials = await this.collectAWSCredentials();
|
|
141
|
+
break;
|
|
142
|
+
case 'azure':
|
|
143
|
+
credentials = await this.collectAzureCredentials();
|
|
144
|
+
break;
|
|
145
|
+
case 'gcp':
|
|
146
|
+
credentials = await this.collectGCPCredentials();
|
|
147
|
+
break;
|
|
148
|
+
case 'digitalocean':
|
|
149
|
+
credentials = await this.collectDOCredentials();
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
const deploymentConfig = await this.collectDeploymentConfig(provider);
|
|
153
|
+
return {
|
|
154
|
+
provider,
|
|
155
|
+
credentials,
|
|
156
|
+
region: credentials.region,
|
|
157
|
+
instanceType: deploymentConfig.instanceType,
|
|
158
|
+
deploymentConfig: deploymentConfig.config,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
async collectAWSCredentials() {
|
|
162
|
+
return await inquirer_1.default.prompt([
|
|
163
|
+
{
|
|
164
|
+
type: 'input',
|
|
165
|
+
name: 'accessKeyId',
|
|
166
|
+
message: 'Enter AWS Access Key ID:',
|
|
167
|
+
validate: (input) => input.length > 0 || 'Access Key ID is required',
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
type: 'password',
|
|
171
|
+
name: 'secretAccessKey',
|
|
172
|
+
message: 'Enter AWS Secret Access Key:',
|
|
173
|
+
mask: '*',
|
|
174
|
+
validate: (input) => input.length > 0 || 'Secret Access Key is required',
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
type: 'list',
|
|
178
|
+
name: 'region',
|
|
179
|
+
message: 'Select AWS region:',
|
|
180
|
+
choices: [
|
|
181
|
+
'us-east-1',
|
|
182
|
+
'us-west-2',
|
|
183
|
+
'eu-west-1',
|
|
184
|
+
'ap-south-1',
|
|
185
|
+
'ap-southeast-1',
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
]);
|
|
189
|
+
}
|
|
190
|
+
async collectAzureCredentials() {
|
|
191
|
+
return await inquirer_1.default.prompt([
|
|
192
|
+
{
|
|
193
|
+
type: 'input',
|
|
194
|
+
name: 'subscriptionId',
|
|
195
|
+
message: 'Enter Azure Subscription ID:',
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
type: 'input',
|
|
199
|
+
name: 'clientId',
|
|
200
|
+
message: 'Enter Azure Client ID:',
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
type: 'password',
|
|
204
|
+
name: 'clientSecret',
|
|
205
|
+
message: 'Enter Azure Client Secret:',
|
|
206
|
+
mask: '*',
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
type: 'input',
|
|
210
|
+
name: 'tenantId',
|
|
211
|
+
message: 'Enter Azure Tenant ID:',
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
type: 'list',
|
|
215
|
+
name: 'region',
|
|
216
|
+
message: 'Select Azure region:',
|
|
217
|
+
choices: [
|
|
218
|
+
'eastus',
|
|
219
|
+
'westus',
|
|
220
|
+
'centralus',
|
|
221
|
+
'westeurope',
|
|
222
|
+
'southeastasia',
|
|
223
|
+
],
|
|
224
|
+
},
|
|
225
|
+
]);
|
|
226
|
+
}
|
|
227
|
+
async collectGCPCredentials() {
|
|
228
|
+
return await inquirer_1.default.prompt([
|
|
229
|
+
{ type: 'input', name: 'projectId', message: 'Enter GCP Project ID:' },
|
|
230
|
+
{
|
|
231
|
+
type: 'input',
|
|
232
|
+
name: 'keyFile',
|
|
233
|
+
message: 'Enter path to GCP service account key file:',
|
|
234
|
+
validate: (input) => input.length > 0 || 'Key file path is required',
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
type: 'list',
|
|
238
|
+
name: 'region',
|
|
239
|
+
message: 'Select GCP region:',
|
|
240
|
+
choices: [
|
|
241
|
+
'us-central1',
|
|
242
|
+
'us-east1',
|
|
243
|
+
'europe-west1',
|
|
244
|
+
'asia-south1',
|
|
245
|
+
'asia-southeast1',
|
|
246
|
+
],
|
|
247
|
+
},
|
|
248
|
+
]);
|
|
249
|
+
}
|
|
250
|
+
async collectDOCredentials() {
|
|
251
|
+
return await inquirer_1.default.prompt([
|
|
252
|
+
{
|
|
253
|
+
type: 'password',
|
|
254
|
+
name: 'apiToken',
|
|
255
|
+
message: 'Enter DigitalOcean API Token:',
|
|
256
|
+
mask: '*',
|
|
257
|
+
validate: (input) => input.length > 0 || 'API Token is required',
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
type: 'list',
|
|
261
|
+
name: 'region',
|
|
262
|
+
message: 'Select DigitalOcean region:',
|
|
263
|
+
choices: ['nyc1', 'nyc3', 'sfo3', 'sgp1', 'lon1', 'fra1', 'blr1'],
|
|
264
|
+
},
|
|
265
|
+
]);
|
|
266
|
+
}
|
|
267
|
+
async collectDeploymentConfig(provider) {
|
|
268
|
+
const instanceChoices = {
|
|
269
|
+
aws: ['t2.micro', 't2.small', 't2.medium', 't3.micro', 't3.small'],
|
|
270
|
+
azure: ['Standard_B1s', 'Standard_B2s', 'Standard_D2s_v3'],
|
|
271
|
+
gcp: ['e2-micro', 'e2-small', 'e2-medium', 'n1-standard-1'],
|
|
272
|
+
digitalocean: ['s-1vcpu-1gb', 's-2vcpu-2gb', 's-2vcpu-4gb'],
|
|
273
|
+
};
|
|
274
|
+
const answers = await inquirer_1.default.prompt([
|
|
275
|
+
{
|
|
276
|
+
type: 'list',
|
|
277
|
+
name: 'instanceType',
|
|
278
|
+
message: 'Select instance/tier type',
|
|
279
|
+
choices: instanceChoices[provider],
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
type: 'input',
|
|
283
|
+
name: 'tier',
|
|
284
|
+
message: 'Enter deployment tier (e.g., dev, staging, production):',
|
|
285
|
+
default: 'production',
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
type: 'confirm',
|
|
289
|
+
name: 'autoScaling',
|
|
290
|
+
message: 'Enable auto-scaling?',
|
|
291
|
+
default: false,
|
|
292
|
+
},
|
|
293
|
+
]);
|
|
294
|
+
let minInstances = 1;
|
|
295
|
+
let maxInstances = 1;
|
|
296
|
+
if (answers.autoScaling) {
|
|
297
|
+
const scalingConfig = await inquirer_1.default.prompt([
|
|
298
|
+
{
|
|
299
|
+
type: 'number',
|
|
300
|
+
name: 'minInstances',
|
|
301
|
+
message: 'Enter minimum instances:',
|
|
302
|
+
default: 1,
|
|
303
|
+
validate: (input) => (input !== undefined && input > 0) || 'Must be greater than 0',
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
type: 'number',
|
|
307
|
+
name: 'maxInstances',
|
|
308
|
+
message: 'Enter maximum instances:',
|
|
309
|
+
default: 3,
|
|
310
|
+
validate: (input) => (input !== undefined && input > 0) || 'Must be greater than 0',
|
|
311
|
+
},
|
|
312
|
+
]);
|
|
313
|
+
minInstances = scalingConfig.minInstances;
|
|
314
|
+
maxInstances = scalingConfig.maxInstances;
|
|
315
|
+
}
|
|
316
|
+
const healthConfig = await inquirer_1.default.prompt([
|
|
317
|
+
{
|
|
318
|
+
type: 'input',
|
|
319
|
+
name: 'healthCheckPath',
|
|
320
|
+
message: 'Enter health check endpoint path:',
|
|
321
|
+
default: '/health',
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
type: 'number',
|
|
325
|
+
name: 'port',
|
|
326
|
+
message: 'Enter application port:',
|
|
327
|
+
default: 3000,
|
|
328
|
+
validate: (input) => (input !== undefined && this.validationService.validatePort(input)) ||
|
|
329
|
+
'Invalid port number',
|
|
330
|
+
},
|
|
331
|
+
]);
|
|
332
|
+
return {
|
|
333
|
+
instanceType: answers.instanceType,
|
|
334
|
+
config: {
|
|
335
|
+
tier: answers.tier,
|
|
336
|
+
autoScaling: answers.autoScaling,
|
|
337
|
+
minInstances,
|
|
338
|
+
maxInstances,
|
|
339
|
+
healthCheckPath: healthConfig.healthCheckPath,
|
|
340
|
+
port: healthConfig.port,
|
|
341
|
+
},
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
async collectNotificationConfig() {
|
|
345
|
+
const emailAnswer = await inquirer_1.default.prompt([
|
|
346
|
+
{
|
|
347
|
+
type: 'input',
|
|
348
|
+
name: 'email',
|
|
349
|
+
message: 'Enter email for notifications:',
|
|
350
|
+
validate: (input) => {
|
|
351
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
352
|
+
return emailRegex.test(input) || 'Invalid email format';
|
|
353
|
+
},
|
|
354
|
+
},
|
|
355
|
+
]);
|
|
356
|
+
const platformAnswer = await inquirer_1.default.prompt([
|
|
357
|
+
{
|
|
358
|
+
type: 'checkbox',
|
|
359
|
+
name: 'platforms',
|
|
360
|
+
message: 'Select additional notification platforms',
|
|
361
|
+
choices: ['slack', 'discord', 'teams', 'telegram'],
|
|
362
|
+
},
|
|
363
|
+
]);
|
|
364
|
+
const platforms = [];
|
|
365
|
+
const webhookUrls = {};
|
|
366
|
+
for (const platform of platformAnswer.platforms) {
|
|
367
|
+
const webhook = await inquirer_1.default.prompt([
|
|
368
|
+
{
|
|
369
|
+
type: 'input',
|
|
370
|
+
name: 'webhook',
|
|
371
|
+
message: `Enter ${platform} webhook URL:`,
|
|
372
|
+
validate: (input) => input.startsWith('http') || 'Invalid webhook URL',
|
|
373
|
+
},
|
|
374
|
+
]);
|
|
375
|
+
platforms.push({
|
|
376
|
+
type: platform,
|
|
377
|
+
webhook: webhook.webhook,
|
|
378
|
+
});
|
|
379
|
+
webhookUrls[platform] = webhook.webhook;
|
|
380
|
+
}
|
|
381
|
+
return {
|
|
382
|
+
email: emailAnswer.email,
|
|
383
|
+
platforms,
|
|
384
|
+
webhookUrls,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
async collectJenkinsConfig() {
|
|
388
|
+
return await inquirer_1.default.prompt([
|
|
389
|
+
{
|
|
390
|
+
type: 'input',
|
|
391
|
+
name: 'agentLabel',
|
|
392
|
+
message: 'Enter Jenkins agent label:',
|
|
393
|
+
default: 'docker',
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
type: 'number',
|
|
397
|
+
name: 'timeout',
|
|
398
|
+
message: 'Enter pipeline timeout (in minutes)',
|
|
399
|
+
default: 60,
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
type: 'number',
|
|
403
|
+
name: 'retryCount',
|
|
404
|
+
message: 'Enter retry count for failed stages:',
|
|
405
|
+
default: 2,
|
|
406
|
+
},
|
|
407
|
+
]);
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
exports.PromptService = PromptService;
|
|
411
|
+
exports.PromptService = PromptService = __decorate([
|
|
412
|
+
(0, common_1.Injectable)(),
|
|
413
|
+
__metadata("design:paramtypes", [validation_service_1.ValidationService])
|
|
414
|
+
], PromptService);
|
|
415
|
+
//# sourceMappingURL=prompt.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.service.js","sourceRoot":"","sources":["../../src/services/prompt.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class SecurityService {
|
|
2
|
+
private readonly ENCRYPTION_KEY;
|
|
3
|
+
private generateKey;
|
|
4
|
+
encryptCredentials(credentials: any): string;
|
|
5
|
+
decryptCredentials(encryptedData: string): any;
|
|
6
|
+
maskSensitiveData(data: string): string;
|
|
7
|
+
validCredentialFormat(type: string, credential: string): boolean;
|
|
8
|
+
generateSecureJenkinsCredentialId(credentialName: string): string;
|
|
9
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.SecurityService = void 0;
|
|
43
|
+
const common_1 = require("@nestjs/common");
|
|
44
|
+
const CryptoJS = __importStar(require("crypto-js"));
|
|
45
|
+
let SecurityService = class SecurityService {
|
|
46
|
+
ENCRYPTION_KEY = process.env.ENCRYPTION_KEY || this.generateKey();
|
|
47
|
+
generateKey() {
|
|
48
|
+
return CryptoJS.lib.WordArray.random(256 / 8).toString();
|
|
49
|
+
}
|
|
50
|
+
encryptCredentials(credentials) {
|
|
51
|
+
try {
|
|
52
|
+
const jsonString = JSON.stringify(credentials);
|
|
53
|
+
const encrypted = CryptoJS.AES.encrypt(jsonString, this.ENCRYPTION_KEY).toString();
|
|
54
|
+
return encrypted;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
throw new Error(`Encryption failed: ${error.message}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
decryptCredentials(encryptedData) {
|
|
61
|
+
try {
|
|
62
|
+
const decrypted = CryptoJS.AES.decrypt(encryptedData, this.ENCRYPTION_KEY);
|
|
63
|
+
const jsonString = decrypted.toString(CryptoJS.enc.Utf8);
|
|
64
|
+
return JSON.parse(jsonString);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
throw new Error(`Decryption failed: ${error.message}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
maskSensitiveData(data) {
|
|
71
|
+
if (data.length <= 8) {
|
|
72
|
+
return '*'.repeat(data.length);
|
|
73
|
+
}
|
|
74
|
+
return `${data.substring(0, 4)}${'*'.repeat(data.length - 8)}${data.substring(data.length - 8)}${data.substring(data.length - 4)}`;
|
|
75
|
+
}
|
|
76
|
+
validCredentialFormat(type, credential) {
|
|
77
|
+
const patterns = {
|
|
78
|
+
email: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
|
|
79
|
+
url: /^https?:\/\/.+/,
|
|
80
|
+
awsAccessKey: /^[A-Z0-9]{20}$/,
|
|
81
|
+
token: /^[\w-]+$/,
|
|
82
|
+
};
|
|
83
|
+
return patterns[type] ? patterns[type].test(credential) : true;
|
|
84
|
+
}
|
|
85
|
+
generateSecureJenkinsCredentialId(credentialName) {
|
|
86
|
+
const timestamp = Date.now();
|
|
87
|
+
const random = Math.random().toString(36).substring(2, 10);
|
|
88
|
+
return `${credentialName}-${timestamp}-${random}`;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
exports.SecurityService = SecurityService;
|
|
92
|
+
exports.SecurityService = SecurityService = __decorate([
|
|
93
|
+
(0, common_1.Injectable)()
|
|
94
|
+
], SecurityService);
|
|
95
|
+
//# sourceMappingURL=security.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.service.js","sourceRoot":"","sources":["../../src/services/security.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,oDAAsC;AAG/B,IAAM,eAAe,GAArB,MAAM,eAAe;IACT,cAAc,GAC7B,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;IAE3C,WAAW;QACjB,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3D,CAAC;IAED,kBAAkB,CAAC,WAAgB;QACjC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CACpC,UAAU,EACV,IAAI,CAAC,cAAc,CACpB,CAAC,QAAQ,EAAE,CAAC;YACb,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,aAAqB;QACtC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CACpC,aAAa,EACb,IAAI,CAAC,cAAc,CACpB,CAAC;YACF,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,IAAY;QAC5B,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CACzC,IAAI,CAAC,MAAM,GAAG,CAAC,CAChB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;IAC1E,CAAC;IAED,qBAAqB,CAAC,IAAY,EAAE,UAAkB;QACpD,MAAM,QAAQ,GAAG;YACf,KAAK,EAAE,4BAA4B;YACnC,GAAG,EAAE,gBAAgB;YACrB,YAAY,EAAE,gBAAgB;YAC9B,KAAK,EAAE,UAAU;SAClB,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,CAAC;IAED,iCAAiC,CAAC,cAAsB;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,OAAO,GAAG,cAAc,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;IACpD,CAAC;CACF,CAAA;AA1DY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;GACA,eAAe,CA0D3B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare class ValidationService {
|
|
2
|
+
validateDockerfile(dockerfilePath: string): Promise<boolean>;
|
|
3
|
+
validateProjectStructure(projectType: string, language: string): boolean;
|
|
4
|
+
validateGitRepository(repoUrl: string): boolean;
|
|
5
|
+
validatePort(port: number): boolean;
|
|
6
|
+
validateInstanceType(provider: string, instanceType: string): boolean;
|
|
7
|
+
readPackageJson(): Promise<any>;
|
|
8
|
+
}
|