@trapi/metadata 1.3.0 → 2.0.0-beta.1

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