@asad_dev/leo-generator 1.6.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/CHANGELOG.md +194 -0
- package/COMMAND_REFERENCE.md +412 -0
- package/README.md +486 -0
- package/dist/app/modules/imagemodule/imagemodule.constants.js +18 -0
- package/dist/app/modules/imagemodule/imagemodule.controller.js +98 -0
- package/dist/app/modules/imagemodule/imagemodule.interface.js +2 -0
- package/dist/app/modules/imagemodule/imagemodule.model.js +10 -0
- package/dist/app/modules/imagemodule/imagemodule.route.js +20 -0
- package/dist/app/modules/imagemodule/imagemodule.service.js +137 -0
- package/dist/app/modules/imagemodule/imagemodule.validation.js +12 -0
- package/dist/app/modules/skiptest/skiptest.controller.js +81 -0
- package/dist/app/modules/skiptest/skiptest.route.js +19 -0
- package/dist/app/modules/skiptest/skiptest.service.js +129 -0
- package/dist/app/modules/skiptest/skiptest.validation.js +12 -0
- package/dist/app/modules/testmodule/testmodule.constants.js +18 -0
- package/dist/app/modules/testmodule/testmodule.controller.js +81 -0
- package/dist/app/modules/testmodule/testmodule.interface.js +2 -0
- package/dist/app/modules/testmodule/testmodule.model.js +11 -0
- package/dist/app/modules/testmodule/testmodule.route.js +19 -0
- package/dist/app/modules/testmodule/testmodule.service.js +129 -0
- package/dist/app/modules/testmodule/testmodule.validation.js +14 -0
- package/dist/helpers/fileHelper.js +44 -0
- package/dist/index.js +586 -0
- package/dist/templates/constants.template.js +24 -0
- package/dist/templates/controller.template.js +108 -0
- package/dist/templates/route.template.js +68 -0
- package/dist/templates/service.template.js +184 -0
- package/dist/types.js +2 -0
- package/dist/utils/documentationUpdater.js +430 -0
- package/dist/utils/fieldParser.js +163 -0
- package/dist/utils/helperGenerator.js +87 -0
- package/dist/utils/interfaceGenerator.js +158 -0
- package/dist/utils/modelGenerator.js +140 -0
- package/dist/utils/postmanApi.js +113 -0
- package/dist/utils/postmanGenerator.js +283 -0
- package/dist/utils/swaggerGenerator.js +444 -0
- package/dist/utils/validationGenerator.js +170 -0
- package/package.json +58 -0
|
@@ -0,0 +1,283 @@
|
|
|
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 __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.generatePostmanCollection = generatePostmanCollection;
|
|
37
|
+
exports.savePostmanCollection = savePostmanCollection;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
// Helper to generate Pre-request Script
|
|
41
|
+
function generatePreRequestScript(fields, prefix = "") {
|
|
42
|
+
const scriptLines = [];
|
|
43
|
+
fields.forEach(field => {
|
|
44
|
+
var _a, _b, _c;
|
|
45
|
+
if (field.name.toLowerCase() === "_id")
|
|
46
|
+
return;
|
|
47
|
+
const varName = prefix ? `${prefix}_${field.name}` : field.name;
|
|
48
|
+
switch (field.type.toLowerCase()) {
|
|
49
|
+
case "string":
|
|
50
|
+
scriptLines.push(`pm.variables.set("${varName}", "${field.name}_" + Date.now());`);
|
|
51
|
+
break;
|
|
52
|
+
case "number":
|
|
53
|
+
scriptLines.push(`pm.variables.set("${varName}", Math.floor(Math.random() * 100));`);
|
|
54
|
+
break;
|
|
55
|
+
case "boolean":
|
|
56
|
+
scriptLines.push(`pm.variables.set("${varName}", Math.random() < 0.5);`);
|
|
57
|
+
break;
|
|
58
|
+
case "date":
|
|
59
|
+
scriptLines.push(`pm.variables.set("${varName}", new Date().toISOString());`);
|
|
60
|
+
break;
|
|
61
|
+
case "enum":
|
|
62
|
+
if (field.enumValues && field.enumValues.length > 0) {
|
|
63
|
+
const values = JSON.stringify(field.enumValues);
|
|
64
|
+
scriptLines.push(`const ${varName}_values = ${values};`);
|
|
65
|
+
scriptLines.push(`pm.variables.set("${varName}", ${varName}_values[Math.floor(Math.random() * ${varName}_values.length)]);`);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
scriptLines.push(`pm.variables.set("${varName}", "ENUM_VALUE");`);
|
|
69
|
+
}
|
|
70
|
+
break;
|
|
71
|
+
case "object":
|
|
72
|
+
if ((_a = field.objectProperties) === null || _a === void 0 ? void 0 : _a.length) {
|
|
73
|
+
// Recursive call for nested properties
|
|
74
|
+
const nestedPrefix = varName;
|
|
75
|
+
scriptLines.push(...generatePreRequestScript(field.objectProperties, nestedPrefix));
|
|
76
|
+
}
|
|
77
|
+
break;
|
|
78
|
+
case "array":
|
|
79
|
+
if (((_b = field.ref) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === "object" && ((_c = field.objectProperties) === null || _c === void 0 ? void 0 : _c.length)) {
|
|
80
|
+
// For array of objects, we generate one item's structure
|
|
81
|
+
// This is a simplification but helps with pre-request variable setting
|
|
82
|
+
scriptLines.push(...generatePreRequestScript(field.objectProperties, varName));
|
|
83
|
+
}
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
return scriptLines;
|
|
88
|
+
}
|
|
89
|
+
function generatePostmanCollection(moduleName, fields) {
|
|
90
|
+
const camelCaseName = toCamelCase(moduleName);
|
|
91
|
+
const folderName = camelCaseName.toLowerCase();
|
|
92
|
+
const baseUrl = "{{base_url}}";
|
|
93
|
+
const sampleData = generateSampleData(fields);
|
|
94
|
+
const requests = [
|
|
95
|
+
// Create request
|
|
96
|
+
{
|
|
97
|
+
name: `Create ${camelCaseName}`,
|
|
98
|
+
request: {
|
|
99
|
+
method: "POST",
|
|
100
|
+
header: [
|
|
101
|
+
{
|
|
102
|
+
key: "Content-Type",
|
|
103
|
+
value: "application/json"
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
body: {
|
|
107
|
+
mode: "raw",
|
|
108
|
+
raw: JSON.stringify(sampleData, null, 2),
|
|
109
|
+
options: {
|
|
110
|
+
raw: {
|
|
111
|
+
language: "json"
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
url: {
|
|
116
|
+
raw: `${baseUrl}/api/v1/${folderName}`,
|
|
117
|
+
host: ["{{base_url}}"],
|
|
118
|
+
path: ["api", "v1", folderName]
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
event: [
|
|
122
|
+
{
|
|
123
|
+
listen: "prerequest",
|
|
124
|
+
script: {
|
|
125
|
+
exec: generatePreRequestScript(fields),
|
|
126
|
+
type: "text/javascript"
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
]
|
|
130
|
+
},
|
|
131
|
+
// Get all request
|
|
132
|
+
{
|
|
133
|
+
name: `Get All ${camelCaseName}s`,
|
|
134
|
+
request: {
|
|
135
|
+
method: "GET",
|
|
136
|
+
header: [],
|
|
137
|
+
url: {
|
|
138
|
+
raw: `${baseUrl}/api/v1/${folderName}`,
|
|
139
|
+
host: ["{{base_url}}"],
|
|
140
|
+
path: ["api", "v1", folderName]
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
// Get single request
|
|
145
|
+
{
|
|
146
|
+
name: `Get ${camelCaseName} by ID`,
|
|
147
|
+
request: {
|
|
148
|
+
method: "GET",
|
|
149
|
+
header: [],
|
|
150
|
+
url: {
|
|
151
|
+
raw: `${baseUrl}/api/v1/${folderName}/{{${folderName}_id}}`,
|
|
152
|
+
host: ["{{base_url}}"],
|
|
153
|
+
path: ["api", "v1", folderName, `{{${folderName}_id}}`]
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
// Update request
|
|
158
|
+
{
|
|
159
|
+
name: `Update ${camelCaseName}`,
|
|
160
|
+
request: {
|
|
161
|
+
method: "PATCH",
|
|
162
|
+
header: [
|
|
163
|
+
{
|
|
164
|
+
key: "Content-Type",
|
|
165
|
+
value: "application/json"
|
|
166
|
+
}
|
|
167
|
+
],
|
|
168
|
+
body: {
|
|
169
|
+
mode: "raw",
|
|
170
|
+
raw: JSON.stringify(generateUpdateSampleData(fields), null, 2),
|
|
171
|
+
options: {
|
|
172
|
+
raw: {
|
|
173
|
+
language: "json"
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
url: {
|
|
178
|
+
raw: `${baseUrl}/api/v1/${folderName}/{{${folderName}_id}}`,
|
|
179
|
+
host: ["{{base_url}}"],
|
|
180
|
+
path: ["api", "v1", folderName, `{{${folderName}_id}}`]
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
event: [
|
|
184
|
+
{
|
|
185
|
+
listen: "prerequest",
|
|
186
|
+
script: {
|
|
187
|
+
exec: generatePreRequestScript(fields),
|
|
188
|
+
type: "text/javascript"
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
]
|
|
192
|
+
},
|
|
193
|
+
// Delete request
|
|
194
|
+
{
|
|
195
|
+
name: `Delete ${camelCaseName}`,
|
|
196
|
+
request: {
|
|
197
|
+
method: "DELETE",
|
|
198
|
+
header: [],
|
|
199
|
+
url: {
|
|
200
|
+
raw: `${baseUrl}/api/v1/${folderName}/{{${folderName}_id}}`,
|
|
201
|
+
host: ["{{base_url}}"],
|
|
202
|
+
path: ["api", "v1", folderName, `{{${folderName}_id}}`]
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
];
|
|
207
|
+
return {
|
|
208
|
+
info: {
|
|
209
|
+
name: `${camelCaseName} API`,
|
|
210
|
+
schema: "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
|
|
211
|
+
},
|
|
212
|
+
item: requests
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function savePostmanCollection(moduleName, collection, outputDir = "postman") {
|
|
216
|
+
const camelCaseName = toCamelCase(moduleName);
|
|
217
|
+
const postmanDir = path.join(process.cwd(), outputDir);
|
|
218
|
+
// Create postman directory if it doesn't exist
|
|
219
|
+
if (!fs.existsSync(postmanDir)) {
|
|
220
|
+
fs.mkdirSync(postmanDir, { recursive: true });
|
|
221
|
+
}
|
|
222
|
+
const filePath = path.join(postmanDir, `${camelCaseName.toLowerCase()}.postman_collection.json`);
|
|
223
|
+
fs.writeFileSync(filePath, JSON.stringify(collection, null, 2));
|
|
224
|
+
console.log(`✅ Postman collection created: ${filePath}`);
|
|
225
|
+
}
|
|
226
|
+
function generateSampleData(fields, prefix = "") {
|
|
227
|
+
const sampleData = {};
|
|
228
|
+
fields.forEach(field => {
|
|
229
|
+
var _a, _b, _c;
|
|
230
|
+
if (field.name.toLowerCase() === "_id")
|
|
231
|
+
return;
|
|
232
|
+
const varName = prefix ? `${prefix}_${field.name}` : field.name;
|
|
233
|
+
switch (field.type.toLowerCase()) {
|
|
234
|
+
case "string":
|
|
235
|
+
case "number":
|
|
236
|
+
case "boolean":
|
|
237
|
+
case "date":
|
|
238
|
+
case "enum":
|
|
239
|
+
case "objectid":
|
|
240
|
+
case "id":
|
|
241
|
+
sampleData[field.name] = `{{${varName}}}`;
|
|
242
|
+
break;
|
|
243
|
+
case "array":
|
|
244
|
+
if (((_a = field.ref) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === "object" && ((_b = field.objectProperties) === null || _b === void 0 ? void 0 : _b.length)) {
|
|
245
|
+
// Array of objects - return one item with variable placeholders
|
|
246
|
+
sampleData[field.name] = [generateSampleData(field.objectProperties, varName)];
|
|
247
|
+
}
|
|
248
|
+
else if (field.arrayItemType) {
|
|
249
|
+
// ... existing logic for scalar arrays ...
|
|
250
|
+
sampleData[field.name] = []; // Placeholder for scalar array for now
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
sampleData[field.name] = [];
|
|
254
|
+
}
|
|
255
|
+
break;
|
|
256
|
+
case "object":
|
|
257
|
+
if ((_c = field.objectProperties) === null || _c === void 0 ? void 0 : _c.length) {
|
|
258
|
+
sampleData[field.name] = generateSampleData(field.objectProperties, varName);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
sampleData[field.name] = {};
|
|
262
|
+
}
|
|
263
|
+
break;
|
|
264
|
+
default:
|
|
265
|
+
sampleData[field.name] = `{{${varName}}}`;
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
return sampleData;
|
|
269
|
+
}
|
|
270
|
+
function generateUpdateSampleData(fields) {
|
|
271
|
+
const sampleData = generateSampleData(fields);
|
|
272
|
+
// For update, we typically only include a few fields
|
|
273
|
+
const updateFields = {};
|
|
274
|
+
const fieldNames = Object.keys(sampleData);
|
|
275
|
+
// Include first 2-3 fields for update example
|
|
276
|
+
fieldNames.slice(0, Math.min(3, fieldNames.length)).forEach(fieldName => {
|
|
277
|
+
updateFields[fieldName] = sampleData[fieldName];
|
|
278
|
+
});
|
|
279
|
+
return updateFields;
|
|
280
|
+
}
|
|
281
|
+
function toCamelCase(str) {
|
|
282
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
283
|
+
}
|