nest-scramble 1.0.0 → 1.1.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 +3 -3
- package/dist/NestScrambleModule.d.ts.map +1 -1
- package/dist/NestScrambleModule.js +17 -2
- package/dist/NestScrambleModule.js.map +1 -1
- package/dist/controllers/DocsController.d.ts +3 -1
- package/dist/controllers/DocsController.d.ts.map +1 -1
- package/dist/controllers/DocsController.js +45 -17
- package/dist/controllers/DocsController.js.map +1 -1
- package/dist/scanner/ScannerService.d.ts +0 -1
- package/dist/scanner/ScannerService.d.ts.map +1 -1
- package/dist/scanner/ScannerService.js +52 -7
- package/dist/scanner/ScannerService.js.map +1 -1
- package/package.json +8 -2
package/README.md
CHANGED
|
@@ -59,7 +59,7 @@ This approach delivers what runtime reflection simply cannot: perfect accuracy,
|
|
|
59
59
|
|
|
60
60
|
### 1. Install
|
|
61
61
|
```bash
|
|
62
|
-
|
|
62
|
+
pnpm add nest-scramble
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
### 2. Import Module
|
|
@@ -150,7 +150,7 @@ GET /scramble-mock/users/123
|
|
|
150
150
|
|
|
151
151
|
### CLI Generation
|
|
152
152
|
```bash
|
|
153
|
-
|
|
153
|
+
pnpm dlx nest-scramble generate src --output my-api.json
|
|
154
154
|
```
|
|
155
155
|
|
|
156
156
|
### Programmatic API
|
|
@@ -166,7 +166,7 @@ const spec = transformer.transform(controllers);
|
|
|
166
166
|
|
|
167
167
|
### Watch Mode
|
|
168
168
|
```bash
|
|
169
|
-
|
|
169
|
+
pnpm run watch-generate
|
|
170
170
|
```
|
|
171
171
|
Automatically regenerates docs on file changes.
|
|
172
172
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NestScrambleModule.d.ts","sourceRoot":"","sources":["../src/NestScrambleModule.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAyB,MAAM,gBAAgB,CAAC;AAQ1F,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBACa,kBAAkB;IAC7B,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,mBAAwB,GAAG,aAAa;
|
|
1
|
+
{"version":3,"file":"NestScrambleModule.d.ts","sourceRoot":"","sources":["../src/NestScrambleModule.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAyB,MAAM,gBAAgB,CAAC;AAQ1F,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBACa,kBAAkB;IAC7B,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,mBAAwB,GAAG,aAAa;IAmEhE,MAAM,CAAC,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,aAAa;IAKrE,SAAS,CAAC,QAAQ,EAAE,kBAAkB;CAMvC"}
|
|
@@ -19,17 +19,32 @@ const DocsController_1 = require("./controllers/DocsController");
|
|
|
19
19
|
let NestScrambleModule = NestScrambleModule_1 = class NestScrambleModule {
|
|
20
20
|
static forRoot(options = {}) {
|
|
21
21
|
const { path = '/docs', enableMock = true, autoExportPostman = false, postmanOutputPath = 'collection.json', baseUrl = 'http://localhost:3000', sourcePath = 'src', } = options;
|
|
22
|
-
|
|
22
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
23
|
+
console.log(`🚀 [Nest-Scramble] Initializing Documentation Engine`);
|
|
24
|
+
console.log(` Developed by Mohamed Mustafa | MIT License`);
|
|
25
|
+
console.log(`${'='.repeat(60)}`);
|
|
23
26
|
const scanner = new ScannerService_1.ScannerService();
|
|
24
27
|
const controllers = scanner.scanControllers(sourcePath);
|
|
28
|
+
console.log(`\n[Nest-Scramble] Generating OpenAPI specification...`);
|
|
25
29
|
const transformer = new OpenApiTransformer_1.OpenApiTransformer(baseUrl);
|
|
26
30
|
const openApiSpec = transformer.transform(controllers, 'NestJS API', '1.0.0', baseUrl);
|
|
27
|
-
|
|
31
|
+
console.log(`[Nest-Scramble] OpenAPI spec generated successfully`);
|
|
28
32
|
if (autoExportPostman) {
|
|
33
|
+
console.log(`[Nest-Scramble] Exporting Postman collection...`);
|
|
29
34
|
const generator = new PostmanCollectionGenerator_1.PostmanCollectionGenerator(baseUrl);
|
|
30
35
|
const collection = generator.generateCollection(controllers);
|
|
31
36
|
require('fs').writeFileSync(postmanOutputPath, JSON.stringify(collection, null, 2));
|
|
37
|
+
console.log(`[Nest-Scramble] ✓ Postman collection exported to ${postmanOutputPath}`);
|
|
32
38
|
}
|
|
39
|
+
const port = baseUrl.split(':').pop() || '3000';
|
|
40
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
41
|
+
console.log(`✅ [Nest-Scramble] Ready!`);
|
|
42
|
+
console.log(`📚 API Docs available at: http://localhost:${port}/docs`);
|
|
43
|
+
console.log(`📄 OpenAPI JSON at: http://localhost:${port}/docs-json`);
|
|
44
|
+
if (enableMock) {
|
|
45
|
+
console.log(`🎭 Mock endpoints at: http://localhost:${port}/scramble-mock/*`);
|
|
46
|
+
}
|
|
47
|
+
console.log(`${'='.repeat(60)}\n`);
|
|
33
48
|
return {
|
|
34
49
|
module: NestScrambleModule_1,
|
|
35
50
|
providers: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NestScrambleModule.js","sourceRoot":"","sources":["../src/NestScrambleModule.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,kEAAkE;AAClE,2CAA0F;AAC1F,wFAAqF;AACrF,gEAA6D;AAC7D,6DAA0D;AAC1D,yDAAsD;AACtD,mEAAgE;AAChE,iEAA8D;AAYvD,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAC7B,MAAM,CAAC,OAAO,CAAC,UAA+B,EAAE;QAC9C,MAAM,EACJ,IAAI,GAAG,OAAO,EACd,UAAU,GAAG,IAAI,EACjB,iBAAiB,GAAG,KAAK,EACzB,iBAAiB,GAAG,iBAAiB,EACrC,OAAO,GAAG,uBAAuB,EACjC,UAAU,GAAG,KAAK,GACnB,GAAG,OAAO,CAAC;QAEZ,
|
|
1
|
+
{"version":3,"file":"NestScrambleModule.js","sourceRoot":"","sources":["../src/NestScrambleModule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export declare class DocsController {
|
|
2
2
|
private openApiSpec;
|
|
3
3
|
constructor(openApiSpec: any);
|
|
4
|
-
getDocs():
|
|
4
|
+
getDocs(res: any): void;
|
|
5
|
+
getOpenApiJson(res: any): void;
|
|
6
|
+
getOpenApiJsonLegacy(res: any): void;
|
|
5
7
|
getOpenApiSpec(): any;
|
|
6
8
|
}
|
|
7
9
|
//# sourceMappingURL=DocsController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocsController.d.ts","sourceRoot":"","sources":["../../src/controllers/DocsController.ts"],"names":[],"mappings":"AAGA,qBACa,cAAc;IAEU,OAAO,CAAC,WAAW;gBAAX,WAAW,EAAE,GAAG;IAI3D,OAAO;
|
|
1
|
+
{"version":3,"file":"DocsController.d.ts","sourceRoot":"","sources":["../../src/controllers/DocsController.ts"],"names":[],"mappings":"AAGA,qBACa,cAAc;IAEU,OAAO,CAAC,WAAW;gBAAX,WAAW,EAAE,GAAG;IAI3D,OAAO,CAAQ,GAAG,EAAE,GAAG;IA0BvB,cAAc,CAAQ,GAAG,EAAE,GAAG;IAa9B,oBAAoB,CAAQ,GAAG,EAAE,GAAG;IAKpC,cAAc;CAGf"}
|
|
@@ -19,30 +19,43 @@ let DocsController = class DocsController {
|
|
|
19
19
|
constructor(openApiSpec) {
|
|
20
20
|
this.openApiSpec = openApiSpec;
|
|
21
21
|
}
|
|
22
|
-
getDocs() {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
<html>
|
|
22
|
+
getDocs(res) {
|
|
23
|
+
const html = `<!DOCTYPE html>
|
|
24
|
+
<html lang="en">
|
|
26
25
|
<head>
|
|
27
|
-
<title>Nest-Scramble
|
|
26
|
+
<title>API Documentation - Nest-Scramble</title>
|
|
28
27
|
<meta charset="utf-8" />
|
|
29
28
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
30
29
|
<style>
|
|
31
|
-
body {
|
|
30
|
+
body {
|
|
31
|
+
margin: 0;
|
|
32
|
+
padding: 0;
|
|
33
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;
|
|
34
|
+
}
|
|
32
35
|
</style>
|
|
33
36
|
</head>
|
|
34
37
|
<body>
|
|
35
|
-
<
|
|
36
|
-
<script>
|
|
37
|
-
window.onload = function() {
|
|
38
|
-
// Simple mock of Scalar API Reference
|
|
39
|
-
const container = document.getElementById('scalar-container');
|
|
40
|
-
container.innerHTML = '<h1>Nest-Scramble API Documentation</h1><p>OpenAPI spec available at <a href="/docs/spec">/docs/spec</a></p>';
|
|
41
|
-
};
|
|
42
|
-
</script>
|
|
38
|
+
<script id="api-reference" data-url="/docs-json"></script>
|
|
39
|
+
<script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>
|
|
43
40
|
</body>
|
|
44
|
-
</html
|
|
45
|
-
|
|
41
|
+
</html>`;
|
|
42
|
+
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
43
|
+
res.send(html);
|
|
44
|
+
}
|
|
45
|
+
getOpenApiJson(res) {
|
|
46
|
+
try {
|
|
47
|
+
const jsonString = JSON.stringify(this.openApiSpec, null, 2);
|
|
48
|
+
res.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
49
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
50
|
+
res.send(jsonString);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error('[Nest-Scramble] Error serializing OpenAPI spec:', error);
|
|
54
|
+
res.status(500).json({ error: 'Failed to generate OpenAPI specification' });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
getOpenApiJsonLegacy(res) {
|
|
58
|
+
return this.getOpenApiJson(res);
|
|
46
59
|
}
|
|
47
60
|
getOpenApiSpec() {
|
|
48
61
|
return this.openApiSpec;
|
|
@@ -51,10 +64,25 @@ let DocsController = class DocsController {
|
|
|
51
64
|
exports.DocsController = DocsController;
|
|
52
65
|
__decorate([
|
|
53
66
|
(0, common_1.Get)('docs'),
|
|
67
|
+
__param(0, (0, common_1.Res)()),
|
|
54
68
|
__metadata("design:type", Function),
|
|
55
|
-
__metadata("design:paramtypes", []),
|
|
69
|
+
__metadata("design:paramtypes", [Object]),
|
|
56
70
|
__metadata("design:returntype", void 0)
|
|
57
71
|
], DocsController.prototype, "getDocs", null);
|
|
72
|
+
__decorate([
|
|
73
|
+
(0, common_1.Get)('docs-json'),
|
|
74
|
+
__param(0, (0, common_1.Res)()),
|
|
75
|
+
__metadata("design:type", Function),
|
|
76
|
+
__metadata("design:paramtypes", [Object]),
|
|
77
|
+
__metadata("design:returntype", void 0)
|
|
78
|
+
], DocsController.prototype, "getOpenApiJson", null);
|
|
79
|
+
__decorate([
|
|
80
|
+
(0, common_1.Get)('docs/json'),
|
|
81
|
+
__param(0, (0, common_1.Res)()),
|
|
82
|
+
__metadata("design:type", Function),
|
|
83
|
+
__metadata("design:paramtypes", [Object]),
|
|
84
|
+
__metadata("design:returntype", void 0)
|
|
85
|
+
], DocsController.prototype, "getOpenApiJsonLegacy", null);
|
|
58
86
|
__decorate([
|
|
59
87
|
(0, common_1.Get)('docs/spec'),
|
|
60
88
|
__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocsController.js","sourceRoot":"","sources":["../../src/controllers/DocsController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,kEAAkE;AAClE,
|
|
1
|
+
{"version":3,"file":"DocsController.js","sourceRoot":"","sources":["../../src/controllers/DocsController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,kEAAkE;AAClE,2CAA8D;AAGvD,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAC2C,WAAgB;QAAhB,gBAAW,GAAX,WAAW,CAAK;IACxD,CAAC;IAGJ,OAAO,CAAQ,GAAQ;QACrB,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;QAkBT,CAAC;QAEL,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IAGD,cAAc,CAAQ,GAAQ;QAC5B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7D,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;YACjE,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;YAClD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iDAAiD,EAAE,KAAK,CAAC,CAAC;YACxE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAGD,oBAAoB,CAAQ,GAAQ;QAClC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAGD,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF,CAAA;AArDY,wCAAc;AAMzB;IADC,IAAA,YAAG,EAAC,MAAM,CAAC;IACH,WAAA,IAAA,YAAG,GAAE,CAAA;;;;6CAuBb;AAGD;IADC,IAAA,YAAG,EAAC,WAAW,CAAC;IACD,WAAA,IAAA,YAAG,GAAE,CAAA;;;;oDAUpB;AAGD;IADC,IAAA,YAAG,EAAC,WAAW,CAAC;IACK,WAAA,IAAA,YAAG,GAAE,CAAA;;;;0DAE1B;AAGD;IADC,IAAA,YAAG,EAAC,WAAW,CAAC;;;;oDAGhB;yBApDU,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,uBAAuB,CAAC,CAAA;;GAFvB,cAAc,CAqD1B"}
|
|
@@ -19,7 +19,6 @@ export interface ParameterInfo {
|
|
|
19
19
|
export declare class ScannerService {
|
|
20
20
|
private project;
|
|
21
21
|
private dtoAnalyzer;
|
|
22
|
-
constructor();
|
|
23
22
|
/**
|
|
24
23
|
* Scans the source directory for controllers and their methods
|
|
25
24
|
* @param sourcePath Path to the source directory (e.g., 'src')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScannerService.d.ts","sourceRoot":"","sources":["../../src/scanner/ScannerService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAe,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,UAAU,EAAE,YAAY,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"ScannerService.d.ts","sourceRoot":"","sources":["../../src/scanner/ScannerService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAe,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,UAAU,EAAE,YAAY,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,WAAW,CAAqB;IAExC;;;;OAIG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,EAAE;IAsErD,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,qBAAqB;IA4B7B,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,iBAAiB;CAiC1B"}
|
|
@@ -6,10 +6,8 @@ const ts_morph_1 = require("ts-morph");
|
|
|
6
6
|
const DtoAnalyzer_1 = require("../utils/DtoAnalyzer");
|
|
7
7
|
class ScannerService {
|
|
8
8
|
constructor() {
|
|
9
|
+
this.project = null;
|
|
9
10
|
this.dtoAnalyzer = new DtoAnalyzer_1.DtoAnalyzer();
|
|
10
|
-
this.project = new ts_morph_1.Project({
|
|
11
|
-
tsConfigFilePath: 'tsconfig.json', // Assume tsconfig.json exists
|
|
12
|
-
});
|
|
13
11
|
}
|
|
14
12
|
/**
|
|
15
13
|
* Scans the source directory for controllers and their methods
|
|
@@ -17,17 +15,64 @@ class ScannerService {
|
|
|
17
15
|
* @returns Array of ControllerInfo
|
|
18
16
|
*/
|
|
19
17
|
scanControllers(sourcePath) {
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
const hostProjectRoot = process.cwd();
|
|
19
|
+
const fullSourcePath = `${hostProjectRoot}/${sourcePath}`;
|
|
20
|
+
const tsconfigPath = `${hostProjectRoot}/tsconfig.json`;
|
|
21
|
+
console.log(`[Nest-Scramble] Scanning directory: ${fullSourcePath}`);
|
|
22
|
+
console.log(`[Nest-Scramble] Using tsconfig: ${tsconfigPath}`);
|
|
23
|
+
try {
|
|
24
|
+
const fs = require('fs');
|
|
25
|
+
if (!fs.existsSync(tsconfigPath)) {
|
|
26
|
+
console.warn(`[Nest-Scramble] Warning: tsconfig.json not found at ${tsconfigPath}`);
|
|
27
|
+
console.warn(`[Nest-Scramble] Creating project without tsconfig...`);
|
|
28
|
+
this.project = new ts_morph_1.Project({
|
|
29
|
+
skipAddingFilesFromTsConfig: true,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
this.project = new ts_morph_1.Project({
|
|
34
|
+
tsConfigFilePath: tsconfigPath,
|
|
35
|
+
skipAddingFilesFromTsConfig: true,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.warn(`[Nest-Scramble] Error initializing ts-morph project:`, error);
|
|
41
|
+
this.project = new ts_morph_1.Project({
|
|
42
|
+
skipAddingFilesFromTsConfig: true,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (!this.project) {
|
|
46
|
+
console.error(`[Nest-Scramble] Failed to initialize project scanner`);
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const pattern = `${fullSourcePath}/**/*.ts`;
|
|
51
|
+
console.log(`[Nest-Scramble] Adding source files with pattern: ${pattern}`);
|
|
52
|
+
this.project.addSourceFilesAtPaths(pattern);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error(`[Nest-Scramble] Error adding source files:`, error);
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
const sourceFiles = this.project.getSourceFiles();
|
|
59
|
+
console.log(`[Nest-Scramble] Loaded ${sourceFiles.length} TypeScript file(s)`);
|
|
22
60
|
const controllers = [];
|
|
23
|
-
|
|
24
|
-
const controllerClasses = this.project.getSourceFiles()
|
|
61
|
+
const controllerClasses = sourceFiles
|
|
25
62
|
.flatMap(file => file.getClasses())
|
|
26
63
|
.filter(cls => this.hasControllerDecorator(cls));
|
|
64
|
+
if (controllerClasses.length === 0) {
|
|
65
|
+
console.warn(`[Nest-Scramble] No controllers found in /${sourcePath}. Please check your sourcePath config.`);
|
|
66
|
+
console.warn(`[Nest-Scramble] Searched in: ${fullSourcePath}`);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.log(`[Nest-Scramble] Found ${controllerClasses.length} controller(s)`);
|
|
70
|
+
}
|
|
27
71
|
for (const controllerClass of controllerClasses) {
|
|
28
72
|
const controllerInfo = this.extractControllerInfo(controllerClass);
|
|
29
73
|
if (controllerInfo) {
|
|
30
74
|
controllers.push(controllerInfo);
|
|
75
|
+
console.log(`[Nest-Scramble] - ${controllerInfo.name} (${controllerInfo.methods.length} endpoint(s))`);
|
|
31
76
|
}
|
|
32
77
|
}
|
|
33
78
|
return controllers;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScannerService.js","sourceRoot":"","sources":["../../src/scanner/ScannerService.ts"],"names":[],"mappings":";;;AAAA,kEAAkE;AAClE,uCAAyF;AACzF,sDAAiE;AAsBjE,MAAa,cAAc;
|
|
1
|
+
{"version":3,"file":"ScannerService.js","sourceRoot":"","sources":["../../src/scanner/ScannerService.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nest-scramble",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "A next-generation, decorator-free API documentation engine and intelligent mock server for NestJS, engineered by Mohamed Mustafa",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -47,6 +47,12 @@
|
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
49
|
"@nestjs/common": "^10.0.0",
|
|
50
|
-
"@nestjs/core": "^10.0.0"
|
|
50
|
+
"@nestjs/core": "^10.0.0",
|
|
51
|
+
"reflect-metadata": "^0.1.13 || ^0.2.0"
|
|
52
|
+
},
|
|
53
|
+
"peerDependenciesMeta": {
|
|
54
|
+
"reflect-metadata": {
|
|
55
|
+
"optional": true
|
|
56
|
+
}
|
|
51
57
|
}
|
|
52
58
|
}
|