@buildvision/nest-sdk-generator 1.1.3
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 +6 -0
- package/LICENSE.md +9 -0
- package/README.md +353 -0
- package/build/analyzer/builtin.d.ts +2 -0
- package/build/analyzer/builtin.js +11 -0
- package/build/analyzer/classdeps.d.ts +6 -0
- package/build/analyzer/classdeps.js +27 -0
- package/build/analyzer/controller.d.ts +26 -0
- package/build/analyzer/controller.js +103 -0
- package/build/analyzer/controllers.d.ts +7 -0
- package/build/analyzer/controllers.js +79 -0
- package/build/analyzer/decorator.d.ts +10 -0
- package/build/analyzer/decorator.js +29 -0
- package/build/analyzer/extractor.d.ts +107 -0
- package/build/analyzer/extractor.js +349 -0
- package/build/analyzer/index.d.ts +16 -0
- package/build/analyzer/index.js +101 -0
- package/build/analyzer/methods.d.ts +42 -0
- package/build/analyzer/methods.js +115 -0
- package/build/analyzer/module.d.ts +11 -0
- package/build/analyzer/module.js +41 -0
- package/build/analyzer/params.d.ts +38 -0
- package/build/analyzer/params.js +163 -0
- package/build/analyzer/route.d.ts +53 -0
- package/build/analyzer/route.js +131 -0
- package/build/analyzer/typedeps.d.ts +49 -0
- package/build/analyzer/typedeps.js +86 -0
- package/build/bin.d.ts +2 -0
- package/build/bin.js +39 -0
- package/build/config.d.ts +44 -0
- package/build/config.js +31 -0
- package/build/generator/genmodules.d.ts +24 -0
- package/build/generator/genmodules.js +134 -0
- package/build/generator/gentypes.d.ts +10 -0
- package/build/generator/gentypes.js +62 -0
- package/build/generator/index.d.ts +6 -0
- package/build/generator/index.js +83 -0
- package/build/generator/prettier.d.ts +16 -0
- package/build/generator/prettier.js +43 -0
- package/build/generator/sdk-interface.d.ts +1 -0
- package/build/generator/sdk-interface.js +36 -0
- package/build/logging.d.ts +6 -0
- package/build/logging.js +37 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/build/utils.d.ts +9 -0
- package/build/utils.js +56 -0
- package/package.json +34 -0
- package/src/analyzer/builtin.ts +9 -0
- package/src/analyzer/classdeps.ts +37 -0
- package/src/analyzer/controller.ts +135 -0
- package/src/analyzer/controllers.ts +117 -0
- package/src/analyzer/decorator.ts +29 -0
- package/src/analyzer/extractor.ts +491 -0
- package/src/analyzer/index.ts +136 -0
- package/src/analyzer/methods.ts +166 -0
- package/src/analyzer/module.ts +56 -0
- package/src/analyzer/params.ts +241 -0
- package/src/analyzer/route.ts +156 -0
- package/src/analyzer/typedeps.ts +130 -0
- package/src/bin.ts +33 -0
- package/src/config.ts +89 -0
- package/src/generator/genmodules.ts +163 -0
- package/src/generator/gentypes.ts +73 -0
- package/src/generator/index.ts +92 -0
- package/src/generator/prettier.ts +46 -0
- package/src/generator/sdk-interface.ts +32 -0
- package/src/logging.ts +35 -0
- package/src/utils.ts +61 -0
- package/tsconfig.json +26 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file Analyzer for the source API's routes in controller methods
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.resolveRouteWith = exports.resolveRoute = exports.debugUri = exports.unparseRoute = exports.paramsOfRoute = exports.analyzeUri = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Analyze an URI path
|
|
9
|
+
* @param uriPath The URI path to analyze
|
|
10
|
+
*/
|
|
11
|
+
function analyzeUri(uriPath) {
|
|
12
|
+
// Split the URI path into "parts"
|
|
13
|
+
const rawParts = uriPath.split('/');
|
|
14
|
+
// The parsed parts we'll return
|
|
15
|
+
const parts = [];
|
|
16
|
+
// The current string offset in the URI path
|
|
17
|
+
// This variable is used for error display
|
|
18
|
+
let offset = 0;
|
|
19
|
+
/**
|
|
20
|
+
* Find if a specific part of the URI path contains an invalid character
|
|
21
|
+
* @param part The part to check
|
|
22
|
+
* @param pattern The invalid characters to look for, as a regular expression
|
|
23
|
+
* @returns An error message if an invalid character is found, nothing else
|
|
24
|
+
*/
|
|
25
|
+
function _findInvalid(part, pattern) {
|
|
26
|
+
return part.match(pattern) ? uriPath + '\n' + ' '.repeat(offset) + '^' : null;
|
|
27
|
+
}
|
|
28
|
+
// Treat all parts of the URI path
|
|
29
|
+
for (let i = 0; i < rawParts.length; i++) {
|
|
30
|
+
const part = rawParts[i];
|
|
31
|
+
// Ignore empty parts (e.g. "/a///b" will be treated as "/a/b")
|
|
32
|
+
if (part === '')
|
|
33
|
+
continue;
|
|
34
|
+
// Ensure there is no generic character in the path as we don't support them
|
|
35
|
+
const genericErr = _findInvalid(part, /[\*\+\?]/);
|
|
36
|
+
if (genericErr) {
|
|
37
|
+
return new Error('Generic symbols (* + ?) are not supported as they prevent from determining the right route to use. Found in URI:\n' + genericErr);
|
|
38
|
+
}
|
|
39
|
+
// Check if this part is an URI parameter
|
|
40
|
+
if (part.startsWith(':')) {
|
|
41
|
+
// URI parameters must follow a strict naming
|
|
42
|
+
const paramErr = _findInvalid(part, /[^a-zA-Z0-9_:]/);
|
|
43
|
+
if (paramErr) {
|
|
44
|
+
return new Error('Invalid character detected in named parameter in URI:\n' + paramErr);
|
|
45
|
+
}
|
|
46
|
+
// We got a parameter
|
|
47
|
+
parts.push({ param: part.substr(1) });
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// We got a literal part
|
|
51
|
+
parts.push({ segment: part });
|
|
52
|
+
}
|
|
53
|
+
// Update the offset for error display
|
|
54
|
+
offset += part.length + 1;
|
|
55
|
+
}
|
|
56
|
+
// Success!
|
|
57
|
+
return {
|
|
58
|
+
isRoot: uriPath.startsWith('/'),
|
|
59
|
+
parts,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
exports.analyzeUri = analyzeUri;
|
|
63
|
+
/**
|
|
64
|
+
* Get the named parameters of a parsed route
|
|
65
|
+
* @param route
|
|
66
|
+
*/
|
|
67
|
+
function paramsOfRoute(route) {
|
|
68
|
+
return route.parts.map((part) => ('param' in part ? part.param : null)).filter((e) => e !== null);
|
|
69
|
+
}
|
|
70
|
+
exports.paramsOfRoute = paramsOfRoute;
|
|
71
|
+
/**
|
|
72
|
+
* Convert a route back to its original string
|
|
73
|
+
* @param route
|
|
74
|
+
*/
|
|
75
|
+
function unparseRoute(route) {
|
|
76
|
+
return (route.isRoot ? '/' : '') + route.parts.map((part) => ('segment' in part ? part.segment : ':' + part.param)).join('/');
|
|
77
|
+
}
|
|
78
|
+
exports.unparseRoute = unparseRoute;
|
|
79
|
+
/**
|
|
80
|
+
* Pretty-print a route
|
|
81
|
+
*/
|
|
82
|
+
function debugUri(route, color) {
|
|
83
|
+
return (route.isRoot ? '/' : '') + route.parts.map((part) => ('segment' in part ? part.segment : color(':' + part.param))).join('/');
|
|
84
|
+
}
|
|
85
|
+
exports.debugUri = debugUri;
|
|
86
|
+
/**
|
|
87
|
+
* Resolve a route by providing its required parameters
|
|
88
|
+
* @param route
|
|
89
|
+
* @param params
|
|
90
|
+
*/
|
|
91
|
+
function resolveRoute(route, params) {
|
|
92
|
+
let uri = [];
|
|
93
|
+
for (const part of route.parts) {
|
|
94
|
+
if ('segment' in part) {
|
|
95
|
+
uri.push(part.segment);
|
|
96
|
+
}
|
|
97
|
+
else if (!params.hasOwnProperty(part.param)) {
|
|
98
|
+
return new Error('Missing route parameter ' + part.param);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
uri.push(params[part.param]);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return (route.isRoot ? '/' : '') + uri.join('/');
|
|
105
|
+
}
|
|
106
|
+
exports.resolveRoute = resolveRoute;
|
|
107
|
+
/**
|
|
108
|
+
* Resolve a route by providing its required parameters through a callback
|
|
109
|
+
* @param route
|
|
110
|
+
* @param paramsProvider
|
|
111
|
+
*/
|
|
112
|
+
function resolveRouteWith(route, paramsProvider) {
|
|
113
|
+
let uri = [];
|
|
114
|
+
for (const part of route.parts) {
|
|
115
|
+
if ('segment' in part) {
|
|
116
|
+
uri.push(part.segment);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
const param = paramsProvider(part.param);
|
|
120
|
+
if (param === null) {
|
|
121
|
+
return new Error('Missing route parameter ' + part.param);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
uri.push(param);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return (route.isRoot ? '/' : '') + uri.join('/');
|
|
129
|
+
}
|
|
130
|
+
exports.resolveRouteWith = resolveRouteWith;
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYW5hbHl6ZXIvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7QUFrQkg7OztHQUdHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLE9BQWU7SUFDeEMsa0NBQWtDO0lBQ2xDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7SUFFbkMsZ0NBQWdDO0lBQ2hDLE1BQU0sS0FBSyxHQUFnQixFQUFFLENBQUE7SUFFN0IsNENBQTRDO0lBQzVDLDBDQUEwQztJQUMxQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFFZDs7Ozs7T0FLRztJQUNILFNBQVMsWUFBWSxDQUFDLElBQVksRUFBRSxPQUFlO1FBQ2pELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQy9FLENBQUM7SUFFRCxrQ0FBa0M7SUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDeEMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRXhCLCtEQUErRDtRQUMvRCxJQUFJLElBQUksS0FBSyxFQUFFO1lBQUUsU0FBUTtRQUV6Qiw0RUFBNEU7UUFDNUUsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUVqRCxJQUFJLFVBQVUsRUFBRTtZQUNkLE9BQU8sSUFBSSxLQUFLLENBQ2Qsb0hBQW9ILEdBQUcsVUFBVSxDQUNsSSxDQUFBO1NBQ0Y7UUFFRCx5Q0FBeUM7UUFDekMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLDZDQUE2QztZQUM3QyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQUE7WUFFckQsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osT0FBTyxJQUFJLEtBQUssQ0FBQyx5REFBeUQsR0FBRyxRQUFRLENBQUMsQ0FBQTthQUN2RjtZQUVELHFCQUFxQjtZQUNyQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1NBQ3RDO2FBQU07WUFDTCx3QkFBd0I7WUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1NBQzlCO1FBRUQsc0NBQXNDO1FBQ3RDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtLQUMxQjtJQUVELFdBQVc7SUFDWCxPQUFPO1FBQ0wsTUFBTSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQy9CLEtBQUs7S0FDTixDQUFBO0FBQ0gsQ0FBQztBQTlERCxnQ0E4REM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixhQUFhLENBQUMsS0FBWTtJQUN4QyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFhLENBQUE7QUFDL0csQ0FBQztBQUZELHNDQUVDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLEtBQVk7SUFDdkMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUMvSCxDQUFDO0FBRkQsb0NBRUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFFBQVEsQ0FBQyxLQUFZLEVBQUUsS0FBOEI7SUFDbkUsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUN0SSxDQUFDO0FBRkQsNEJBRUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLEtBQVksRUFBRSxNQUFrQztJQUMzRSxJQUFJLEdBQUcsR0FBYSxFQUFFLENBQUE7SUFFdEIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFO1FBQzlCLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtZQUNyQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtTQUN2QjthQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QyxPQUFPLElBQUksS0FBSyxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtTQUMxRDthQUFNO1lBQ0wsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7U0FDN0I7S0FDRjtJQUVELE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDbEQsQ0FBQztBQWRELG9DQWNDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLEtBQVksRUFBRSxjQUFnRDtJQUM3RixJQUFJLEdBQUcsR0FBYSxFQUFFLENBQUE7SUFFdEIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFO1FBQzlCLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtZQUNyQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtTQUN2QjthQUFNO1lBQ0wsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUV4QyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7Z0JBQ2xCLE9BQU8sSUFBSSxLQUFLLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO2FBQzFEO2lCQUFNO2dCQUNMLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7YUFDaEI7U0FDRjtLQUNGO0lBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNsRCxDQUFDO0FBbEJELDRDQWtCQyJ9
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Type dependencies builders from the source API
|
|
3
|
+
*/
|
|
4
|
+
import { ts, Type } from 'ts-morph';
|
|
5
|
+
/**
|
|
6
|
+
* Regex to match or replace imported types
|
|
7
|
+
*/
|
|
8
|
+
export declare const IMPORTED_TYPE_REGEX: RegExp;
|
|
9
|
+
/**
|
|
10
|
+
* Type with resolved level 1 dependencies (does not look for dependencies' own dependencies!)
|
|
11
|
+
*/
|
|
12
|
+
export interface ResolvedTypeDeps {
|
|
13
|
+
/** The original raw type, with import("...") expressions */
|
|
14
|
+
readonly rawType: string;
|
|
15
|
+
/** The resolved type, without imports */
|
|
16
|
+
readonly resolvedType: string;
|
|
17
|
+
/** File from which the type originates */
|
|
18
|
+
readonly relativeFilePath: string;
|
|
19
|
+
/**
|
|
20
|
+
* The type dependencies used by the resolved type
|
|
21
|
+
* A collection of scripts' relative paths mapped with the list of types imported from them
|
|
22
|
+
*/
|
|
23
|
+
readonly dependencies: Map<string, string[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Non-native types that are not imported
|
|
26
|
+
* They may be either local types (declared in the same file than the one analyzed) or globally-defined types
|
|
27
|
+
*/
|
|
28
|
+
readonly localTypes: string[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolve the dependencies of a TS-Morph analyzed type
|
|
32
|
+
* @param type
|
|
33
|
+
* @param relativeFilePath
|
|
34
|
+
* @param absoluteSrcPath
|
|
35
|
+
* @returns
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveTypeDependencies(type: Type<ts.Type>, relativeFilePath: string, absoluteSrcPath: string): ResolvedTypeDeps;
|
|
38
|
+
/**
|
|
39
|
+
* Extract an import type's name from a TS-Morph type
|
|
40
|
+
* @example "import('dir/file').TypeName" => "TypeName"
|
|
41
|
+
* @param type
|
|
42
|
+
* @returns
|
|
43
|
+
*/
|
|
44
|
+
export declare function getImportResolvedType(type: Type<ts.Type>): string;
|
|
45
|
+
/**
|
|
46
|
+
* Convert paths for external files
|
|
47
|
+
* @param importedFilePath
|
|
48
|
+
*/
|
|
49
|
+
export declare function normalizeExternalFilePath(importedFilePath: string): string;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file Type dependencies builders from the source API
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.normalizeExternalFilePath = exports.getImportResolvedType = exports.resolveTypeDependencies = exports.IMPORTED_TYPE_REGEX = void 0;
|
|
7
|
+
const path = require("path");
|
|
8
|
+
const logging_1 = require("../logging");
|
|
9
|
+
/**
|
|
10
|
+
* Regex to match or replace imported types
|
|
11
|
+
*/
|
|
12
|
+
exports.IMPORTED_TYPE_REGEX = /\bimport\(['"]([^'"]+)['"]\)\.([a-zA-Z0-9_]+)\b/g;
|
|
13
|
+
/**
|
|
14
|
+
* Resolve the dependencies of a TS-Morph analyzed type
|
|
15
|
+
* @param type
|
|
16
|
+
* @param relativeFilePath
|
|
17
|
+
* @param absoluteSrcPath
|
|
18
|
+
* @returns
|
|
19
|
+
*/
|
|
20
|
+
function resolveTypeDependencies(type, relativeFilePath, absoluteSrcPath) {
|
|
21
|
+
/** Raw type's text (e.g. `Array<import("somefile.ts").SomeType>`) */
|
|
22
|
+
const rawType = type.getText();
|
|
23
|
+
if (path.isAbsolute(relativeFilePath)) {
|
|
24
|
+
(0, logging_1.unreachable)('Internal error: got absolute file path in type dependencies resolver, when expecting a relative one (got {magentaBright})', relativeFilePath);
|
|
25
|
+
}
|
|
26
|
+
let dependencies = new Map();
|
|
27
|
+
let localTypes = [];
|
|
28
|
+
/** Resolved type (without import statements) */
|
|
29
|
+
const resolvedType = rawType.replace(exports.IMPORTED_TYPE_REGEX, (_, matchedFilePath, type) => {
|
|
30
|
+
const filePath = path.isAbsolute(matchedFilePath) ? path.relative(absoluteSrcPath, matchedFilePath) : matchedFilePath;
|
|
31
|
+
const deps = dependencies.get(filePath);
|
|
32
|
+
if (deps) {
|
|
33
|
+
if (!deps.includes(type)) {
|
|
34
|
+
deps.push(type);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
dependencies.set(filePath, [type]);
|
|
39
|
+
}
|
|
40
|
+
return type;
|
|
41
|
+
});
|
|
42
|
+
if (resolvedType.includes('import(')) {
|
|
43
|
+
(0, logging_1.unreachable)('Internal error: resolved still contains an {magenta} statement: {green}', 'import(...)', resolvedType);
|
|
44
|
+
}
|
|
45
|
+
for (const depFile of dependencies.keys()) {
|
|
46
|
+
if (path.isAbsolute(depFile)) {
|
|
47
|
+
(0, logging_1.unreachable)('Internal error: resolved absolute file path in type dependencies, when should have resolved a relative one\nIn type: {yellow}\nGot: {magentaBright}', type.getText(), depFile);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
rawType,
|
|
52
|
+
relativeFilePath,
|
|
53
|
+
resolvedType,
|
|
54
|
+
dependencies,
|
|
55
|
+
localTypes,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
exports.resolveTypeDependencies = resolveTypeDependencies;
|
|
59
|
+
/**
|
|
60
|
+
* Extract an import type's name from a TS-Morph type
|
|
61
|
+
* @example "import('dir/file').TypeName" => "TypeName"
|
|
62
|
+
* @param type
|
|
63
|
+
* @returns
|
|
64
|
+
*/
|
|
65
|
+
function getImportResolvedType(type) {
|
|
66
|
+
return type.getText().replace(exports.IMPORTED_TYPE_REGEX, (_, __, typename) => typename);
|
|
67
|
+
}
|
|
68
|
+
exports.getImportResolvedType = getImportResolvedType;
|
|
69
|
+
/**
|
|
70
|
+
* Convert paths for external files
|
|
71
|
+
* @param importedFilePath
|
|
72
|
+
*/
|
|
73
|
+
function normalizeExternalFilePath(importedFilePath) {
|
|
74
|
+
importedFilePath = path.normalize(importedFilePath);
|
|
75
|
+
if (!importedFilePath.startsWith('../')) {
|
|
76
|
+
return importedFilePath;
|
|
77
|
+
}
|
|
78
|
+
let level = 0;
|
|
79
|
+
while (importedFilePath.startsWith('../')) {
|
|
80
|
+
level++;
|
|
81
|
+
importedFilePath = importedFilePath.substr(3);
|
|
82
|
+
}
|
|
83
|
+
return `_external${level}/${importedFilePath}`;
|
|
84
|
+
}
|
|
85
|
+
exports.normalizeExternalFilePath = normalizeExternalFilePath;
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWRlcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYW5hbHl6ZXIvdHlwZWRlcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7QUFFSCw2QkFBNEI7QUFFNUIsd0NBQXdDO0FBRXhDOztHQUVHO0FBQ1UsUUFBQSxtQkFBbUIsR0FBRyxrREFBa0QsQ0FBQTtBQTRCckY7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsSUFBbUIsRUFBRSxnQkFBd0IsRUFBRSxlQUF1QjtJQUM1RyxxRUFBcUU7SUFDckUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBRTlCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1FBQ3JDLElBQUEscUJBQVcsRUFDVCwySEFBMkgsRUFDM0gsZ0JBQWdCLENBQ2pCLENBQUE7S0FDRjtJQUVELElBQUksWUFBWSxHQUFxQyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQzlELElBQUksVUFBVSxHQUFtQyxFQUFFLENBQUE7SUFFbkQsZ0RBQWdEO0lBQ2hELE1BQU0sWUFBWSxHQUFxQyxPQUFPLENBQUMsT0FBTyxDQUFDLDJCQUFtQixFQUFFLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUN2SCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFBO1FBRXJILE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkMsSUFBSSxJQUFJLEVBQUU7WUFDUixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTthQUNoQjtTQUNGO2FBQU07WUFDTCxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7U0FDbkM7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUMsQ0FBQyxDQUFBO0lBRUYsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQ3BDLElBQUEscUJBQVcsRUFBQyx5RUFBeUUsRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUE7S0FDcEg7SUFFRCxLQUFLLE1BQU0sT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUN6QyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDNUIsSUFBQSxxQkFBVyxFQUNULHFKQUFxSixFQUNySixJQUFJLENBQUMsT0FBTyxFQUFFLEVBQ2QsT0FBTyxDQUNSLENBQUE7U0FDRjtLQUNGO0lBRUQsT0FBTztRQUNMLE9BQU87UUFDUCxnQkFBZ0I7UUFDaEIsWUFBWTtRQUNaLFlBQVk7UUFDWixVQUFVO0tBQ1gsQ0FBQTtBQUNILENBQUM7QUFwREQsMERBb0RDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxJQUFtQjtJQUN2RCxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsMkJBQW1CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUE7QUFDbkYsQ0FBQztBQUZELHNEQUVDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IseUJBQXlCLENBQUMsZ0JBQXdCO0lBQ2hFLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUVuRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3ZDLE9BQU8sZ0JBQWdCLENBQUE7S0FDeEI7SUFFRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUE7SUFFYixPQUFPLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN6QyxLQUFLLEVBQUUsQ0FBQTtRQUNQLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUM5QztJQUVELE9BQU8sWUFBWSxLQUFLLElBQUksZ0JBQWdCLEVBQUUsQ0FBQTtBQUNoRCxDQUFDO0FBZkQsOERBZUMifQ==
|
package/build/bin.d.ts
ADDED
package/build/bin.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
4
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
5
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
6
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
7
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
8
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
9
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
const path = require("path");
|
|
14
|
+
const analyzer_1 = require("./analyzer");
|
|
15
|
+
const config_1 = require("./config");
|
|
16
|
+
const generator_1 = require("./generator");
|
|
17
|
+
const logging_1 = require("./logging");
|
|
18
|
+
function main() {
|
|
19
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
const started = Date.now();
|
|
21
|
+
process.chdir(path.dirname(path.resolve(config_1.configPath)));
|
|
22
|
+
switch (process.argv[3]) {
|
|
23
|
+
case '--analyze':
|
|
24
|
+
yield (0, analyzer_1.analyzerCli)(config_1.config);
|
|
25
|
+
break;
|
|
26
|
+
case '--generate':
|
|
27
|
+
case undefined:
|
|
28
|
+
const sdkContent = yield (0, analyzer_1.analyzerCli)(config_1.config);
|
|
29
|
+
yield (0, generator_1.default)(config_1.config, sdkContent);
|
|
30
|
+
break;
|
|
31
|
+
default:
|
|
32
|
+
console.error('ERROR: Unknown action provided (must be either "--analyze" or "--generate")');
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
(0, logging_1.println)('{green}', '@ Done in ' + ((Date.now() - started) / 1000).toFixed(2) + 's');
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
main();
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFFQSw2QkFBNEI7QUFDNUIseUNBQXdDO0FBQ3hDLHFDQUE2QztBQUM3QywyQ0FBc0M7QUFDdEMsdUNBQW1DO0FBRW5DLFNBQWUsSUFBSTs7UUFDakIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBRTFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFckQsUUFBUSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3ZCLEtBQUssV0FBVztnQkFDZCxNQUFNLElBQUEsc0JBQVcsRUFBQyxlQUFNLENBQUMsQ0FBQTtnQkFDekIsTUFBSztZQUVQLEtBQUssWUFBWSxDQUFDO1lBQ2xCLEtBQUssU0FBUztnQkFDWixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUEsc0JBQVcsRUFBQyxlQUFNLENBQUMsQ0FBQTtnQkFDNUMsTUFBTSxJQUFBLG1CQUFZLEVBQUMsZUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFBO2dCQUN0QyxNQUFLO1lBRVA7Z0JBQ0UsT0FBTyxDQUFDLEtBQUssQ0FBQyw2RUFBNkUsQ0FBQyxDQUFBO2dCQUM1RixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ2xCO1FBRUQsSUFBQSxpQkFBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUE7SUFDckYsQ0FBQztDQUFBO0FBRUQsSUFBSSxFQUFFLENBQUEifQ==
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The configuration file's content
|
|
3
|
+
* For details on what these options do, see the project's README
|
|
4
|
+
*/
|
|
5
|
+
export interface Config {
|
|
6
|
+
/** Enable verbose mode */
|
|
7
|
+
readonly verbose?: boolean;
|
|
8
|
+
/** Disable colored output */
|
|
9
|
+
readonly noColor?: boolean;
|
|
10
|
+
/** Path to the API's source directory */
|
|
11
|
+
readonly apiInputPath: string;
|
|
12
|
+
/** Path to generate the SDK at */
|
|
13
|
+
readonly sdkOutput: string;
|
|
14
|
+
/** Path to the SDK interface file */
|
|
15
|
+
readonly sdkInterfacePath: string;
|
|
16
|
+
/** List of magic types */
|
|
17
|
+
readonly magicTypes?: MagicType[];
|
|
18
|
+
/** Show a JSON output */
|
|
19
|
+
readonly jsonOutput?: string;
|
|
20
|
+
/** Prettify the JSON output */
|
|
21
|
+
readonly jsonPrettyOutput?: boolean;
|
|
22
|
+
/** Prettify the generated files (enabled by default) */
|
|
23
|
+
readonly prettify?: boolean;
|
|
24
|
+
/** Path to Prettier's configuration file */
|
|
25
|
+
readonly prettierConfig?: string;
|
|
26
|
+
/** Path to custom tsconfig file */
|
|
27
|
+
readonly tsconfigFile?: string;
|
|
28
|
+
/** If the output directory already exists, overwrite it (enabled by default) */
|
|
29
|
+
readonly overwriteOldOutputDir?: boolean;
|
|
30
|
+
/** If the SDK interface file does not exist yet, create one automatically (enabled by default) */
|
|
31
|
+
readonly generateDefaultSdkInterface?: boolean;
|
|
32
|
+
/** Write generation timestamp in each TypeScript file (enabled by default) */
|
|
33
|
+
readonly generateTimestamps?: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Magic type used to replace a non-compatible type in the generated SDK
|
|
37
|
+
*/
|
|
38
|
+
export interface MagicType {
|
|
39
|
+
readonly nodeModuleFilePath: string;
|
|
40
|
+
readonly typeName: string;
|
|
41
|
+
readonly placeholderContent: string;
|
|
42
|
+
}
|
|
43
|
+
export declare const configPath: string;
|
|
44
|
+
export declare const config: Config;
|
package/build/config.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = exports.configPath = void 0;
|
|
4
|
+
const chalk = require("chalk");
|
|
5
|
+
const fs = require("fs");
|
|
6
|
+
const path = require("path");
|
|
7
|
+
/**
|
|
8
|
+
* Load an existing configuration file and decode it
|
|
9
|
+
* @param configPath
|
|
10
|
+
*/
|
|
11
|
+
function loadConfigFile(configPath) {
|
|
12
|
+
if (!fs.existsSync(configPath)) {
|
|
13
|
+
console.error(chalk.red('Config file was not found at path: ' + chalk.yellow(path.resolve(configPath))));
|
|
14
|
+
process.exit(4);
|
|
15
|
+
}
|
|
16
|
+
const text = fs.readFileSync(configPath, 'utf8');
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(text);
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
console.error(chalk.red('Failed to parse configuration file: ' + e));
|
|
22
|
+
process.exit(3);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.configPath = process.argv[2];
|
|
26
|
+
if (!exports.configPath) {
|
|
27
|
+
console.error(chalk.red('Please provide a path to the configuration file'));
|
|
28
|
+
process.exit(2);
|
|
29
|
+
}
|
|
30
|
+
exports.config = loadConfigFile(exports.configPath);
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBK0I7QUFDL0IseUJBQXdCO0FBQ3hCLDZCQUE0QjtBQTJENUI7OztHQUdHO0FBQ0gsU0FBUyxjQUFjLENBQUMsVUFBa0I7SUFDeEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDOUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN4RyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFFaEQsSUFBSTtRQUNGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtLQUN4QjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDcEUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUNoQjtBQUNILENBQUM7QUFFWSxRQUFBLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBRXpDLElBQUksQ0FBQyxrQkFBVSxFQUFFO0lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxDQUFDLENBQUMsQ0FBQTtJQUMzRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0NBQ2hCO0FBRVksUUFBQSxNQUFNLEdBQUcsY0FBYyxDQUFDLGtCQUFVLENBQUMsQ0FBQSJ9
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Generate SDK modules
|
|
3
|
+
*/
|
|
4
|
+
import { SdkModules } from '../analyzer/controllers';
|
|
5
|
+
import { SdkMethod } from '../analyzer/methods';
|
|
6
|
+
import { SdkMethodParams } from '../analyzer/params';
|
|
7
|
+
/**
|
|
8
|
+
* Generate the SDK's module and controllers files
|
|
9
|
+
* @param modules
|
|
10
|
+
* @returns
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateSdkModules(modules: SdkModules): Map<string, string>;
|
|
13
|
+
/**
|
|
14
|
+
* Generate the method parameters for a given SDK method
|
|
15
|
+
* @param params
|
|
16
|
+
* @returns
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateSdkMethodParams(params: SdkMethodParams): string;
|
|
19
|
+
/**
|
|
20
|
+
* Generate a request call to Central for the generated files
|
|
21
|
+
* @param method
|
|
22
|
+
* @returns
|
|
23
|
+
*/
|
|
24
|
+
export declare function generateCentralRequest(method: SdkMethod): string;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file Generate SDK modules
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateCentralRequest = exports.generateSdkMethodParams = exports.generateSdkModules = void 0;
|
|
7
|
+
const path = require("path");
|
|
8
|
+
const route_1 = require("../analyzer/route");
|
|
9
|
+
const typedeps_1 = require("../analyzer/typedeps");
|
|
10
|
+
const logging_1 = require("../logging");
|
|
11
|
+
/**
|
|
12
|
+
* Generate the SDK's module and controllers files
|
|
13
|
+
* @param modules
|
|
14
|
+
* @returns
|
|
15
|
+
*/
|
|
16
|
+
function generateSdkModules(modules) {
|
|
17
|
+
/** Generated module files */
|
|
18
|
+
const genFiles = new Map();
|
|
19
|
+
// Iterate over each module
|
|
20
|
+
for (const [moduleName, controllers] of modules) {
|
|
21
|
+
// Iterate over each of the module's controllers
|
|
22
|
+
for (const [controllerName, controller] of controllers) {
|
|
23
|
+
/** Generated controller's content */
|
|
24
|
+
const out = [];
|
|
25
|
+
out.push('/// Parent module: ' + moduleName);
|
|
26
|
+
out.push(`/// Controller: "${controllerName}" registered as "${controller.registrationName}" (${controller.methods.length} routes)`);
|
|
27
|
+
out.push('');
|
|
28
|
+
out.push('import { request } from "../central";');
|
|
29
|
+
const imports = new Map();
|
|
30
|
+
const depsToImport = new Array();
|
|
31
|
+
// Iterate over each controller
|
|
32
|
+
for (const method of controller.methods.values()) {
|
|
33
|
+
const { parameters: args, query, body } = method.params;
|
|
34
|
+
depsToImport.push(method.returnType);
|
|
35
|
+
if (args) {
|
|
36
|
+
depsToImport.push(...args.values());
|
|
37
|
+
}
|
|
38
|
+
if (query) {
|
|
39
|
+
depsToImport.push(...query.values());
|
|
40
|
+
}
|
|
41
|
+
if (body) {
|
|
42
|
+
if (body.full) {
|
|
43
|
+
depsToImport.push(body.type);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
depsToImport.push(...body.fields.values());
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Build the imports list
|
|
51
|
+
for (const dep of depsToImport) {
|
|
52
|
+
for (const [file, types] of dep.dependencies) {
|
|
53
|
+
let imported = imports.get(file);
|
|
54
|
+
if (!imported) {
|
|
55
|
+
imported = [];
|
|
56
|
+
imports.set(file, imported);
|
|
57
|
+
}
|
|
58
|
+
for (const typ of types) {
|
|
59
|
+
if (!imported.includes(typ)) {
|
|
60
|
+
imported.push(typ);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
for (const [file, types] of imports) {
|
|
66
|
+
out.push(`import type { ${types.join(', ')} } from "../_types/${(0, typedeps_1.normalizeExternalFilePath)(file.replace(/\\/g, '/')).replace(/\\/g, '/')}";`);
|
|
67
|
+
}
|
|
68
|
+
out.push('');
|
|
69
|
+
out.push(`export default {`);
|
|
70
|
+
for (const method of controller.methods) {
|
|
71
|
+
const ret = method.returnType.resolvedType;
|
|
72
|
+
const promised = ret.startsWith('Promise<') ? ret : `Promise<${ret}>`;
|
|
73
|
+
out.push('');
|
|
74
|
+
out.push(` // ${method.httpMethod} @ ${(0, route_1.unparseRoute)(method.route)}`);
|
|
75
|
+
out.push(` ${method.name}(${generateSdkMethodParams(method.params)}): ${promised} {`);
|
|
76
|
+
out.push(generateCentralRequest(method).replace(/^/gm, ' '));
|
|
77
|
+
out.push(' },');
|
|
78
|
+
}
|
|
79
|
+
out.push('');
|
|
80
|
+
out.push('};');
|
|
81
|
+
genFiles.set(path.join(moduleName, controller.camelClassName + '.ts'), out.join('\n'));
|
|
82
|
+
}
|
|
83
|
+
/** Generated module's content */
|
|
84
|
+
const moduleContent = [];
|
|
85
|
+
moduleContent.push('/// Module name: ' + moduleName);
|
|
86
|
+
moduleContent.push('');
|
|
87
|
+
for (const controller of controllers.keys()) {
|
|
88
|
+
moduleContent.push(`export { default as ${controller} } from "./${controller}";`);
|
|
89
|
+
}
|
|
90
|
+
// Generate the SDK module file
|
|
91
|
+
genFiles.set(path.join(moduleName, 'index.ts'), moduleContent.join('\n'));
|
|
92
|
+
}
|
|
93
|
+
return genFiles;
|
|
94
|
+
}
|
|
95
|
+
exports.generateSdkModules = generateSdkModules;
|
|
96
|
+
/**
|
|
97
|
+
* Generate the method parameters for a given SDK method
|
|
98
|
+
* @param params
|
|
99
|
+
* @returns
|
|
100
|
+
*/
|
|
101
|
+
function generateSdkMethodParams(params) {
|
|
102
|
+
// List of parameters (e.g. `id` in `/get/:id`, analyzed from the usages of the `@Param` decorator)
|
|
103
|
+
const parameters = params.parameters ? [...params.parameters].map(([name, type]) => `${name}: ${type.resolvedType}`) : [];
|
|
104
|
+
// List of query values (e.g. `id` in `?id=xxx`, analyzed from the usages of the `@Query` decorator)
|
|
105
|
+
const query = params.query ? [...params.query].map(([name, type]) => `${name}: ${type.resolvedType}`) : [];
|
|
106
|
+
// Body's content (type used with the `@Body` decorator)
|
|
107
|
+
const body = params.body
|
|
108
|
+
? params.body.full
|
|
109
|
+
? params.body.type.resolvedType
|
|
110
|
+
: '{ ' + [...params.body.fields].map(([name, type]) => `${name}: ${type.resolvedType}`).join(', ') + ' }'
|
|
111
|
+
: null;
|
|
112
|
+
// The ternary conditions below are made to eclipse useless parameters
|
|
113
|
+
// For instance, if we're not expecting any query nor body, these two parameters can be omitted when calling the method
|
|
114
|
+
return [
|
|
115
|
+
`params: {${' ' + parameters.join(', ') + ' '}}${parameters.length === 0 && !body && query.length === 0 ? ' = {}' : ''}`,
|
|
116
|
+
`body: ${body !== null && body !== void 0 ? body : '{}'}${!body && query.length === 0 ? ' = {}' : ''}`,
|
|
117
|
+
`query: {${' ' + query.join(', ') + ' '}}${query.length === 0 ? ' = {}' : ''}`,
|
|
118
|
+
].join(', ');
|
|
119
|
+
}
|
|
120
|
+
exports.generateSdkMethodParams = generateSdkMethodParams;
|
|
121
|
+
/**
|
|
122
|
+
* Generate a request call to Central for the generated files
|
|
123
|
+
* @param method
|
|
124
|
+
* @returns
|
|
125
|
+
*/
|
|
126
|
+
function generateCentralRequest(method) {
|
|
127
|
+
const resolvedRoute = (0, route_1.resolveRouteWith)(method.route, (param) => '${params.' + param + '}');
|
|
128
|
+
if (resolvedRoute instanceof Error) {
|
|
129
|
+
(0, logging_1.panic)('Internal error: failed to resolve route: ' + resolvedRoute.message);
|
|
130
|
+
}
|
|
131
|
+
return `return request('${method.httpMethod}', \`${resolvedRoute}\`, body, query) as any`;
|
|
132
|
+
}
|
|
133
|
+
exports.generateCentralRequest = generateCentralRequest;
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VubW9kdWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0b3IvZ2VubW9kdWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7OztBQUVILDZCQUE0QjtBQUk1Qiw2Q0FBa0U7QUFDbEUsbURBQWtGO0FBQ2xGLHdDQUFrQztBQUVsQzs7OztHQUlHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsT0FBbUI7SUFDcEQsNkJBQTZCO0lBQzdCLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFBO0lBRTFDLDJCQUEyQjtJQUMzQixLQUFLLE1BQU0sQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLElBQUksT0FBTyxFQUFFO1FBQy9DLGdEQUFnRDtRQUNoRCxLQUFLLE1BQU0sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLElBQUksV0FBVyxFQUFFO1lBQ3RELHFDQUFxQztZQUNyQyxNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUE7WUFFeEIsR0FBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxVQUFVLENBQUMsQ0FBQTtZQUM1QyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixjQUFjLG9CQUFvQixVQUFVLENBQUMsZ0JBQWdCLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLFVBQVUsQ0FBQyxDQUFBO1lBQ3BJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDWixHQUFHLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLENBQUE7WUFFakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUE7WUFFM0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxLQUFLLEVBQW9CLENBQUE7WUFFbEQsK0JBQStCO1lBQy9CLEtBQUssTUFBTSxNQUFNLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDaEQsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJ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
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Generate type files for the SDK
|
|
3
|
+
*/
|
|
4
|
+
import { TypesExtractorContent } from '../analyzer/extractor';
|
|
5
|
+
/**
|
|
6
|
+
* Generate the non-formatted type files which will be used by the SDK's route functions
|
|
7
|
+
* @param sdkTypes
|
|
8
|
+
* @returns
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateSdkTypeFiles(sdkTypes: TypesExtractorContent): Map<string, string>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file Generate type files for the SDK
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateSdkTypeFiles = void 0;
|
|
7
|
+
const path = require("path");
|
|
8
|
+
const typedeps_1 = require("../analyzer/typedeps");
|
|
9
|
+
/**
|
|
10
|
+
* Generate the non-formatted type files which will be used by the SDK's route functions
|
|
11
|
+
* @param sdkTypes
|
|
12
|
+
* @returns
|
|
13
|
+
*/
|
|
14
|
+
function generateSdkTypeFiles(sdkTypes) {
|
|
15
|
+
/** Generated type files */
|
|
16
|
+
const genFiles = new Map();
|
|
17
|
+
// While analyzing the controllers' content, all types used by their methods have been extracted
|
|
18
|
+
// The list of these types is then provided to this function as the `sdkTypes` argument, allowing us
|
|
19
|
+
// to establish the list of all dependencies.
|
|
20
|
+
for (const [file, types] of sdkTypes) {
|
|
21
|
+
const out = [];
|
|
22
|
+
/** List of imports in the current file */
|
|
23
|
+
const imports = new Map();
|
|
24
|
+
// Iterate over all types in the current `file`
|
|
25
|
+
for (const extracted of types.values()) {
|
|
26
|
+
// Iterate over all of the extracted type's dependencies
|
|
27
|
+
for (const dep of extracted.dependencies) {
|
|
28
|
+
// If the dependency is from the same file, then we have nothing to do
|
|
29
|
+
if (dep.relativePath === file) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
// Push the typename to the list of imports
|
|
33
|
+
let imported = imports.get(dep.relativePathNoExt);
|
|
34
|
+
if (!imported) {
|
|
35
|
+
imported = [dep.typename];
|
|
36
|
+
imports.set(dep.relativePathNoExt, imported);
|
|
37
|
+
}
|
|
38
|
+
if (!imported.includes(dep.typename)) {
|
|
39
|
+
imported.push(dep.typename);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Generate an import statement for each imported type
|
|
44
|
+
out.push([...imports]
|
|
45
|
+
.map(([depFile, types]) => {
|
|
46
|
+
let depPath = path.relative(path.dirname(file), (0, typedeps_1.normalizeExternalFilePath)(depFile)).replace(/\\/g, '/');
|
|
47
|
+
if (!depPath.includes('/'))
|
|
48
|
+
depPath = './' + depPath;
|
|
49
|
+
return `import type { ${types.join(', ')} } from "${depPath.startsWith('./') || depPath.startsWith('../') ? depPath : './' + depPath}"`;
|
|
50
|
+
})
|
|
51
|
+
.join('\n'));
|
|
52
|
+
// Add the extracted types' declaration, indented
|
|
53
|
+
for (const extracted of types.values()) {
|
|
54
|
+
out.push(extracted.content.replace(/^/gm, ' '));
|
|
55
|
+
}
|
|
56
|
+
// Generate the type file
|
|
57
|
+
genFiles.set(file, out.join('\n'));
|
|
58
|
+
}
|
|
59
|
+
return genFiles;
|
|
60
|
+
}
|
|
61
|
+
exports.generateSdkTypeFiles = generateSdkTypeFiles;
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuZXJhdG9yL2dlbnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7O0FBRUgsNkJBQTRCO0FBRTVCLG1EQUFnRTtBQUVoRTs7OztHQUlHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsUUFBK0I7SUFDbEUsMkJBQTJCO0lBQzNCLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFBO0lBRTFDLGdHQUFnRztJQUNoRyxvR0FBb0c7SUFDcEcsOENBQThDO0lBQzlDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxRQUFRLEVBQUU7UUFDcEMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFBO1FBRWQsMENBQTBDO1FBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFBO1FBRTNDLCtDQUErQztRQUMvQyxLQUFLLE1BQU0sU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN0Qyx3REFBd0Q7WUFDeEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFO2dCQUN4QyxzRUFBc0U7Z0JBQ3RFLElBQUksR0FBRyxDQUFDLFlBQVksS0FBSyxJQUFJLEVBQUU7b0JBQzdCLFNBQVE7aUJBQ1Q7Z0JBRUQsMkNBQTJDO2dCQUMzQyxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO2dCQUVqRCxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNiLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtvQkFDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLENBQUE7aUJBQzdDO2dCQUVELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDcEMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7aUJBQzVCO2FBQ0Y7U0FDRjtRQUVELHNEQUFzRDtRQUN0RCxHQUFHLENBQUMsSUFBSSxDQUNOLENBQUMsR0FBRyxPQUFPLENBQUM7YUFDVCxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3hCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFBLG9DQUF5QixFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUN2RyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsT0FBTyxHQUFHLElBQUksR0FBRyxPQUFPLENBQUE7WUFDcEQsT0FBTyxpQkFBaUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFDdEMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxPQUMzRSxHQUFHLENBQUE7UUFDTCxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ2QsQ0FBQTtRQUVELGlEQUFpRDtRQUNqRCxLQUFLLE1BQU0sU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN0QyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO1NBQ2pEO1FBRUQseUJBQXlCO1FBQ3pCLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtLQUNuQztJQUVELE9BQU8sUUFBUSxDQUFBO0FBQ2pCLENBQUM7QUEzREQsb0RBMkRDIn0=
|