@trapi/metadata 1.2.3 → 2.0.0-beta.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 (330) hide show
  1. package/README.md +63 -16
  2. package/dist/index.d.mts +1718 -0
  3. package/dist/index.d.mts.map +1 -0
  4. package/dist/index.mjs +3310 -0
  5. package/dist/index.mjs.map +1 -0
  6. package/package.json +27 -15
  7. package/dist/cache/client.d.ts +0 -15
  8. package/dist/cache/client.d.ts.map +0 -1
  9. package/dist/cache/client.js +0 -98
  10. package/dist/cache/client.js.map +0 -1
  11. package/dist/cache/index.d.ts +0 -4
  12. package/dist/cache/index.d.ts.map +0 -1
  13. package/dist/cache/index.js +0 -26
  14. package/dist/cache/index.js.map +0 -1
  15. package/dist/cache/type.d.ts +0 -33
  16. package/dist/cache/type.d.ts.map +0 -1
  17. package/dist/cache/type.js +0 -9
  18. package/dist/cache/type.js.map +0 -1
  19. package/dist/cache/utils.d.ts +0 -4
  20. package/dist/cache/utils.d.ts.map +0 -1
  21. package/dist/cache/utils.js +0 -53
  22. package/dist/cache/utils.js.map +0 -1
  23. package/dist/config/index.d.ts +0 -2
  24. package/dist/config/index.d.ts.map +0 -1
  25. package/dist/config/index.js +0 -24
  26. package/dist/config/index.js.map +0 -1
  27. package/dist/config/type.d.ts +0 -37
  28. package/dist/config/type.d.ts.map +0 -1
  29. package/dist/config/type.js +0 -9
  30. package/dist/config/type.js.map +0 -1
  31. package/dist/decorator/constants.d.ts +0 -41
  32. package/dist/decorator/constants.d.ts.map +0 -1
  33. package/dist/decorator/constants.js +0 -53
  34. package/dist/decorator/constants.js.map +0 -1
  35. package/dist/decorator/index.d.ts +0 -7
  36. package/dist/decorator/index.d.ts.map +0 -1
  37. package/dist/decorator/index.js +0 -29
  38. package/dist/decorator/index.js.map +0 -1
  39. package/dist/decorator/preset/index.d.ts +0 -3
  40. package/dist/decorator/preset/index.d.ts.map +0 -1
  41. package/dist/decorator/preset/index.js +0 -25
  42. package/dist/decorator/preset/index.js.map +0 -1
  43. package/dist/decorator/preset/type.d.ts +0 -6
  44. package/dist/decorator/preset/type.d.ts.map +0 -1
  45. package/dist/decorator/preset/type.js +0 -9
  46. package/dist/decorator/preset/type.js.map +0 -1
  47. package/dist/decorator/preset/utils/check.d.ts +0 -3
  48. package/dist/decorator/preset/utils/check.d.ts.map +0 -1
  49. package/dist/decorator/preset/utils/check.js +0 -18
  50. package/dist/decorator/preset/utils/check.js.map +0 -1
  51. package/dist/decorator/preset/utils/index.d.ts +0 -4
  52. package/dist/decorator/preset/utils/index.d.ts.map +0 -1
  53. package/dist/decorator/preset/utils/index.js +0 -26
  54. package/dist/decorator/preset/utils/index.js.map +0 -1
  55. package/dist/decorator/preset/utils/load.d.ts +0 -3
  56. package/dist/decorator/preset/utils/load.d.ts.map +0 -1
  57. package/dist/decorator/preset/utils/load.js +0 -51
  58. package/dist/decorator/preset/utils/load.js.map +0 -1
  59. package/dist/decorator/preset/utils/normalize.d.ts +0 -2
  60. package/dist/decorator/preset/utils/normalize.d.ts.map +0 -1
  61. package/dist/decorator/preset/utils/normalize.js +0 -27
  62. package/dist/decorator/preset/utils/normalize.js.map +0 -1
  63. package/dist/decorator/property-manager/index.d.ts +0 -3
  64. package/dist/decorator/property-manager/index.d.ts.map +0 -1
  65. package/dist/decorator/property-manager/index.js +0 -25
  66. package/dist/decorator/property-manager/index.js.map +0 -1
  67. package/dist/decorator/property-manager/module.d.ts +0 -17
  68. package/dist/decorator/property-manager/module.d.ts.map +0 -1
  69. package/dist/decorator/property-manager/module.js +0 -59
  70. package/dist/decorator/property-manager/module.js.map +0 -1
  71. package/dist/decorator/property-manager/utils.d.ts +0 -6
  72. package/dist/decorator/property-manager/utils.d.ts.map +0 -1
  73. package/dist/decorator/property-manager/utils.js +0 -92
  74. package/dist/decorator/property-manager/utils.js.map +0 -1
  75. package/dist/decorator/resolver/index.d.ts +0 -3
  76. package/dist/decorator/resolver/index.d.ts.map +0 -1
  77. package/dist/decorator/resolver/index.js +0 -25
  78. package/dist/decorator/resolver/index.js.map +0 -1
  79. package/dist/decorator/resolver/module.d.ts +0 -27
  80. package/dist/decorator/resolver/module.d.ts.map +0 -1
  81. package/dist/decorator/resolver/module.js +0 -72
  82. package/dist/decorator/resolver/module.js.map +0 -1
  83. package/dist/decorator/resolver/type.d.ts +0 -10
  84. package/dist/decorator/resolver/type.d.ts.map +0 -1
  85. package/dist/decorator/resolver/type.js +0 -3
  86. package/dist/decorator/resolver/type.js.map +0 -1
  87. package/dist/decorator/sets/class.d.ts +0 -7
  88. package/dist/decorator/sets/class.d.ts.map +0 -1
  89. package/dist/decorator/sets/class.js +0 -9
  90. package/dist/decorator/sets/class.js.map +0 -1
  91. package/dist/decorator/sets/index.d.ts +0 -8
  92. package/dist/decorator/sets/index.d.ts.map +0 -1
  93. package/dist/decorator/sets/index.js +0 -29
  94. package/dist/decorator/sets/index.js.map +0 -1
  95. package/dist/decorator/sets/method.d.ts +0 -14
  96. package/dist/decorator/sets/method.d.ts.map +0 -1
  97. package/dist/decorator/sets/method.js +0 -9
  98. package/dist/decorator/sets/method.js.map +0 -1
  99. package/dist/decorator/sets/mixed.d.ts +0 -12
  100. package/dist/decorator/sets/mixed.d.ts.map +0 -1
  101. package/dist/decorator/sets/mixed.js +0 -9
  102. package/dist/decorator/sets/mixed.js.map +0 -1
  103. package/dist/decorator/sets/parameter.d.ts +0 -21
  104. package/dist/decorator/sets/parameter.d.ts.map +0 -1
  105. package/dist/decorator/sets/parameter.js +0 -9
  106. package/dist/decorator/sets/parameter.js.map +0 -1
  107. package/dist/decorator/sets/request.d.ts +0 -6
  108. package/dist/decorator/sets/request.d.ts.map +0 -1
  109. package/dist/decorator/sets/request.js +0 -9
  110. package/dist/decorator/sets/request.js.map +0 -1
  111. package/dist/decorator/sets/response.d.ts +0 -17
  112. package/dist/decorator/sets/response.d.ts.map +0 -1
  113. package/dist/decorator/sets/response.js +0 -9
  114. package/dist/decorator/sets/response.js.map +0 -1
  115. package/dist/decorator/sets/type.d.ts +0 -4
  116. package/dist/decorator/sets/type.d.ts.map +0 -1
  117. package/dist/decorator/sets/type.js +0 -3
  118. package/dist/decorator/sets/type.js.map +0 -1
  119. package/dist/decorator/type.d.ts +0 -32
  120. package/dist/decorator/type.d.ts.map +0 -1
  121. package/dist/decorator/type.js +0 -9
  122. package/dist/decorator/type.js.map +0 -1
  123. package/dist/error/base.d.ts +0 -3
  124. package/dist/error/base.d.ts.map +0 -1
  125. package/dist/error/base.js +0 -13
  126. package/dist/error/base.js.map +0 -1
  127. package/dist/error/index.d.ts +0 -2
  128. package/dist/error/index.d.ts.map +0 -1
  129. package/dist/error/index.js +0 -24
  130. package/dist/error/index.js.map +0 -1
  131. package/dist/generator/abstract.d.ts +0 -19
  132. package/dist/generator/abstract.d.ts.map +0 -1
  133. package/dist/generator/abstract.js +0 -151
  134. package/dist/generator/abstract.js.map +0 -1
  135. package/dist/generator/controller/index.d.ts +0 -3
  136. package/dist/generator/controller/index.d.ts.map +0 -1
  137. package/dist/generator/controller/index.js +0 -25
  138. package/dist/generator/controller/index.js.map +0 -1
  139. package/dist/generator/controller/module.d.ts +0 -13
  140. package/dist/generator/controller/module.d.ts.map +0 -1
  141. package/dist/generator/controller/module.js +0 -68
  142. package/dist/generator/controller/module.js.map +0 -1
  143. package/dist/generator/controller/type.d.ts +0 -47
  144. package/dist/generator/controller/type.d.ts.map +0 -1
  145. package/dist/generator/controller/type.js +0 -3
  146. package/dist/generator/controller/type.js.map +0 -1
  147. package/dist/generator/index.d.ts +0 -7
  148. package/dist/generator/index.d.ts.map +0 -1
  149. package/dist/generator/index.js +0 -29
  150. package/dist/generator/index.js.map +0 -1
  151. package/dist/generator/metadata/index.d.ts +0 -4
  152. package/dist/generator/metadata/index.d.ts.map +0 -1
  153. package/dist/generator/metadata/index.js +0 -26
  154. package/dist/generator/metadata/index.js.map +0 -1
  155. package/dist/generator/metadata/module.d.ts +0 -39
  156. package/dist/generator/metadata/module.d.ts.map +0 -1
  157. package/dist/generator/metadata/module.js +0 -140
  158. package/dist/generator/metadata/module.js.map +0 -1
  159. package/dist/generator/metadata/type.d.ts +0 -25
  160. package/dist/generator/metadata/type.d.ts.map +0 -1
  161. package/dist/generator/metadata/type.js +0 -3
  162. package/dist/generator/metadata/type.js.map +0 -1
  163. package/dist/generator/metadata/utils.d.ts +0 -3
  164. package/dist/generator/metadata/utils.d.ts.map +0 -1
  165. package/dist/generator/metadata/utils.js +0 -19
  166. package/dist/generator/metadata/utils.js.map +0 -1
  167. package/dist/generator/method/constants.d.ts +0 -11
  168. package/dist/generator/method/constants.d.ts.map +0 -1
  169. package/dist/generator/method/constants.js +0 -21
  170. package/dist/generator/method/constants.js.map +0 -1
  171. package/dist/generator/method/index.d.ts +0 -4
  172. package/dist/generator/method/index.d.ts.map +0 -1
  173. package/dist/generator/method/index.js +0 -26
  174. package/dist/generator/method/index.js.map +0 -1
  175. package/dist/generator/method/module.d.ts +0 -19
  176. package/dist/generator/method/module.d.ts.map +0 -1
  177. package/dist/generator/method/module.js +0 -188
  178. package/dist/generator/method/module.js.map +0 -1
  179. package/dist/generator/method/type.d.ts +0 -23
  180. package/dist/generator/method/type.d.ts.map +0 -1
  181. package/dist/generator/method/type.js +0 -9
  182. package/dist/generator/method/type.js.map +0 -1
  183. package/dist/generator/parameter/constants.d.ts +0 -19
  184. package/dist/generator/parameter/constants.d.ts.map +0 -1
  185. package/dist/generator/parameter/constants.js +0 -30
  186. package/dist/generator/parameter/constants.js.map +0 -1
  187. package/dist/generator/parameter/error.d.ts +0 -35
  188. package/dist/generator/parameter/error.d.ts.map +0 -1
  189. package/dist/generator/parameter/error.js +0 -68
  190. package/dist/generator/parameter/error.js.map +0 -1
  191. package/dist/generator/parameter/index.d.ts +0 -5
  192. package/dist/generator/parameter/index.d.ts.map +0 -1
  193. package/dist/generator/parameter/index.js +0 -27
  194. package/dist/generator/parameter/index.js.map +0 -1
  195. package/dist/generator/parameter/module.d.ts +0 -29
  196. package/dist/generator/parameter/module.d.ts.map +0 -1
  197. package/dist/generator/parameter/module.js +0 -556
  198. package/dist/generator/parameter/module.js.map +0 -1
  199. package/dist/generator/parameter/type.d.ts +0 -25
  200. package/dist/generator/parameter/type.d.ts.map +0 -1
  201. package/dist/generator/parameter/type.js +0 -9
  202. package/dist/generator/parameter/type.js.map +0 -1
  203. package/dist/generator/type.d.ts +0 -20
  204. package/dist/generator/type.d.ts.map +0 -1
  205. package/dist/generator/type.js +0 -9
  206. package/dist/generator/type.js.map +0 -1
  207. package/dist/index.d.ts +0 -10
  208. package/dist/index.d.ts.map +0 -1
  209. package/dist/index.js +0 -32
  210. package/dist/index.js.map +0 -1
  211. package/dist/module.d.ts +0 -5
  212. package/dist/module.d.ts.map +0 -1
  213. package/dist/module.js +0 -41
  214. package/dist/module.js.map +0 -1
  215. package/dist/resolver/constants.d.ts +0 -36
  216. package/dist/resolver/constants.d.ts.map +0 -1
  217. package/dist/resolver/constants.js +0 -47
  218. package/dist/resolver/constants.js.map +0 -1
  219. package/dist/resolver/error.d.ts +0 -8
  220. package/dist/resolver/error.d.ts.map +0 -1
  221. package/dist/resolver/error.js +0 -41
  222. package/dist/resolver/error.js.map +0 -1
  223. package/dist/resolver/extension/index.d.ts +0 -3
  224. package/dist/resolver/extension/index.d.ts.map +0 -1
  225. package/dist/resolver/extension/index.js +0 -25
  226. package/dist/resolver/extension/index.js.map +0 -1
  227. package/dist/resolver/extension/module.d.ts +0 -5
  228. package/dist/resolver/extension/module.d.ts.map +0 -1
  229. package/dist/resolver/extension/module.js +0 -27
  230. package/dist/resolver/extension/module.js.map +0 -1
  231. package/dist/resolver/extension/type.d.ts +0 -8
  232. package/dist/resolver/extension/type.d.ts.map +0 -1
  233. package/dist/resolver/extension/type.js +0 -9
  234. package/dist/resolver/extension/type.js.map +0 -1
  235. package/dist/resolver/index.d.ts +0 -6
  236. package/dist/resolver/index.d.ts.map +0 -1
  237. package/dist/resolver/index.js +0 -28
  238. package/dist/resolver/index.js.map +0 -1
  239. package/dist/resolver/module.d.ts +0 -57
  240. package/dist/resolver/module.d.ts.map +0 -1
  241. package/dist/resolver/module.js +0 -1109
  242. package/dist/resolver/module.js.map +0 -1
  243. package/dist/resolver/type.d.ts +0 -139
  244. package/dist/resolver/type.d.ts.map +0 -1
  245. package/dist/resolver/type.js +0 -130
  246. package/dist/resolver/type.js.map +0 -1
  247. package/dist/type.d.ts +0 -2
  248. package/dist/type.d.ts.map +0 -1
  249. package/dist/type.js +0 -9
  250. package/dist/type.js.map +0 -1
  251. package/dist/utils/array.d.ts +0 -2
  252. package/dist/utils/array.d.ts.map +0 -1
  253. package/dist/utils/array.js +0 -22
  254. package/dist/utils/array.js.map +0 -1
  255. package/dist/utils/index.d.ts +0 -10
  256. package/dist/utils/index.d.ts.map +0 -1
  257. package/dist/utils/index.js +0 -32
  258. package/dist/utils/index.js.map +0 -1
  259. package/dist/utils/initializer.d.ts +0 -5
  260. package/dist/utils/initializer.d.ts.map +0 -1
  261. package/dist/utils/initializer.js +0 -131
  262. package/dist/utils/initializer.js.map +0 -1
  263. package/dist/utils/js-doc/constants.d.ts +0 -19
  264. package/dist/utils/js-doc/constants.d.ts.map +0 -1
  265. package/dist/utils/js-doc/constants.js +0 -30
  266. package/dist/utils/js-doc/constants.js.map +0 -1
  267. package/dist/utils/js-doc/index.d.ts +0 -4
  268. package/dist/utils/js-doc/index.d.ts.map +0 -1
  269. package/dist/utils/js-doc/index.js +0 -26
  270. package/dist/utils/js-doc/index.js.map +0 -1
  271. package/dist/utils/js-doc/module.d.ts +0 -9
  272. package/dist/utils/js-doc/module.d.ts.map +0 -1
  273. package/dist/utils/js-doc/module.js +0 -98
  274. package/dist/utils/js-doc/module.js.map +0 -1
  275. package/dist/utils/js-doc/utils.d.ts +0 -3
  276. package/dist/utils/js-doc/utils.d.ts.map +0 -1
  277. package/dist/utils/js-doc/utils.js +0 -29
  278. package/dist/utils/js-doc/utils.js.map +0 -1
  279. package/dist/utils/node/index.d.ts +0 -3
  280. package/dist/utils/node/index.d.ts.map +0 -1
  281. package/dist/utils/node/index.js +0 -25
  282. package/dist/utils/node/index.js.map +0 -1
  283. package/dist/utils/node/module.d.ts +0 -10
  284. package/dist/utils/node/module.d.ts.map +0 -1
  285. package/dist/utils/node/module.js +0 -52
  286. package/dist/utils/node/module.js.map +0 -1
  287. package/dist/utils/node/type.d.ts +0 -6
  288. package/dist/utils/node/type.d.ts.map +0 -1
  289. package/dist/utils/node/type.js +0 -9
  290. package/dist/utils/node/type.js.map +0 -1
  291. package/dist/utils/object.d.ts +0 -2
  292. package/dist/utils/object.d.ts.map +0 -1
  293. package/dist/utils/object.js +0 -15
  294. package/dist/utils/object.js.map +0 -1
  295. package/dist/utils/path-normalize.d.ts +0 -2
  296. package/dist/utils/path-normalize.d.ts.map +0 -1
  297. package/dist/utils/path-normalize.js +0 -17
  298. package/dist/utils/path-normalize.js.map +0 -1
  299. package/dist/utils/source-files.d.ts +0 -3
  300. package/dist/utils/source-files.d.ts.map +0 -1
  301. package/dist/utils/source-files.js +0 -32
  302. package/dist/utils/source-files.js.map +0 -1
  303. package/dist/utils/tsconfig/index.d.ts +0 -3
  304. package/dist/utils/tsconfig/index.d.ts.map +0 -1
  305. package/dist/utils/tsconfig/index.js +0 -25
  306. package/dist/utils/tsconfig/index.js.map +0 -1
  307. package/dist/utils/tsconfig/module.d.ts +0 -4
  308. package/dist/utils/tsconfig/module.d.ts.map +0 -1
  309. package/dist/utils/tsconfig/module.js +0 -54
  310. package/dist/utils/tsconfig/module.js.map +0 -1
  311. package/dist/utils/tsconfig/type.d.ts +0 -11
  312. package/dist/utils/tsconfig/type.d.ts.map +0 -1
  313. package/dist/utils/tsconfig/type.js +0 -9
  314. package/dist/utils/tsconfig/type.js.map +0 -1
  315. package/dist/utils/validator/constants.d.ts +0 -13
  316. package/dist/utils/validator/constants.d.ts.map +0 -1
  317. package/dist/utils/validator/constants.js +0 -23
  318. package/dist/utils/validator/constants.js.map +0 -1
  319. package/dist/utils/validator/index.d.ts +0 -4
  320. package/dist/utils/validator/index.d.ts.map +0 -1
  321. package/dist/utils/validator/index.js +0 -26
  322. package/dist/utils/validator/index.js.map +0 -1
  323. package/dist/utils/validator/module.d.ts +0 -4
  324. package/dist/utils/validator/module.d.ts.map +0 -1
  325. package/dist/utils/validator/module.js +0 -142
  326. package/dist/utils/validator/module.js.map +0 -1
  327. package/dist/utils/validator/type.d.ts +0 -6
  328. package/dist/utils/validator/type.d.ts.map +0 -1
  329. package/dist/utils/validator/type.js +0 -9
  330. package/dist/utils/validator/type.js.map +0 -1
@@ -1,1109 +0,0 @@
1
- "use strict";
2
- /*
3
- * Copyright (c) 2021.
4
- * Author Peter Placzek (tada5hi)
5
- * For the full copyright and license information,
6
- * view the LICENSE file that was distributed with this source code.
7
- */
8
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
- if (k2 === undefined) k2 = k;
10
- var desc = Object.getOwnPropertyDescriptor(m, k);
11
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
- desc = { enumerable: true, get: function() { return m[k]; } };
13
- }
14
- Object.defineProperty(o, k2, desc);
15
- }) : (function(o, m, k, k2) {
16
- if (k2 === undefined) k2 = k;
17
- o[k2] = m[k];
18
- }));
19
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
- Object.defineProperty(o, "default", { enumerable: true, value: v });
21
- }) : function(o, v) {
22
- o["default"] = v;
23
- });
24
- var __importStar = (this && this.__importStar) || function (mod) {
25
- if (mod && mod.__esModule) return mod;
26
- var result = {};
27
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
- __setModuleDefault(result, mod);
29
- return result;
30
- };
31
- Object.defineProperty(exports, "__esModule", { value: true });
32
- exports.TypeNodeResolver = void 0;
33
- const ts = __importStar(require("typescript"));
34
- const decorator_1 = require("../decorator");
35
- const constants_1 = require("./constants");
36
- const utils_1 = require("../utils");
37
- const error_1 = require("./error");
38
- const extension_1 = require("./extension");
39
- const type_1 = require("./type");
40
- const localReferenceTypeCache = {};
41
- const inProgressTypes = {};
42
- class TypeNodeResolver {
43
- constructor(typeNode, current, parentNode, context, referencer) {
44
- this.attemptToResolveKindToPrimitive = (syntaxKind) => {
45
- if (syntaxKind === ts.SyntaxKind.NumberKeyword) {
46
- return 'number';
47
- }
48
- if (syntaxKind === ts.SyntaxKind.StringKeyword) {
49
- return 'string';
50
- }
51
- if (syntaxKind === ts.SyntaxKind.BooleanKeyword) {
52
- return 'boolean';
53
- }
54
- if (syntaxKind === ts.SyntaxKind.VoidKeyword) {
55
- return 'void';
56
- }
57
- return undefined;
58
- };
59
- this.typeNode = typeNode;
60
- this.current = current;
61
- this.parentNode = parentNode;
62
- this.context = context || {};
63
- this.referencer = referencer;
64
- }
65
- static clearCache() {
66
- Object.keys(localReferenceTypeCache).forEach((key) => {
67
- delete localReferenceTypeCache[key];
68
- });
69
- Object.keys(inProgressTypes).forEach((key) => {
70
- delete inProgressTypes[key];
71
- });
72
- }
73
- resolve() {
74
- const primitiveType = this.getPrimitiveType(this.typeNode, this.parentNode);
75
- if (primitiveType) {
76
- return primitiveType;
77
- }
78
- if (this.typeNode.kind === ts.SyntaxKind.NullKeyword) {
79
- return {
80
- typeName: constants_1.TypeName.ENUM,
81
- members: [null],
82
- };
83
- }
84
- if (this.typeNode.kind === ts.SyntaxKind.UndefinedKeyword) {
85
- return {
86
- typeName: constants_1.TypeName.UNDEFINED,
87
- };
88
- }
89
- if (ts.isArrayTypeNode(this.typeNode)) {
90
- return {
91
- typeName: constants_1.TypeName.ARRAY,
92
- elementType: new TypeNodeResolver(this.typeNode.elementType, this.current, this.parentNode, this.context).resolve(),
93
- };
94
- }
95
- if (ts.isUnionTypeNode(this.typeNode)) {
96
- const members = this.typeNode.types.map((type) => new TypeNodeResolver(type, this.current, this.parentNode, this.context).resolve());
97
- return {
98
- typeName: constants_1.TypeName.UNION,
99
- members,
100
- };
101
- }
102
- if (ts.isIntersectionTypeNode(this.typeNode)) {
103
- const members = this.typeNode.types.map((type) => new TypeNodeResolver(type, this.current, this.parentNode, this.context).resolve());
104
- return {
105
- typeName: constants_1.TypeName.INTERSECTION,
106
- members,
107
- };
108
- }
109
- if (this.typeNode.kind === ts.SyntaxKind.AnyKeyword ||
110
- this.typeNode.kind === ts.SyntaxKind.UnknownKeyword) {
111
- return {
112
- typeName: constants_1.TypeName.ANY,
113
- };
114
- }
115
- if (ts.isLiteralTypeNode(this.typeNode)) {
116
- return {
117
- typeName: constants_1.TypeName.ENUM,
118
- members: [TypeNodeResolver.getLiteralValue(this.typeNode)],
119
- };
120
- }
121
- if (ts.isTypeLiteralNode(this.typeNode)) {
122
- const properties = this.typeNode.members
123
- .filter((member) => ts.isPropertySignature(member))
124
- .reduce((res, propertySignature) => {
125
- const type = new TypeNodeResolver(propertySignature.type, this.current, propertySignature, this.context).resolve();
126
- const property = {
127
- deprecated: (0, utils_1.hasJSDocTag)(propertySignature, utils_1.JSDocTagName.DEPRECATED),
128
- example: this.getNodeExample(propertySignature),
129
- extensions: this.getNodeExtensions(propertySignature),
130
- default: (0, utils_1.getJSDocTagComment)(propertySignature, utils_1.JSDocTagName.DEFAULT),
131
- description: this.getNodeDescription(propertySignature),
132
- format: TypeNodeResolver.getNodeFormat(propertySignature),
133
- name: propertySignature.name.text,
134
- required: !propertySignature.questionToken,
135
- type,
136
- validators: (0, utils_1.getDeclarationValidators)(propertySignature) || {},
137
- };
138
- return [property, ...res];
139
- }, []);
140
- const indexMember = this.typeNode.members.find((member) => ts.isIndexSignatureDeclaration(member));
141
- let additionalType;
142
- if (indexMember) {
143
- const indexSignatureDeclaration = indexMember;
144
- const indexType = new TypeNodeResolver(indexSignatureDeclaration.parameters[0].type, this.current, this.parentNode, this.context).resolve();
145
- if (!(0, type_1.isStringType)(indexType)) {
146
- throw new error_1.ResolverError('Only string indexes are supported.', this.typeNode);
147
- }
148
- additionalType = new TypeNodeResolver(indexSignatureDeclaration.type, this.current, this.parentNode, this.context).resolve();
149
- }
150
- return {
151
- additionalProperties: indexMember && additionalType,
152
- typeName: constants_1.TypeName.NESTED_OBJECT_LITERAL,
153
- properties,
154
- };
155
- }
156
- if (this.typeNode.kind === ts.SyntaxKind.ObjectKeyword ||
157
- ts.isFunctionTypeNode(this.typeNode)) {
158
- return { typeName: constants_1.TypeName.OBJECT };
159
- }
160
- if (ts.isMappedTypeNode(this.typeNode) && this.referencer) {
161
- const type = this.current.typeChecker.getTypeFromTypeNode(this.referencer);
162
- const mappedTypeNode = this.typeNode;
163
- const { typeChecker } = this.current;
164
- const getDeclaration = (prop) => prop.declarations && prop.declarations[0];
165
- const isIgnored = (prop) => {
166
- const declaration = getDeclaration(prop);
167
- const tagNames = prop.getJsDocTags();
168
- const tagNameIndex = tagNames.findIndex((tag) => tag.name === utils_1.JSDocTagName.IGNORE);
169
- if (tagNameIndex >= 0) {
170
- return true;
171
- }
172
- return (!!declaration &&
173
- !ts.isPropertyDeclaration(declaration) &&
174
- !ts.isPropertySignature(declaration) &&
175
- !ts.isParameter(declaration));
176
- };
177
- const properties = type
178
- .getProperties()
179
- // Ignore methods, getter, setter and @ignored props
180
- .filter((property) => isIgnored(property) === false)
181
- // Transform to property
182
- .map((property) => {
183
- const propertyType = typeChecker.getTypeOfSymbolAtLocation(property, this.typeNode);
184
- const declaration = getDeclaration(property);
185
- if (declaration && ts.isPropertySignature(declaration)) {
186
- return { ...this.propertyFromSignature(declaration, mappedTypeNode.questionToken), name: property.getName() };
187
- }
188
- if (declaration && (ts.isPropertyDeclaration(declaration) || ts.isParameter(declaration))) {
189
- return { ...this.propertyFromDeclaration(declaration, mappedTypeNode.questionToken), name: property.getName() };
190
- }
191
- // Resolve default value, required and typeNode
192
- let required = false;
193
- const typeNode = this.current.typeChecker.typeToTypeNode(propertyType, undefined, ts.NodeBuilderFlags.NoTruncation);
194
- if (mappedTypeNode.questionToken && mappedTypeNode.questionToken.kind === ts.SyntaxKind.MinusToken) {
195
- required = true;
196
- }
197
- else if (mappedTypeNode.questionToken && mappedTypeNode.questionToken.kind === ts.SyntaxKind.QuestionToken) {
198
- required = false;
199
- }
200
- // Push property
201
- return {
202
- name: property.getName(),
203
- required,
204
- deprecated: false,
205
- type: new TypeNodeResolver(typeNode, this.current, this.typeNode, this.context, this.referencer).resolve(),
206
- validators: {},
207
- };
208
- });
209
- return {
210
- typeName: constants_1.TypeName.NESTED_OBJECT_LITERAL,
211
- properties,
212
- };
213
- }
214
- if (ts.isConditionalTypeNode(this.typeNode) &&
215
- this.referencer &&
216
- ts.isTypeReferenceNode(this.referencer)) {
217
- const type = this.current.typeChecker.getTypeFromTypeNode(this.referencer);
218
- if (type.aliasSymbol) {
219
- let declaration = type.aliasSymbol.declarations[0];
220
- if (declaration.name) {
221
- declaration = this.getModelTypeDeclaration(declaration.name);
222
- }
223
- const name = TypeNodeResolver.getRefTypeName(this.referencer.getText());
224
- return this.handleCachingAndCircularReferences(name, () => {
225
- if (ts.isTypeAliasDeclaration(declaration)) {
226
- // Note: I don't understand why typescript lose type for `this.referencer` (from above with isTypeReferenceNode())
227
- return this.getTypeAliasReference(declaration, this.current.typeChecker.typeToString(type), this.referencer);
228
- }
229
- if (ts.isEnumDeclaration(declaration)) {
230
- return this.getEnumerateType(declaration.name);
231
- }
232
- throw new error_1.ResolverError(`Couldn't resolve Conditional to TypeNode. If you think this should be resolvable, please file an Issue. We found an aliasSymbol and it's declaration was of kind ${declaration.kind}`, this.typeNode);
233
- });
234
- }
235
- if (type.isClassOrInterface()) {
236
- let declaration = type.symbol.declarations[0];
237
- if (declaration.name) {
238
- declaration = this.getModelTypeDeclaration(declaration.name);
239
- }
240
- const name = TypeNodeResolver.getRefTypeName(this.referencer.getText());
241
- return this.handleCachingAndCircularReferences(name, () => this.getModelReference(declaration, this.current.typeChecker.typeToString(type)));
242
- }
243
- try {
244
- return new TypeNodeResolver(this.current.typeChecker.typeToTypeNode(type, undefined, ts.NodeBuilderFlags.NoTruncation), this.current, this.typeNode, this.context, this.referencer).resolve();
245
- }
246
- catch {
247
- throw new error_1.ResolverError(`Couldn't resolve Conditional to TypeNode. If you think this should be resolvable, please file an Issue. The flags on the result of the ConditionalType was ${type.flags}`, this.typeNode);
248
- }
249
- }
250
- if (ts.isTypeOperatorNode(this.typeNode)) {
251
- if (this.typeNode.operator === ts.SyntaxKind.KeyOfKeyword) {
252
- const type = this.current.typeChecker.getTypeFromTypeNode(this.typeNode);
253
- try {
254
- return new TypeNodeResolver(this.current.typeChecker.typeToTypeNode(type, undefined, ts.NodeBuilderFlags.NoTruncation), this.current, this.typeNode, this.context, this.referencer).resolve();
255
- }
256
- catch (err) {
257
- const indexedTypeName = this.current.typeChecker.typeToString(this.current.typeChecker.getTypeFromTypeNode(this.typeNode.type));
258
- throw new error_1.ResolverError(`Could not determine the keys on ${indexedTypeName}`, this.typeNode);
259
- }
260
- }
261
- if (this.typeNode.operator === ts.SyntaxKind.ReadonlyKeyword) {
262
- return new TypeNodeResolver(this.typeNode.type, this.current, this.typeNode, this.context, this.referencer).resolve();
263
- }
264
- }
265
- if (ts.isIndexedAccessTypeNode(this.typeNode) &&
266
- (this.typeNode.indexType.kind === ts.SyntaxKind.NumberKeyword ||
267
- this.typeNode.indexType.kind === ts.SyntaxKind.StringKeyword)) {
268
- const numberIndexType = this.typeNode.indexType.kind === ts.SyntaxKind.NumberKeyword;
269
- const objectType = this.current.typeChecker.getTypeFromTypeNode(this.typeNode.objectType);
270
- const type = numberIndexType ? objectType.getNumberIndexType() : objectType.getStringIndexType();
271
- if (type === undefined) {
272
- throw new error_1.ResolverError(`Could not determine ${numberIndexType ? 'number' : 'string'} index on ${this.current.typeChecker.typeToString(objectType)}`, this.typeNode);
273
- }
274
- return new TypeNodeResolver(this.current.typeChecker.typeToTypeNode(type, undefined, undefined), this.current, this.typeNode, this.context, this.referencer).resolve();
275
- }
276
- if (ts.isIndexedAccessTypeNode(this.typeNode) &&
277
- ts.isLiteralTypeNode(this.typeNode.indexType) &&
278
- (ts.isStringLiteral(this.typeNode.indexType.literal) || ts.isNumericLiteral(this.typeNode.indexType.literal))) {
279
- const hasType = (node) => node !== undefined &&
280
- Object.prototype.hasOwnProperty.call(node, 'type');
281
- const symbol = this.current.typeChecker.getPropertyOfType(this.current.typeChecker.getTypeFromTypeNode(this.typeNode.objectType), this.typeNode.indexType.literal.text);
282
- if (symbol === undefined) {
283
- throw new error_1.ResolverError(`Could not determine the keys on ${this.current.typeChecker.typeToString(this.current.typeChecker.getTypeFromTypeNode(this.typeNode.objectType))}`, this.typeNode);
284
- }
285
- if (hasType(symbol.valueDeclaration) && symbol.valueDeclaration.type) {
286
- return new TypeNodeResolver(symbol.valueDeclaration.type, this.current, this.typeNode, this.context, this.referencer).resolve();
287
- }
288
- const declaration = this.current.typeChecker.getTypeOfSymbolAtLocation(symbol, this.typeNode.objectType);
289
- try {
290
- return new TypeNodeResolver(this.current.typeChecker.typeToTypeNode(declaration, undefined, undefined), this.current, this.typeNode, this.context, this.referencer).resolve();
291
- }
292
- catch {
293
- throw new error_1.ResolverError(`Could not determine the keys on ${this.current.typeChecker.typeToString(this.current.typeChecker.getTypeFromTypeNode(this.current.typeChecker.typeToTypeNode(declaration, undefined, undefined)))}`, this.typeNode);
294
- }
295
- }
296
- if (this.typeNode.kind === ts.SyntaxKind.TemplateLiteralType) {
297
- const type = this.current.typeChecker.getTypeFromTypeNode(this.referencer || this.typeNode);
298
- if (type.isUnion() && type.types.every((unionElementType) => unionElementType.isStringLiteral())) {
299
- return {
300
- typeName: constants_1.TypeName.ENUM,
301
- members: type.types.map((stringLiteralType) => stringLiteralType.value),
302
- };
303
- }
304
- throw new error_1.ResolverError(`Could not the type of ${this.current.typeChecker.typeToString(this.current.typeChecker.getTypeFromTypeNode(this.typeNode), this.typeNode)}`, this.typeNode);
305
- }
306
- if (ts.isParenthesizedTypeNode(this.typeNode)) {
307
- return new TypeNodeResolver(this.typeNode.type, this.current, this.typeNode, this.context, this.referencer).resolve();
308
- }
309
- if (this.typeNode.kind !== ts.SyntaxKind.TypeReference) {
310
- throw new error_1.ResolverError(`Unknown type: ${ts.SyntaxKind[this.typeNode.kind]}`, this.typeNode);
311
- }
312
- const typeReference = this.typeNode;
313
- if (typeReference.typeName.kind === ts.SyntaxKind.Identifier) {
314
- // Special Utility Type
315
- if (typeReference.typeName.text === 'Record') {
316
- return {
317
- additionalProperties: new TypeNodeResolver(typeReference.typeArguments[1], this.current, this.parentNode, this.context).resolve(),
318
- typeName: constants_1.TypeName.NESTED_OBJECT_LITERAL,
319
- properties: [],
320
- };
321
- }
322
- const specialReference = TypeNodeResolver.resolveSpecialReference(typeReference.typeName);
323
- if (typeof specialReference !== 'undefined') {
324
- return specialReference;
325
- }
326
- if (typeReference.typeName.text === 'Date') {
327
- return this.getDateType(this.parentNode);
328
- }
329
- if (typeReference.typeName.text === 'Buffer' ||
330
- typeReference.typeName.text === 'Readable') {
331
- return { typeName: constants_1.TypeName.BUFFER };
332
- }
333
- if (typeReference.typeName.text === 'Array' &&
334
- typeReference.typeArguments &&
335
- typeReference.typeArguments.length >= 1) {
336
- return {
337
- typeName: constants_1.TypeName.ARRAY,
338
- elementType: new TypeNodeResolver(typeReference.typeArguments[0], this.current, this.parentNode, this.context).resolve(),
339
- };
340
- }
341
- if (typeReference.typeName.text === 'Promise' &&
342
- typeReference.typeArguments &&
343
- typeReference.typeArguments.length === 1) {
344
- return new TypeNodeResolver(typeReference.typeArguments[0], this.current, this.parentNode, this.context).resolve();
345
- }
346
- if (typeReference.typeName.text === 'String') {
347
- return { typeName: constants_1.TypeName.STRING };
348
- }
349
- if (this.context[typeReference.typeName.text]) {
350
- return new TypeNodeResolver(this.context[typeReference.typeName.text], this.current, this.parentNode, this.context).resolve();
351
- }
352
- }
353
- const referenceType = this.getReferenceType(typeReference);
354
- this.current.addReferenceType(referenceType);
355
- return referenceType;
356
- }
357
- // ------------------------------------------------------------------------
358
- // Utility Type(s)
359
- // ------------------------------------------------------------------------
360
- static toUtilityType(typeName) {
361
- if (typeof typeName === 'undefined') {
362
- return undefined;
363
- }
364
- const values = Object.values(constants_1.UtilityTypeName);
365
- const index = values.indexOf(typeof typeName !== 'string' ? typeName.text : typeName);
366
- if (index === -1) {
367
- return undefined;
368
- }
369
- return values[index];
370
- }
371
- static getUtilityTypeOptions(typeArguments) {
372
- const utilityOptions = {
373
- keys: [],
374
- };
375
- if (typeArguments.length >= 2) {
376
- if (ts.isUnionTypeNode(typeArguments[1])) {
377
- const args = typeArguments[1].types;
378
- for (let i = 0; i < args.length; i++) {
379
- if (ts.isLiteralTypeNode(args[i])) {
380
- utilityOptions.keys.push(TypeNodeResolver.getLiteralValue(args[i]));
381
- }
382
- }
383
- }
384
- if (ts.isLiteralTypeNode(typeArguments[1])) {
385
- utilityOptions.keys.push(TypeNodeResolver.getLiteralValue(typeArguments[1]));
386
- }
387
- }
388
- return utilityOptions;
389
- }
390
- filterUtilityProperties(properties, utilityType, utilityOptions) {
391
- if (typeof utilityType === 'undefined' || typeof utilityOptions === 'undefined') {
392
- return properties;
393
- }
394
- return properties
395
- .filter((property) => {
396
- const name = typeof property.name !== 'string' ? property.name.text : property.name;
397
- switch (utilityType) {
398
- case constants_1.UtilityTypeName.PICK:
399
- return utilityOptions.keys.indexOf(name) !== -1;
400
- case constants_1.UtilityTypeName.OMIT:
401
- return utilityOptions.keys.indexOf(name) === -1;
402
- }
403
- return true;
404
- })
405
- .map((property) => {
406
- if ((0, utils_1.hasOwnProperty)(property, 'required')) {
407
- switch (utilityType) {
408
- case constants_1.UtilityTypeName.PARTIAL:
409
- property.required = false;
410
- break;
411
- case constants_1.UtilityTypeName.REQUIRED:
412
- case constants_1.UtilityTypeName.NON_NULLABLE:
413
- property.required = true;
414
- break;
415
- }
416
- }
417
- return property;
418
- });
419
- }
420
- static resolveSpecialReference(node) {
421
- switch (node.text) {
422
- case 'Buffer':
423
- case 'DownloadBinaryData':
424
- case 'DownloadResource':
425
- return { typeName: constants_1.TypeName.BUFFER };
426
- default:
427
- return undefined;
428
- }
429
- }
430
- static getLiteralValue(typeNode) {
431
- let value;
432
- switch (typeNode.literal.kind) {
433
- case ts.SyntaxKind.TrueKeyword:
434
- value = true;
435
- break;
436
- case ts.SyntaxKind.FalseKeyword:
437
- value = false;
438
- break;
439
- case ts.SyntaxKind.StringLiteral:
440
- value = typeNode.literal.text;
441
- break;
442
- case ts.SyntaxKind.NumericLiteral:
443
- value = parseFloat(typeNode.literal.text);
444
- break;
445
- case ts.SyntaxKind.NullKeyword:
446
- value = null;
447
- break;
448
- default:
449
- if (Object.prototype.hasOwnProperty.call(typeNode.literal, 'text')) {
450
- value = typeNode.literal.text;
451
- }
452
- else {
453
- throw new error_1.ResolverError(`Couldn't resolve literal node: ${typeNode.literal.getText()}`);
454
- }
455
- }
456
- return value;
457
- }
458
- getPrimitiveType(typeNode, parentNode) {
459
- if (!typeNode) {
460
- return {
461
- typeName: constants_1.TypeName.VOID,
462
- };
463
- }
464
- const resolvedType = this.attemptToResolveKindToPrimitive(typeNode.kind);
465
- if (typeof resolvedType === 'undefined') {
466
- return undefined;
467
- }
468
- if (resolvedType === 'number') {
469
- if (!parentNode) {
470
- return { typeName: constants_1.TypeName.DOUBLE };
471
- }
472
- const lookupTags = [
473
- 'isInt',
474
- 'isLong',
475
- 'isFloat',
476
- 'isDouble',
477
- ];
478
- const tags = (0, utils_1.getJSDocTagNames)(parentNode)
479
- .filter((name) => lookupTags.some((m) => m.toLowerCase() === name.toLowerCase()))
480
- .map((name) => name.toLowerCase());
481
- const decoratorIds = [
482
- decorator_1.DecoratorID.IS_INT,
483
- decorator_1.DecoratorID.IS_LONG,
484
- decorator_1.DecoratorID.IS_FLOAT,
485
- decorator_1.DecoratorID.IS_DOUBLE,
486
- ];
487
- let decoratorID;
488
- for (let i = 0; i < decoratorIds.length; i++) {
489
- const decorator = this.current.decoratorResolver.match(decoratorIds[i], parentNode);
490
- if (decorator) {
491
- decoratorID = decoratorIds[i];
492
- break;
493
- }
494
- }
495
- if (!decoratorID && tags.length === 0) {
496
- return { typeName: constants_1.TypeName.DOUBLE };
497
- }
498
- switch (decoratorID || tags[0]) {
499
- case decorator_1.DecoratorID.IS_INT:
500
- case 'isint':
501
- return { typeName: constants_1.TypeName.INTEGER };
502
- case decorator_1.DecoratorID.IS_LONG:
503
- case 'islong':
504
- return { typeName: constants_1.TypeName.LONG };
505
- case decorator_1.DecoratorID.IS_FLOAT:
506
- case 'isfloat':
507
- return { typeName: constants_1.TypeName.FLOAT };
508
- case decorator_1.DecoratorID.IS_DOUBLE:
509
- case 'isdouble':
510
- return { typeName: constants_1.TypeName.DOUBLE };
511
- default:
512
- return { typeName: constants_1.TypeName.DOUBLE };
513
- }
514
- }
515
- else if (resolvedType === 'string') {
516
- return {
517
- typeName: constants_1.TypeName.STRING,
518
- };
519
- }
520
- else if (resolvedType === 'boolean') {
521
- return {
522
- typeName: constants_1.TypeName.BOOLEAN,
523
- };
524
- }
525
- else if (resolvedType === 'void') {
526
- return {
527
- typeName: constants_1.TypeName.VOID,
528
- };
529
- }
530
- else {
531
- // todo: should not occur
532
- return {
533
- typeName: resolvedType,
534
- };
535
- }
536
- }
537
- getDateType(parentNode) {
538
- if (!parentNode) {
539
- return { typeName: constants_1.TypeName.DATETIME };
540
- }
541
- const tags = (0, utils_1.getJSDocTagNames)(parentNode).filter((name) => ['isDate', 'isDateTime'].some((m) => m === name));
542
- if (tags.length === 0) {
543
- return { typeName: constants_1.TypeName.DATETIME };
544
- }
545
- switch (tags[0]) {
546
- case 'isDate':
547
- return { typeName: constants_1.TypeName.DATE };
548
- default:
549
- return { typeName: constants_1.TypeName.DATETIME };
550
- }
551
- }
552
- static getDesignatedModels(nodes, typeName) {
553
- return nodes;
554
- }
555
- getEnumerateType(typeName) {
556
- const enumName = typeName.text;
557
- let enumNodes = this.current.nodes.filter((node) => node.kind === ts.SyntaxKind.EnumDeclaration && node.name.text === enumName);
558
- if (!enumNodes.length) {
559
- return undefined;
560
- }
561
- enumNodes = TypeNodeResolver.getDesignatedModels(enumNodes, enumName);
562
- if (enumNodes.length > 1) {
563
- throw new error_1.ResolverError(`Multiple matching enum found for enum ${enumName}; please make enum names unique.`);
564
- }
565
- const enumDeclaration = enumNodes[0];
566
- const isNotUndefined = (item) => item !== undefined;
567
- const enums = enumDeclaration.members.map(this.current.typeChecker.getConstantValue.bind(this.current.typeChecker)).filter(isNotUndefined);
568
- const enumNames = enumDeclaration.members.map((e) => e.name.getText()).filter(isNotUndefined);
569
- return {
570
- typeName: constants_1.TypeName.REF_ENUM,
571
- description: this.getNodeDescription(enumDeclaration),
572
- members: enums,
573
- memberNames: enumNames,
574
- refName: enumName,
575
- deprecated: (0, utils_1.hasJSDocTag)(enumDeclaration, utils_1.JSDocTagName.DEPRECATED),
576
- };
577
- }
578
- getReferenceType(node) {
579
- let type;
580
- if (ts.isTypeReferenceNode(node)) {
581
- type = node.typeName;
582
- }
583
- else if (ts.isExpressionWithTypeArguments(node)) {
584
- type = node.expression;
585
- }
586
- else {
587
- throw new error_1.ResolverError('Can\'t resolve reference type.');
588
- }
589
- // Can't invoke getText on Synthetic Nodes
590
- let resolvableName = node.pos !== -1 ? node.getText() : type.text;
591
- if (node.pos === -1 && 'typeArguments' in node && Array.isArray(node.typeArguments)) {
592
- // Add typeArguments for Synthetic nodes (e.g. Record<> in TestClassModel.indexedResponse)
593
- const argumentsString = node.typeArguments
594
- .map((arg) => {
595
- if (ts.isLiteralTypeNode(arg)) {
596
- return `'${String(TypeNodeResolver.getLiteralValue(arg))}'`;
597
- }
598
- const resolvedType = this.attemptToResolveKindToPrimitive(arg.kind);
599
- if (typeof resolvedType === 'undefined') {
600
- return 'any';
601
- }
602
- return resolvedType;
603
- });
604
- resolvableName += `<${argumentsString.join(', ')}>`;
605
- }
606
- const name = this.contextualizedName(resolvableName);
607
- // Handle Utility Types
608
- const identifierName = type.text;
609
- const utilityType = TypeNodeResolver.toUtilityType(identifierName);
610
- let utilityTypeOptions;
611
- if (utilityType) {
612
- const { typeArguments } = type.parent;
613
- if (ts.isTypeReferenceNode(typeArguments[0])) {
614
- type = typeArguments[0].typeName;
615
- }
616
- else if (ts.isExpressionWithTypeArguments(typeArguments[0])) {
617
- type = typeArguments[0].expression;
618
- }
619
- else {
620
- throw new error_1.ResolverError('Can\'t resolve Reference type.');
621
- }
622
- utilityTypeOptions = TypeNodeResolver.getUtilityTypeOptions(typeArguments);
623
- }
624
- else {
625
- this.typeArgumentsToContext(node, type, this.context);
626
- }
627
- try {
628
- const existingType = localReferenceTypeCache[name];
629
- if (existingType) {
630
- return existingType;
631
- }
632
- const refEnumType = this.getEnumerateType(type);
633
- if (refEnumType) {
634
- localReferenceTypeCache[name] = refEnumType;
635
- return refEnumType;
636
- }
637
- if (inProgressTypes[name]) {
638
- return this.createCircularDependencyResolver(name);
639
- }
640
- inProgressTypes[name] = true;
641
- const declaration = this.getModelTypeDeclaration(type);
642
- let referenceType;
643
- if (ts.isTypeAliasDeclaration(declaration)) {
644
- referenceType = this.getTypeAliasReference(declaration, name, node, utilityType, utilityTypeOptions);
645
- localReferenceTypeCache[name] = referenceType;
646
- return referenceType;
647
- }
648
- if (ts.isEnumMember(declaration)) {
649
- referenceType = {
650
- typeName: constants_1.TypeName.REF_ENUM,
651
- refName: TypeNodeResolver.getRefTypeName(name, utilityType),
652
- members: [this.current.typeChecker.getConstantValue(declaration)],
653
- memberNames: [declaration.name.getText()],
654
- deprecated: (0, utils_1.hasJSDocTag)(declaration, utils_1.JSDocTagName.DEPRECATED),
655
- };
656
- localReferenceTypeCache[name] = referenceType;
657
- return referenceType;
658
- }
659
- // todo: dont cast handle property-signature
660
- referenceType = this.getModelReference(declaration, name, utilityType, utilityTypeOptions);
661
- localReferenceTypeCache[name] = referenceType;
662
- return referenceType;
663
- }
664
- catch (err) {
665
- // eslint-disable-next-line no-console
666
- console.error(`There was a problem resolving type of '${name}'.`);
667
- throw err;
668
- }
669
- }
670
- getTypeAliasReference(declaration, name, referencer, utilityType, utilityTypeOptions) {
671
- const refName = TypeNodeResolver.getRefTypeName(name, utilityType);
672
- if (declaration.type.kind === ts.SyntaxKind.TypeReference) {
673
- const referenceType = this.getReferenceType(declaration.type);
674
- if (referenceType.refName === refName) {
675
- return referenceType;
676
- }
677
- }
678
- const type = new TypeNodeResolver(declaration.type, this.current, declaration, this.context, this.referencer || referencer).resolve();
679
- if ((0, type_1.isNestedObjectLiteralType)(type)) {
680
- type.properties = this.filterUtilityProperties(type.properties, utilityType, utilityTypeOptions);
681
- }
682
- const example = this.getNodeExample(declaration);
683
- return {
684
- typeName: constants_1.TypeName.REF_ALIAS,
685
- default: (0, utils_1.getJSDocTagComment)(declaration, utils_1.JSDocTagName.DEFAULT),
686
- description: this.getNodeDescription(declaration),
687
- refName,
688
- format: TypeNodeResolver.getNodeFormat(declaration),
689
- type,
690
- validators: (0, utils_1.getDeclarationValidators)(declaration) || {},
691
- deprecated: (0, utils_1.hasJSDocTag)(declaration, utils_1.JSDocTagName.DEPRECATED),
692
- ...(example && { example }),
693
- };
694
- }
695
- getModelReference(modelType, name, utilityType, utilityOptions) {
696
- const example = this.getNodeExample(modelType);
697
- const description = this.getNodeDescription(modelType);
698
- const deprecated = (0, utils_1.hasJSDocTag)(modelType, utils_1.JSDocTagName.DEPRECATED) ||
699
- !!this.current.decoratorResolver.match(decorator_1.DecoratorID.DEPRECATED, modelType);
700
- // Handle toJSON methods
701
- if (!modelType.name) {
702
- throw new error_1.ResolverError('Can\'t get Symbol from anonymous class', modelType);
703
- }
704
- const type = this.current.typeChecker.getTypeAtLocation(modelType.name);
705
- const toJSON = this.current.typeChecker.getPropertyOfType(type, 'toJSON');
706
- if (toJSON &&
707
- toJSON.valueDeclaration &&
708
- (ts.isMethodDeclaration(toJSON.valueDeclaration) ||
709
- ts.isMethodSignature(toJSON.valueDeclaration))) {
710
- let nodeType = toJSON.valueDeclaration.type;
711
- if (!nodeType) {
712
- const signature = this.current.typeChecker.getSignatureFromDeclaration(toJSON.valueDeclaration);
713
- const implicitType = this.current.typeChecker.getReturnTypeOfSignature(signature);
714
- nodeType = this.current.typeChecker.typeToTypeNode(implicitType, undefined, ts.NodeBuilderFlags.NoTruncation);
715
- }
716
- return {
717
- refName: `${TypeNodeResolver.getRefTypeName(name, utilityType)}Alias`,
718
- typeName: constants_1.TypeName.REF_ALIAS,
719
- description,
720
- type: new TypeNodeResolver(nodeType, this.current).resolve(),
721
- deprecated,
722
- validators: {},
723
- ...(example && { example }),
724
- };
725
- }
726
- const properties = this.getModelProperties(modelType, undefined, utilityType, utilityOptions);
727
- const additionalProperties = this.getModelAdditionalProperties(modelType);
728
- const inheritedProperties = this.getModelInheritedProperties(modelType) || [];
729
- const referenceType = {
730
- additionalProperties,
731
- typeName: constants_1.TypeName.REF_OBJECT,
732
- description,
733
- properties: this.filterUtilityProperties(inheritedProperties, utilityType, utilityOptions),
734
- refName: TypeNodeResolver.getRefTypeName(name, utilityType),
735
- deprecated,
736
- ...(example && { example }),
737
- };
738
- referenceType.properties = referenceType.properties.concat(properties);
739
- return referenceType;
740
- }
741
- static getRefTypeName(name, utilityType) {
742
- return encodeURIComponent(name
743
- .replace(/<|>/g, '_')
744
- .replace(/\s+/g, '')
745
- .replace(/,/g, '.')
746
- .replace(/'([^']*)'/g, '$1')
747
- .replace(/"([^"]*)"/g, '$1')
748
- .replace(/&/g, typeof utilityType !== 'undefined' ? '--' : '-and-')
749
- .replace(/\|/g, typeof utilityType !== 'undefined' ? '--' : '-or-')
750
- .replace(/\[\]/g, '-array')
751
- .replace(/{|}/g, '_') // SuccessResponse_{indexesCreated-number}_ -> SuccessResponse__indexesCreated-number__
752
- .replace(/([a-z]+):([a-z]+)/gi, '$1-$2') // SuccessResponse_indexesCreated:number_ -> SuccessResponse_indexesCreated-number_
753
- .replace(/;/g, '--')
754
- .replace(/([a-z]+)\[([a-z]+)\]/gi, '$1-at-$2') // Partial_SerializedDatasourceWithVersion[format]_ -> Partial_SerializedDatasourceWithVersion~format~_,
755
- .replace(/_/g, '')
756
- .replace(/-/g, ''));
757
- }
758
- contextualizedName(name) {
759
- return Object.entries(this.context).reduce((acc, [key, entry]) => acc
760
- .replace(new RegExp(`<\\s*([^>]*\\s)*\\s*(${key})(\\s[^>]*)*\\s*>`, 'g'), `<$1${entry.getText()}$3>`)
761
- .replace(new RegExp(`<\\s*([^,]*\\s)*\\s*(${key})(\\s[^,]*)*\\s*,`, 'g'), `<$1${entry.getText()}$3,`)
762
- .replace(new RegExp(`,\\s*([^>]*\\s)*\\s*(${key})(\\s[^>]*)*\\s*>`, 'g'), `,$1${entry.getText()}$3>`)
763
- .replace(new RegExp(`<\\s*([^<]*\\s)*\\s*(${key})(\\s[^<]*)*\\s*<`, 'g'), `<$1${entry.getText()}$3<`), name);
764
- }
765
- handleCachingAndCircularReferences(name, declarationResolver) {
766
- try {
767
- const existingType = localReferenceTypeCache[name];
768
- if (existingType) {
769
- return existingType;
770
- }
771
- if (inProgressTypes[name]) {
772
- return this.createCircularDependencyResolver(name);
773
- }
774
- inProgressTypes[name] = true;
775
- const reference = declarationResolver();
776
- localReferenceTypeCache[name] = reference;
777
- this.current.addReferenceType(reference);
778
- return reference;
779
- }
780
- catch (err) {
781
- // eslint-disable-next-line no-console
782
- console.error(`There was a problem resolving type of '${name}'.`);
783
- throw err;
784
- }
785
- }
786
- createCircularDependencyResolver(refName) {
787
- const referenceType = {
788
- deprecated: false,
789
- properties: [],
790
- typeName: constants_1.TypeName.REF_OBJECT,
791
- refName,
792
- };
793
- this.current.registerDependencyResolver((referenceTypes) => {
794
- const realReferenceType = referenceTypes[refName];
795
- if (!realReferenceType) {
796
- return;
797
- }
798
- referenceType.description = realReferenceType.description;
799
- if (realReferenceType.typeName === 'refObject' && referenceType.typeName === 'refObject') {
800
- referenceType.properties = realReferenceType.properties;
801
- }
802
- referenceType.typeName = realReferenceType.typeName;
803
- referenceType.refName = realReferenceType.refName;
804
- });
805
- return referenceType;
806
- }
807
- static nodeIsUsable(node) {
808
- switch (node.kind) {
809
- case ts.SyntaxKind.InterfaceDeclaration:
810
- case ts.SyntaxKind.ClassDeclaration:
811
- case ts.SyntaxKind.TypeAliasDeclaration:
812
- case ts.SyntaxKind.EnumDeclaration:
813
- case ts.SyntaxKind.EnumMember:
814
- return true;
815
- default:
816
- return false;
817
- }
818
- }
819
- getModelTypeDeclaration(type) {
820
- let typeName = type.kind === ts.SyntaxKind.Identifier ? type.text : type.right.text;
821
- const symbol = this.getSymbolAtLocation(type);
822
- const declarations = symbol.getDeclarations();
823
- if (declarations.length === 0) {
824
- throw new error_1.ResolverError(`No models found for referenced type ${typeName}.`);
825
- }
826
- if (symbol.escapedName !== typeName && symbol.escapedName !== 'default') {
827
- typeName = symbol.escapedName;
828
- }
829
- let modelTypes = declarations.filter((node) => {
830
- if (!TypeNodeResolver.nodeIsUsable(node) || !this.current.isExportedNode(node)) {
831
- return false;
832
- }
833
- const modelTypeDeclaration = node;
834
- return modelTypeDeclaration.name?.text === typeName;
835
- });
836
- if (!modelTypes.length) {
837
- throw new error_1.ResolverError(`No matching model found for referenced type ${typeName}. If ${typeName} comes from a dependency, please create an interface in your own code that has the same structure. The compiler can not utilize interfaces from external dependencies.`);
838
- }
839
- if (modelTypes.length > 1) {
840
- // remove types that are from typescript e.g. 'Account'
841
- modelTypes = modelTypes.filter((modelType) => modelType.getSourceFile()
842
- .fileName.replace(/\\/g, '/').toLowerCase().indexOf('node_modules/typescript') <= -1);
843
- modelTypes = TypeNodeResolver.getDesignatedModels(modelTypes, typeName);
844
- }
845
- if (modelTypes.length > 1) {
846
- const conflicts = modelTypes.map((modelType) => modelType.getSourceFile().fileName).join('"; "');
847
- throw new error_1.ResolverError(`Multiple matching models found for referenced type ${typeName}; please make model names unique. Conflicts found: "${conflicts}".`);
848
- }
849
- return modelTypes[0];
850
- }
851
- hasFlag(type, flag) {
852
- return (type.flags & flag) === flag;
853
- }
854
- getSymbolAtLocation(type) {
855
- const symbol = this.current.typeChecker.getSymbolAtLocation(type) || type.symbol;
856
- // resolve alias if it is an alias, otherwise take symbol directly
857
- return (symbol &&
858
- this.hasFlag(symbol, ts.SymbolFlags.Alias) &&
859
- this.current.typeChecker.getAliasedSymbol(symbol)) || symbol;
860
- }
861
- getModelProperties(node, overrideToken, utilityType, utilityOptions) {
862
- const isIgnored = (e) => (0, utils_1.hasJSDocTag)(e, utils_1.JSDocTagName.IGNORE);
863
- // Interface model
864
- if (ts.isInterfaceDeclaration(node)) {
865
- return node.members.filter((member) => !isIgnored(member) &&
866
- ts.isPropertySignature(member)).map((member) => this.propertyFromSignature(member, overrideToken));
867
- }
868
- // Class model
869
- let properties = node.members
870
- .filter((member) => !isIgnored(member) &&
871
- member.kind === ts.SyntaxKind.PropertyDeclaration &&
872
- !this.hasStaticModifier(member) &&
873
- this.hasPublicModifier(member));
874
- const classConstructor = node.members.find((member) => ts.isConstructorDeclaration(member));
875
- if (classConstructor && classConstructor.parameters) {
876
- const constructorProperties = classConstructor.parameters.filter((parameter) => this.isAccessibleParameter(parameter));
877
- properties.push(...constructorProperties);
878
- }
879
- properties = this.filterUtilityProperties(properties, utilityType, utilityOptions);
880
- return properties.map((property) => this.propertyFromDeclaration(property, overrideToken, utilityType));
881
- }
882
- propertyFromSignature(propertySignature, overrideToken) {
883
- const identifier = propertySignature.name;
884
- if (!propertySignature.type) {
885
- throw new error_1.ResolverError('No valid type found for property declaration.');
886
- }
887
- let required = !propertySignature.questionToken;
888
- if (overrideToken && overrideToken.kind === ts.SyntaxKind.MinusToken) {
889
- required = true;
890
- }
891
- else if (overrideToken && overrideToken.kind === ts.SyntaxKind.QuestionToken) {
892
- required = false;
893
- }
894
- const property = {
895
- deprecated: (0, utils_1.hasJSDocTag)(propertySignature, utils_1.JSDocTagName.DEPRECATED),
896
- default: (0, utils_1.getJSDocTagComment)(propertySignature, utils_1.JSDocTagName.DEFAULT),
897
- description: this.getNodeDescription(propertySignature),
898
- example: this.getNodeExample(propertySignature),
899
- extensions: this.getNodeExtensions(propertySignature),
900
- format: TypeNodeResolver.getNodeFormat(propertySignature),
901
- name: identifier.text,
902
- required,
903
- type: new TypeNodeResolver(propertySignature.type, this.current, propertySignature.type.parent, this.context, propertySignature.type).resolve(),
904
- validators: (0, utils_1.getDeclarationValidators)(propertySignature) || {},
905
- };
906
- return property;
907
- }
908
- propertyFromDeclaration(propertyDeclaration, overrideToken, utilityType) {
909
- const identifier = propertyDeclaration.name;
910
- let typeNode = propertyDeclaration.type;
911
- if (!typeNode) {
912
- const tsType = this.current.typeChecker.getTypeAtLocation(propertyDeclaration);
913
- typeNode = this.current.typeChecker.typeToTypeNode(tsType, undefined, ts.NodeBuilderFlags.NoTruncation);
914
- }
915
- if (!typeNode) {
916
- throw new error_1.ResolverError('No valid type found for property declaration.');
917
- }
918
- const type = new TypeNodeResolver(typeNode, this.current, propertyDeclaration, this.context, typeNode).resolve();
919
- let required = !propertyDeclaration.questionToken && !propertyDeclaration.initializer;
920
- if (overrideToken && overrideToken.kind === ts.SyntaxKind.MinusToken) {
921
- required = true;
922
- }
923
- else if (overrideToken && overrideToken.kind === ts.SyntaxKind.QuestionToken) {
924
- required = false;
925
- }
926
- if (typeof utilityType !== 'undefined') {
927
- if (utilityType === 'Partial') {
928
- required = false;
929
- }
930
- if (utilityType === 'Required') {
931
- required = true;
932
- }
933
- }
934
- const property = {
935
- deprecated: (0, utils_1.hasJSDocTag)(propertyDeclaration, utils_1.JSDocTagName.DEPRECATED),
936
- default: (0, utils_1.getInitializerValue)(propertyDeclaration.initializer, this.current.typeChecker),
937
- description: this.getNodeDescription(propertyDeclaration),
938
- example: this.getNodeExample(propertyDeclaration),
939
- extensions: this.getNodeExtensions(propertyDeclaration),
940
- format: TypeNodeResolver.getNodeFormat(propertyDeclaration),
941
- name: identifier.text,
942
- required,
943
- type,
944
- validators: (0, utils_1.getDeclarationValidators)(propertyDeclaration) || {},
945
- };
946
- return property;
947
- }
948
- getModelAdditionalProperties(node) {
949
- if (node.kind === ts.SyntaxKind.InterfaceDeclaration) {
950
- const indexMember = node.members.find((member) => member.kind === ts.SyntaxKind.IndexSignature);
951
- if (!indexMember) {
952
- return undefined;
953
- }
954
- const indexSignatureDeclaration = indexMember;
955
- const indexType = new TypeNodeResolver(indexSignatureDeclaration.parameters[0].type, this.current, this.parentNode, this.context).resolve();
956
- if (indexType.typeName !== 'string') {
957
- throw new error_1.ResolverError('Only string indexers are supported.', this.typeNode);
958
- }
959
- return new TypeNodeResolver(indexSignatureDeclaration.type, this.current, this.parentNode, this.context).resolve();
960
- }
961
- return undefined;
962
- }
963
- typeArgumentsToContext(type, targetEntity, context) {
964
- // this.context = {};
965
- const declaration = this.getModelTypeDeclaration(targetEntity);
966
- if (typeof declaration === 'undefined' || !('typeParameters' in declaration)) {
967
- return context;
968
- }
969
- const { typeParameters } = declaration;
970
- if (typeParameters) {
971
- for (let index = 0; index < typeParameters.length; index++) {
972
- const typeParameter = typeParameters[index];
973
- const typeArg = type.typeArguments && type.typeArguments[index];
974
- let resolvedType;
975
- // Argument may be a forward reference from context
976
- if (typeArg && ts.isTypeReferenceNode(typeArg) && ts.isIdentifier(typeArg.typeName) && context[typeArg.typeName.text]) {
977
- resolvedType = context[typeArg.typeName.text];
978
- }
979
- else if (typeArg) {
980
- resolvedType = typeArg;
981
- }
982
- else if (typeParameter.default) {
983
- resolvedType = typeParameter.default;
984
- }
985
- else {
986
- throw new error_1.ResolverError(`Could not find a value for type parameter ${typeParameter.name.text}`, type);
987
- }
988
- this.context = {
989
- ...this.context,
990
- [typeParameter.name.text]: resolvedType,
991
- };
992
- }
993
- }
994
- return context;
995
- }
996
- getModelInheritedProperties(modelTypeDeclaration) {
997
- let properties = [];
998
- const { heritageClauses } = modelTypeDeclaration;
999
- if (!heritageClauses) {
1000
- return properties;
1001
- }
1002
- heritageClauses.forEach((clause) => {
1003
- if (!clause.types) {
1004
- return;
1005
- }
1006
- clause.types.forEach((t) => {
1007
- const baseEntityName = t.expression;
1008
- // create subContext
1009
- const resetCtx = this.typeArgumentsToContext(t, baseEntityName, this.context);
1010
- const referenceType = this.getReferenceType(t);
1011
- if (referenceType) {
1012
- if ((0, type_1.isRefAliasType)(referenceType)) {
1013
- let type = referenceType;
1014
- while ((0, type_1.isRefAliasType)(type)) {
1015
- type = type.type;
1016
- }
1017
- if (type.typeName === constants_1.TypeName.REF_OBJECT) {
1018
- properties = [...properties, ...type.properties];
1019
- }
1020
- else if (type.typeName === constants_1.TypeName.NESTED_OBJECT_LITERAL) {
1021
- properties = [...properties, ...type.properties];
1022
- }
1023
- }
1024
- if ((0, type_1.isRefObjectType)(referenceType)) {
1025
- referenceType.properties.forEach((property) => properties.push(property));
1026
- }
1027
- }
1028
- // reset subContext
1029
- this.context = resetCtx;
1030
- });
1031
- });
1032
- return properties;
1033
- }
1034
- hasPublicModifier(node) {
1035
- if (!ts.canHaveModifiers(node)) {
1036
- return true;
1037
- }
1038
- const modifiers = ts.getModifiers(node);
1039
- if (!modifiers) {
1040
- return true;
1041
- }
1042
- return modifiers.every((modifier) => modifier.kind !== ts.SyntaxKind.ProtectedKeyword && modifier.kind !== ts.SyntaxKind.PrivateKeyword);
1043
- }
1044
- hasStaticModifier(node) {
1045
- if (!ts.canHaveModifiers(node)) {
1046
- return false;
1047
- }
1048
- const modifiers = ts.getModifiers(node);
1049
- return modifiers && modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword);
1050
- }
1051
- isAccessibleParameter(node) {
1052
- // No modifiers
1053
- if (!ts.canHaveModifiers(node)) {
1054
- return false;
1055
- }
1056
- const modifiers = ts.getModifiers(node);
1057
- if (!modifiers) {
1058
- return false;
1059
- }
1060
- // public || public readonly
1061
- if (modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.PublicKeyword)) {
1062
- return true;
1063
- }
1064
- // readonly, not private readonly, not public readonly
1065
- const isReadonly = modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.ReadonlyKeyword);
1066
- const isProtectedOrPrivate = modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.ProtectedKeyword ||
1067
- modifier.kind === ts.SyntaxKind.PrivateKeyword);
1068
- return isReadonly && !isProtectedOrPrivate;
1069
- }
1070
- getNodeDescription(node) {
1071
- const symbol = this.current.typeChecker.getSymbolAtLocation(node.name);
1072
- if (!symbol) {
1073
- return undefined;
1074
- }
1075
- /**
1076
- * TODO: Workaround for what seems like a bug in the compiler
1077
- * Warrants more investigation and possibly a PR against typescript
1078
- */
1079
- if (node.kind === ts.SyntaxKind.Parameter) {
1080
- // TypeScript won't parse jsdoc if the flag is 4, i.e. 'Property'
1081
- symbol.flags = 0;
1082
- }
1083
- const comments = symbol.getDocumentationComment(this.current.typeChecker);
1084
- if (comments.length) {
1085
- return ts.displayPartsToString(comments);
1086
- }
1087
- return undefined;
1088
- }
1089
- static getNodeFormat(node) {
1090
- return (0, utils_1.getJSDocTagComment)(node, utils_1.JSDocTagName.FORMAT);
1091
- }
1092
- getNodeExample(node) {
1093
- const example = (0, utils_1.getJSDocTagComment)(node, utils_1.JSDocTagName.EXAMPLE);
1094
- if (example) {
1095
- try {
1096
- return JSON.parse(example);
1097
- }
1098
- catch {
1099
- // do nothing
1100
- }
1101
- }
1102
- return undefined;
1103
- }
1104
- getNodeExtensions(node) {
1105
- return (0, extension_1.getNodeExtensions)(node, this.current.decoratorResolver);
1106
- }
1107
- }
1108
- exports.TypeNodeResolver = TypeNodeResolver;
1109
- //# sourceMappingURL=module.js.map