nest-scramble 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.
Files changed (46) hide show
  1. package/README.md +304 -0
  2. package/dist/NestScrambleModule.d.ts +16 -0
  3. package/dist/NestScrambleModule.d.ts.map +1 -0
  4. package/dist/NestScrambleModule.js +73 -0
  5. package/dist/NestScrambleModule.js.map +1 -0
  6. package/dist/cli.d.ts +4 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +77 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/controllers/DemoController.d.ts +53 -0
  11. package/dist/controllers/DemoController.d.ts.map +1 -0
  12. package/dist/controllers/DemoController.js +91 -0
  13. package/dist/controllers/DemoController.js.map +1 -0
  14. package/dist/controllers/DocsController.d.ts +7 -0
  15. package/dist/controllers/DocsController.d.ts.map +1 -0
  16. package/dist/controllers/DocsController.js +69 -0
  17. package/dist/controllers/DocsController.js.map +1 -0
  18. package/dist/generators/PostmanCollectionGenerator.d.ts +61 -0
  19. package/dist/generators/PostmanCollectionGenerator.d.ts.map +1 -0
  20. package/dist/generators/PostmanCollectionGenerator.js +97 -0
  21. package/dist/generators/PostmanCollectionGenerator.js.map +1 -0
  22. package/dist/index.d.ts +10 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +26 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/middleware/MockMiddleware.d.ts +15 -0
  27. package/dist/middleware/MockMiddleware.d.ts.map +1 -0
  28. package/dist/middleware/MockMiddleware.js +94 -0
  29. package/dist/middleware/MockMiddleware.js.map +1 -0
  30. package/dist/scanner/ScannerService.d.ts +34 -0
  31. package/dist/scanner/ScannerService.d.ts.map +1 -0
  32. package/dist/scanner/ScannerService.js +114 -0
  33. package/dist/scanner/ScannerService.js.map +1 -0
  34. package/dist/utils/DtoAnalyzer.d.ts +25 -0
  35. package/dist/utils/DtoAnalyzer.d.ts.map +1 -0
  36. package/dist/utils/DtoAnalyzer.js +93 -0
  37. package/dist/utils/DtoAnalyzer.js.map +1 -0
  38. package/dist/utils/MockGenerator.d.ts +18 -0
  39. package/dist/utils/MockGenerator.d.ts.map +1 -0
  40. package/dist/utils/MockGenerator.js +135 -0
  41. package/dist/utils/MockGenerator.js.map +1 -0
  42. package/dist/utils/OpenApiTransformer.d.ts +38 -0
  43. package/dist/utils/OpenApiTransformer.d.ts.map +1 -0
  44. package/dist/utils/OpenApiTransformer.js +182 -0
  45. package/dist/utils/OpenApiTransformer.js.map +1 -0
  46. package/package.json +52 -0
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DtoAnalyzer = void 0;
4
+ /** Nest-Scramble | Developed by Mohamed Mustafa | MIT License **/
5
+ const ts_morph_1 = require("ts-morph");
6
+ class DtoAnalyzer {
7
+ constructor() {
8
+ this.visited = new Set();
9
+ }
10
+ /**
11
+ * Analyzes a TypeScript type and returns detailed information
12
+ * @param type The TypeScript type to analyze
13
+ * @param isOptional Whether the type is optional
14
+ * @returns AnalyzedType with full type information
15
+ */
16
+ analyzeType(type, isOptional = false) {
17
+ const typeText = type.getText();
18
+ // Prevent circular references
19
+ if (this.visited.has(typeText)) {
20
+ return {
21
+ type: typeText,
22
+ isArray: false,
23
+ isOptional,
24
+ };
25
+ }
26
+ this.visited.add(typeText);
27
+ try {
28
+ const symbol = type.getSymbol();
29
+ // Check if it's an array
30
+ const arrayElementType = type.getArrayElementType();
31
+ if (arrayElementType) {
32
+ const elementAnalysis = this.analyzeType(arrayElementType);
33
+ return {
34
+ type: typeText,
35
+ isArray: true,
36
+ isOptional,
37
+ properties: elementAnalysis.properties,
38
+ };
39
+ }
40
+ // Check if it's a union type
41
+ const unionTypes = type.getUnionTypes();
42
+ if (unionTypes.length > 1) {
43
+ return {
44
+ type: typeText,
45
+ isArray: false,
46
+ isOptional,
47
+ unionTypes: unionTypes.map(t => t.getText()),
48
+ };
49
+ }
50
+ // Check if it's a class or interface
51
+ if (symbol) {
52
+ const declarations = symbol.getDeclarations();
53
+ for (const decl of declarations) {
54
+ if (ts_morph_1.Node.isClassDeclaration(decl) || ts_morph_1.Node.isInterfaceDeclaration(decl)) {
55
+ const properties = this.extractProperties(decl);
56
+ return {
57
+ type: typeText,
58
+ isArray: false,
59
+ isOptional,
60
+ properties,
61
+ };
62
+ }
63
+ }
64
+ }
65
+ // Primitive or other types
66
+ return {
67
+ type: typeText,
68
+ isArray: false,
69
+ isOptional,
70
+ };
71
+ }
72
+ finally {
73
+ this.visited.delete(typeText);
74
+ }
75
+ }
76
+ extractProperties(decl) {
77
+ const properties = [];
78
+ const propDeclarations = decl.getProperties();
79
+ for (const prop of propDeclarations) {
80
+ const name = prop.getName();
81
+ const type = prop.getType();
82
+ const isOptional = prop.hasQuestionToken ? prop.hasQuestionToken() : false;
83
+ const analyzedType = this.analyzeType(type, isOptional);
84
+ properties.push({
85
+ name,
86
+ type: analyzedType,
87
+ });
88
+ }
89
+ return properties;
90
+ }
91
+ }
92
+ exports.DtoAnalyzer = DtoAnalyzer;
93
+ //# sourceMappingURL=DtoAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DtoAnalyzer.js","sourceRoot":"","sources":["../../src/utils/DtoAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { AnalyzedType, PropertyInfo } from './DtoAnalyzer';
2
+ export declare class MockGenerator {
3
+ /**
4
+ * Generates mock data based on the analyzed type
5
+ * @param analyzedType The analyzed type information
6
+ * @returns Mock data object
7
+ */
8
+ static generateMock(analyzedType: AnalyzedType): any;
9
+ private static generateMockForType;
10
+ /**
11
+ * Generates mock data for a property, using the property name for smarter generation
12
+ * @param property The property info
13
+ * @returns Mock value
14
+ */
15
+ static generateMockForProperty(property: PropertyInfo): any;
16
+ private static generateMockForPropertyName;
17
+ }
18
+ //# sourceMappingURL=MockGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/MockGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE3D,qBAAa,aAAa;IACxB;;;;OAIG;IACH,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,YAAY,GAAG,GAAG;IA4BpD,OAAO,CAAC,MAAM,CAAC,mBAAmB;IA6BlC;;;;OAIG;IACH,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,YAAY,GAAG,GAAG;IAqB3D,OAAO,CAAC,MAAM,CAAC,2BAA2B;CAkE3C"}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MockGenerator = void 0;
4
+ /** Nest-Scramble | Developed by Mohamed Mustafa | MIT License **/
5
+ const faker_1 = require("@faker-js/faker");
6
+ class MockGenerator {
7
+ /**
8
+ * Generates mock data based on the analyzed type
9
+ * @param analyzedType The analyzed type information
10
+ * @returns Mock data object
11
+ */
12
+ static generateMock(analyzedType) {
13
+ if (analyzedType.isArray) {
14
+ // Generate array of mocks
15
+ const count = faker_1.faker.number.int({ min: 1, max: 5 });
16
+ return Array.from({ length: count }, () => this.generateMock({ ...analyzedType, isArray: false }));
17
+ }
18
+ if (analyzedType.unionTypes) {
19
+ // Pick a random union type
20
+ const randomType = faker_1.faker.helpers.arrayElement(analyzedType.unionTypes);
21
+ return this.generateMockForType(randomType);
22
+ }
23
+ if (analyzedType.properties) {
24
+ // Generate object with properties
25
+ const obj = {};
26
+ for (const prop of analyzedType.properties) {
27
+ if (!prop.type.isOptional || faker_1.faker.datatype.boolean()) {
28
+ obj[prop.name] = this.generateMock(prop.type);
29
+ }
30
+ }
31
+ return obj;
32
+ }
33
+ // Generate based on type string
34
+ return this.generateMockForType(analyzedType.type);
35
+ }
36
+ static generateMockForType(type) {
37
+ const lowerType = type.toLowerCase();
38
+ if (lowerType.includes('string')) {
39
+ return faker_1.faker.lorem.words();
40
+ }
41
+ if (lowerType.includes('number') || lowerType.includes('int') || lowerType.includes('float')) {
42
+ return faker_1.faker.number.int({ min: 1, max: 100 });
43
+ }
44
+ if (lowerType.includes('boolean')) {
45
+ return faker_1.faker.datatype.boolean();
46
+ }
47
+ if (lowerType.includes('date')) {
48
+ return faker_1.faker.date.recent().toISOString();
49
+ }
50
+ // Smart mocking based on property name patterns
51
+ if (lowerType === 'string') {
52
+ // This would be called with property name context, but for now, generic
53
+ return faker_1.faker.lorem.word();
54
+ }
55
+ // Default fallback
56
+ return faker_1.faker.lorem.word();
57
+ }
58
+ /**
59
+ * Generates mock data for a property, using the property name for smarter generation
60
+ * @param property The property info
61
+ * @returns Mock value
62
+ */
63
+ static generateMockForProperty(property) {
64
+ const name = property.name.toLowerCase();
65
+ if (property.type.isArray) {
66
+ const count = faker_1.faker.number.int({ min: 1, max: 5 });
67
+ return Array.from({ length: count }, () => this.generateMockForPropertyName(name, { ...property.type, isArray: false }));
68
+ }
69
+ if (property.type.properties) {
70
+ const obj = {};
71
+ for (const prop of property.type.properties) {
72
+ if (!prop.type.isOptional || faker_1.faker.datatype.boolean()) {
73
+ obj[prop.name] = this.generateMockForProperty(prop);
74
+ }
75
+ }
76
+ return obj;
77
+ }
78
+ return this.generateMockForPropertyName(name, property.type);
79
+ }
80
+ static generateMockForPropertyName(name, type) {
81
+ const typeStr = type.type.toLowerCase();
82
+ // Email
83
+ if (name.includes('email')) {
84
+ return faker_1.faker.internet.email();
85
+ }
86
+ // Name
87
+ if (name.includes('name') || name.includes('firstname') || name.includes('lastname')) {
88
+ return faker_1.faker.person.fullName();
89
+ }
90
+ // Phone
91
+ if (name.includes('phone') || name.includes('mobile') || name.includes('tel')) {
92
+ return faker_1.faker.phone.number();
93
+ }
94
+ // Address
95
+ if (name.includes('address') || name.includes('street')) {
96
+ return faker_1.faker.location.streetAddress();
97
+ }
98
+ // City
99
+ if (name.includes('city')) {
100
+ return faker_1.faker.location.city();
101
+ }
102
+ // Country
103
+ if (name.includes('country')) {
104
+ return faker_1.faker.location.country();
105
+ }
106
+ // URL
107
+ if (name.includes('url') || name.includes('website')) {
108
+ return faker_1.faker.internet.url();
109
+ }
110
+ // ID
111
+ if (name.includes('id') && typeStr.includes('number')) {
112
+ return faker_1.faker.number.int({ min: 1, max: 1000 });
113
+ }
114
+ // Age
115
+ if (name.includes('age') && typeStr.includes('number')) {
116
+ return faker_1.faker.number.int({ min: 18, max: 80 });
117
+ }
118
+ // Date
119
+ if (name.includes('date') || name.includes('created') || name.includes('updated')) {
120
+ return faker_1.faker.date.recent().toISOString();
121
+ }
122
+ // Description
123
+ if (name.includes('description') || name.includes('bio')) {
124
+ return faker_1.faker.lorem.sentences();
125
+ }
126
+ // Title
127
+ if (name.includes('title')) {
128
+ return faker_1.faker.lorem.words(3);
129
+ }
130
+ // Fallback to type-based generation
131
+ return this.generateMockForType(type.type);
132
+ }
133
+ }
134
+ exports.MockGenerator = MockGenerator;
135
+ //# sourceMappingURL=MockGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockGenerator.js","sourceRoot":"","sources":["../../src/utils/MockGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /** Nest-Scramble | Developed by Mohamed Mustafa | MIT License **/
2
+ import { ControllerInfo } from '../scanner/ScannerService';
3
+ interface OpenApiSpec {
4
+ openapi: string;
5
+ info: {
6
+ title: string;
7
+ version: string;
8
+ description: string;
9
+ };
10
+ servers: Array<{
11
+ url: string;
12
+ }>;
13
+ paths: Record<string, Record<string, any>>;
14
+ components: {
15
+ schemas: Record<string, any>;
16
+ };
17
+ }
18
+ export declare class OpenApiTransformer {
19
+ private schemas;
20
+ private baseUrl;
21
+ constructor(baseUrl?: string);
22
+ /**
23
+ * Transforms ControllerInfo array into OpenAPI 3.0.0 specification
24
+ * @param controllers Array of controller information
25
+ * @param title API title
26
+ * @param version API version
27
+ * @param baseUrl Base URL for the API
28
+ * @returns OpenAPI specification object
29
+ */
30
+ transform(controllers: ControllerInfo[], title?: string, version?: string, baseUrl?: string): OpenApiSpec;
31
+ private buildPath;
32
+ private createOperation;
33
+ private analyzedTypeToSchema;
34
+ private generateCodeSamples;
35
+ private typeStringToSchema;
36
+ }
37
+ export {};
38
+ //# sourceMappingURL=OpenApiTransformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenApiTransformer.d.ts","sourceRoot":"","sources":["../../src/utils/OpenApiTransformer.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,EAAE,cAAc,EAAc,MAAM,2BAA2B,CAAC;AAGvE,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,EAAE,KAAK,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;KACb,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3C,UAAU,EAAE;QACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC9B,CAAC;CACH;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,SAA0B;IAI7C;;;;;;;OAOG;IACH,SAAS,CAAC,WAAW,EAAE,cAAc,EAAE,EAAE,KAAK,SAAe,EAAE,OAAO,SAAU,EAAE,OAAO,SAA0B,GAAG,WAAW;IAqCjI,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,eAAe;IA2DvB,OAAO,CAAC,oBAAoB;IA0C5B,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,kBAAkB;CAsB3B"}
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenApiTransformer = void 0;
4
+ class OpenApiTransformer {
5
+ constructor(baseUrl = 'http://localhost:3000') {
6
+ this.schemas = {};
7
+ this.baseUrl = baseUrl;
8
+ }
9
+ /**
10
+ * Transforms ControllerInfo array into OpenAPI 3.0.0 specification
11
+ * @param controllers Array of controller information
12
+ * @param title API title
13
+ * @param version API version
14
+ * @param baseUrl Base URL for the API
15
+ * @returns OpenAPI specification object
16
+ */
17
+ transform(controllers, title = 'NestJS API', version = '1.0.0', baseUrl = 'http://localhost:3000') {
18
+ this.schemas = {};
19
+ const paths = {};
20
+ for (const controller of controllers) {
21
+ for (const method of controller.methods) {
22
+ const fullPath = this.buildPath(controller.path, method.route);
23
+ const operation = this.createOperation(method);
24
+ if (!paths[fullPath]) {
25
+ paths[fullPath] = {};
26
+ }
27
+ paths[fullPath][method.httpMethod.toLowerCase()] = operation;
28
+ }
29
+ }
30
+ return {
31
+ openapi: '3.0.0',
32
+ info: {
33
+ title,
34
+ version,
35
+ description: 'Generated from NestJS controllers using nest-scramble',
36
+ },
37
+ servers: [
38
+ {
39
+ url: baseUrl,
40
+ },
41
+ ],
42
+ paths,
43
+ components: {
44
+ schemas: this.schemas,
45
+ },
46
+ };
47
+ }
48
+ buildPath(controllerPath, methodRoute) {
49
+ const parts = [controllerPath, methodRoute].filter(p => p);
50
+ return '/' + parts.join('/').replace(/\/+/g, '/');
51
+ }
52
+ createOperation(method) {
53
+ const operation = {
54
+ summary: method.name,
55
+ responses: {
56
+ '200': {
57
+ description: 'Success',
58
+ content: {
59
+ 'application/json': {
60
+ schema: this.analyzedTypeToSchema(method.returnType),
61
+ },
62
+ },
63
+ },
64
+ },
65
+ };
66
+ // Add parameters
67
+ const parameters = [];
68
+ for (const param of method.parameters) {
69
+ if (param.decorator?.includes('@Body')) {
70
+ operation.requestBody = {
71
+ required: true,
72
+ content: {
73
+ 'application/json': {
74
+ schema: this.analyzedTypeToSchema(param.type),
75
+ },
76
+ },
77
+ };
78
+ }
79
+ else if (param.decorator?.includes('@Query')) {
80
+ // For query params, if it's an object, add properties as query params
81
+ if (param.type.properties) {
82
+ for (const prop of param.type.properties) {
83
+ parameters.push({
84
+ name: prop.name,
85
+ in: 'query',
86
+ schema: this.analyzedTypeToSchema(prop.type),
87
+ required: !prop.type.isOptional,
88
+ });
89
+ }
90
+ }
91
+ }
92
+ else if (param.decorator?.includes('@Param')) {
93
+ parameters.push({
94
+ name: param.name,
95
+ in: 'path',
96
+ required: true,
97
+ schema: this.analyzedTypeToSchema(param.type),
98
+ });
99
+ }
100
+ }
101
+ if (parameters.length > 0) {
102
+ operation.parameters = parameters;
103
+ }
104
+ // Add code samples
105
+ operation['x-code-samples'] = this.generateCodeSamples(method);
106
+ return operation;
107
+ }
108
+ analyzedTypeToSchema(type) {
109
+ if (type.isArray) {
110
+ return {
111
+ type: 'array',
112
+ items: this.analyzedTypeToSchema({ ...type, isArray: false }),
113
+ };
114
+ }
115
+ if (type.unionTypes) {
116
+ return {
117
+ oneOf: type.unionTypes.map(t => this.typeStringToSchema(t)),
118
+ };
119
+ }
120
+ if (type.properties) {
121
+ const schemaName = type.type || 'Object';
122
+ if (!this.schemas[schemaName]) {
123
+ const properties = {};
124
+ const required = [];
125
+ for (const prop of type.properties) {
126
+ properties[prop.name] = this.analyzedTypeToSchema(prop.type);
127
+ if (!prop.type.isOptional) {
128
+ required.push(prop.name);
129
+ }
130
+ }
131
+ this.schemas[schemaName] = {
132
+ type: 'object',
133
+ properties,
134
+ required: required.length > 0 ? required : undefined,
135
+ };
136
+ }
137
+ return {
138
+ $ref: `#/components/schemas/${schemaName}`,
139
+ };
140
+ }
141
+ return this.typeStringToSchema(type.type);
142
+ }
143
+ generateCodeSamples(method) {
144
+ const fullPath = this.buildPath('', method.route); // Assuming base path is handled elsewhere
145
+ const samples = [];
146
+ // Curl sample
147
+ samples.push({
148
+ lang: 'curl',
149
+ source: `curl -X ${method.httpMethod} "${this.baseUrl}${fullPath}" \\\n -H "Content-Type: application/json" \\\n -d '{}'`,
150
+ });
151
+ // JavaScript Fetch sample
152
+ samples.push({
153
+ lang: 'javascript',
154
+ source: `fetch('${this.baseUrl}${fullPath}', {\n method: '${method.httpMethod}',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({}),\n})\n .then(response => response.json())\n .then(data => console.log(data));`,
155
+ });
156
+ // TypeScript sample
157
+ samples.push({
158
+ lang: 'typescript',
159
+ source: `// Assuming you have the DTO types\nimport axios from 'axios';\n\nconst response = await axios.${method.httpMethod.toLowerCase()}('${this.baseUrl}${fullPath}', {});\nconsole.log(response.data);`,
160
+ });
161
+ return samples;
162
+ }
163
+ typeStringToSchema(type) {
164
+ const lowerType = type.toLowerCase();
165
+ if (lowerType.includes('string')) {
166
+ return { type: 'string' };
167
+ }
168
+ if (lowerType.includes('number') || lowerType.includes('int') || lowerType.includes('float')) {
169
+ return { type: 'number' };
170
+ }
171
+ if (lowerType.includes('boolean')) {
172
+ return { type: 'boolean' };
173
+ }
174
+ if (lowerType.includes('date')) {
175
+ return { type: 'string', format: 'date-time' };
176
+ }
177
+ // Default to string
178
+ return { type: 'string' };
179
+ }
180
+ }
181
+ exports.OpenApiTransformer = OpenApiTransformer;
182
+ //# sourceMappingURL=OpenApiTransformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenApiTransformer.js","sourceRoot":"","sources":["../../src/utils/OpenApiTransformer.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "nest-scramble",
3
+ "version": "1.0.0",
4
+ "description": "A next-generation, decorator-free API documentation engine and intelligent mock server for NestJS, engineered by Mohamed Mustafa",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "nest-scramble": "dist/cli.js"
9
+ },
10
+ "scripts": {
11
+ "build": "rimraf dist && tsc",
12
+ "dev": "tsc --watch",
13
+ "test": "jest",
14
+ "lint": "eslint src/**/*.ts",
15
+ "lint:fix": "eslint src/**/*.ts --fix",
16
+ "watch-generate": "node scripts/watch-generate.js"
17
+ },
18
+ "keywords": [
19
+ "nestjs",
20
+ "documentation",
21
+ "static-analysis",
22
+ "ast",
23
+ "postman",
24
+ "mocking",
25
+ "mohamed-mustafa",
26
+ "typescript",
27
+ "zero-config"
28
+ ],
29
+ "author": "Mohamed Mustafa <https://github.com/Eng-MMustafa>",
30
+ "license": "MIT",
31
+ "dependencies": {
32
+ "ts-morph": "^21.0.1",
33
+ "@faker-js/faker": "^8.4.1",
34
+ "commander": "^11.1.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/express": "^4.17.21",
38
+ "@types/node": "^20.10.0",
39
+ "chokidar": "^3.5.3",
40
+ "typescript": "^5.3.0",
41
+ "rimraf": "^5.0.5",
42
+ "jest": "^29.7.0",
43
+ "@types/jest": "^29.5.8",
44
+ "eslint": "^8.56.0",
45
+ "@typescript-eslint/eslint-plugin": "^6.15.0",
46
+ "@typescript-eslint/parser": "^6.15.0"
47
+ },
48
+ "peerDependencies": {
49
+ "@nestjs/common": "^10.0.0",
50
+ "@nestjs/core": "^10.0.0"
51
+ }
52
+ }