@trapi/metadata 1.0.0-alpha.6 → 1.0.0-alpha.8

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 (191) hide show
  1. package/dist/cache/driver.d.ts +13 -13
  2. package/dist/cache/driver.js +83 -83
  3. package/dist/cache/index.d.ts +3 -3
  4. package/dist/cache/index.js +25 -25
  5. package/dist/cache/type.d.ts +32 -32
  6. package/dist/cache/type.js +8 -8
  7. package/dist/cache/utils.d.ts +3 -3
  8. package/dist/cache/utils.js +52 -52
  9. package/dist/config/index.d.ts +1 -1
  10. package/dist/config/index.js +23 -23
  11. package/dist/config/type.d.ts +36 -36
  12. package/dist/config/type.js +8 -8
  13. package/dist/decorator/constants.d.ts +40 -40
  14. package/dist/decorator/constants.js +52 -52
  15. package/dist/decorator/index.d.ts +6 -6
  16. package/dist/decorator/index.js +28 -28
  17. package/dist/decorator/preset/index.d.ts +2 -2
  18. package/dist/decorator/preset/index.js +24 -24
  19. package/dist/decorator/preset/type.d.ts +5 -5
  20. package/dist/decorator/preset/type.js +8 -8
  21. package/dist/decorator/preset/utils/check.d.ts +2 -2
  22. package/dist/decorator/preset/utils/check.js +17 -17
  23. package/dist/decorator/preset/utils/index.d.ts +3 -3
  24. package/dist/decorator/preset/utils/index.js +25 -25
  25. package/dist/decorator/preset/utils/load.d.ts +2 -2
  26. package/dist/decorator/preset/utils/load.js +44 -44
  27. package/dist/decorator/preset/utils/normalize.d.ts +1 -1
  28. package/dist/decorator/preset/utils/normalize.js +26 -26
  29. package/dist/decorator/property-manager/index.d.ts +2 -2
  30. package/dist/decorator/property-manager/index.js +24 -24
  31. package/dist/decorator/property-manager/module.d.ts +16 -16
  32. package/dist/decorator/property-manager/module.js +58 -58
  33. package/dist/decorator/property-manager/utils.d.ts +5 -5
  34. package/dist/decorator/property-manager/utils.js +91 -91
  35. package/dist/decorator/resolver/index.d.ts +2 -2
  36. package/dist/decorator/resolver/index.js +24 -24
  37. package/dist/decorator/resolver/module.d.ts +26 -26
  38. package/dist/decorator/resolver/module.js +71 -71
  39. package/dist/decorator/resolver/type.d.ts +9 -9
  40. package/dist/decorator/resolver/type.js +2 -2
  41. package/dist/decorator/sets/class.d.ts +6 -6
  42. package/dist/decorator/sets/class.js +8 -8
  43. package/dist/decorator/sets/index.d.ts +7 -7
  44. package/dist/decorator/sets/index.js +28 -28
  45. package/dist/decorator/sets/method.d.ts +13 -13
  46. package/dist/decorator/sets/method.js +8 -8
  47. package/dist/decorator/sets/mixed.d.ts +11 -11
  48. package/dist/decorator/sets/mixed.js +8 -8
  49. package/dist/decorator/sets/parameter.d.ts +20 -20
  50. package/dist/decorator/sets/parameter.js +8 -8
  51. package/dist/decorator/sets/request.d.ts +5 -5
  52. package/dist/decorator/sets/request.js +8 -8
  53. package/dist/decorator/sets/response.d.ts +16 -16
  54. package/dist/decorator/sets/response.js +8 -8
  55. package/dist/decorator/sets/type.d.ts +3 -3
  56. package/dist/decorator/sets/type.js +2 -2
  57. package/dist/decorator/type.d.ts +31 -31
  58. package/dist/decorator/type.js +8 -8
  59. package/dist/error/base.d.ts +2 -2
  60. package/dist/error/base.js +12 -12
  61. package/dist/error/index.d.ts +1 -1
  62. package/dist/error/index.js +23 -23
  63. package/dist/generator/abstract.d.ts +18 -18
  64. package/dist/generator/abstract.js +150 -150
  65. package/dist/generator/abstract.js.map +1 -1
  66. package/dist/generator/controller/index.d.ts +2 -2
  67. package/dist/generator/controller/index.js +24 -24
  68. package/dist/generator/controller/module.d.ts +12 -12
  69. package/dist/generator/controller/module.js +67 -67
  70. package/dist/generator/controller/type.d.ts +46 -46
  71. package/dist/generator/controller/type.js +2 -2
  72. package/dist/generator/index.d.ts +6 -6
  73. package/dist/generator/index.js +28 -28
  74. package/dist/generator/metadata/index.d.ts +3 -3
  75. package/dist/generator/metadata/index.js +25 -25
  76. package/dist/generator/metadata/module.d.ts +38 -38
  77. package/dist/generator/metadata/module.js +142 -142
  78. package/dist/generator/metadata/type.d.ts +24 -24
  79. package/dist/generator/metadata/type.js +2 -2
  80. package/dist/generator/metadata/utils.d.ts +2 -2
  81. package/dist/generator/metadata/utils.js +18 -18
  82. package/dist/generator/method/constants.d.ts +10 -10
  83. package/dist/generator/method/constants.js +20 -20
  84. package/dist/generator/method/index.d.ts +3 -3
  85. package/dist/generator/method/index.js +25 -25
  86. package/dist/generator/method/module.d.ts +18 -18
  87. package/dist/generator/method/module.d.ts.map +1 -1
  88. package/dist/generator/method/module.js +187 -188
  89. package/dist/generator/method/module.js.map +1 -1
  90. package/dist/generator/method/type.d.ts +22 -29
  91. package/dist/generator/method/type.d.ts.map +1 -1
  92. package/dist/generator/method/type.js +8 -8
  93. package/dist/generator/parameter/constants.d.ts +18 -18
  94. package/dist/generator/parameter/constants.js +29 -29
  95. package/dist/generator/parameter/error.d.ts +34 -34
  96. package/dist/generator/parameter/error.js +67 -67
  97. package/dist/generator/parameter/index.d.ts +4 -4
  98. package/dist/generator/parameter/index.js +26 -26
  99. package/dist/generator/parameter/module.d.ts +28 -28
  100. package/dist/generator/parameter/module.d.ts.map +1 -1
  101. package/dist/generator/parameter/module.js +555 -554
  102. package/dist/generator/parameter/module.js.map +1 -1
  103. package/dist/generator/parameter/type.d.ts +24 -24
  104. package/dist/generator/parameter/type.d.ts.map +1 -1
  105. package/dist/generator/parameter/type.js +8 -8
  106. package/dist/generator/type.d.ts +19 -18
  107. package/dist/generator/type.d.ts.map +1 -1
  108. package/dist/generator/type.js +8 -8
  109. package/dist/index.d.ts +9 -9
  110. package/dist/index.js +31 -31
  111. package/dist/module.d.ts +4 -4
  112. package/dist/module.js +40 -40
  113. package/dist/resolver/constants.d.ts +27 -0
  114. package/dist/resolver/constants.d.ts.map +1 -0
  115. package/dist/resolver/constants.js +37 -0
  116. package/dist/resolver/constants.js.map +1 -0
  117. package/dist/resolver/error.d.ts +7 -7
  118. package/dist/resolver/error.js +40 -40
  119. package/dist/resolver/extension/index.d.ts +3 -0
  120. package/dist/resolver/extension/index.d.ts.map +1 -0
  121. package/dist/resolver/extension/index.js +25 -0
  122. package/dist/resolver/extension/index.js.map +1 -0
  123. package/dist/resolver/extension/module.d.ts +5 -0
  124. package/dist/resolver/extension/module.d.ts.map +1 -0
  125. package/dist/resolver/extension/module.js +27 -0
  126. package/dist/resolver/extension/module.js.map +1 -0
  127. package/dist/resolver/extension/type.d.ts +8 -0
  128. package/dist/resolver/extension/type.d.ts.map +1 -0
  129. package/dist/resolver/extension/type.js +9 -0
  130. package/dist/resolver/extension/type.js.map +1 -0
  131. package/dist/resolver/index.d.ts +5 -3
  132. package/dist/resolver/index.d.ts.map +1 -1
  133. package/dist/resolver/index.js +27 -25
  134. package/dist/resolver/index.js.map +1 -1
  135. package/dist/resolver/module.d.ts +53 -50
  136. package/dist/resolver/module.d.ts.map +1 -1
  137. package/dist/resolver/module.js +1102 -1088
  138. package/dist/resolver/module.js.map +1 -1
  139. package/dist/resolver/type.d.ts +138 -123
  140. package/dist/resolver/type.d.ts.map +1 -1
  141. package/dist/resolver/type.js +129 -53
  142. package/dist/resolver/type.js.map +1 -1
  143. package/dist/type.d.ts +1 -1
  144. package/dist/type.js +8 -8
  145. package/dist/utils/array.d.ts +2 -0
  146. package/dist/utils/array.d.ts.map +1 -0
  147. package/dist/utils/array.js +22 -0
  148. package/dist/utils/array.js.map +1 -0
  149. package/dist/utils/index.d.ts +9 -8
  150. package/dist/utils/index.d.ts.map +1 -1
  151. package/dist/utils/index.js +31 -30
  152. package/dist/utils/index.js.map +1 -1
  153. package/dist/utils/initializer.d.ts +4 -4
  154. package/dist/utils/initializer.d.ts.map +1 -1
  155. package/dist/utils/initializer.js +130 -130
  156. package/dist/utils/initializer.js.map +1 -1
  157. package/dist/utils/js-doc/constants.d.ts +18 -18
  158. package/dist/utils/js-doc/constants.js +29 -29
  159. package/dist/utils/js-doc/index.d.ts +3 -3
  160. package/dist/utils/js-doc/index.js +25 -25
  161. package/dist/utils/js-doc/module.d.ts +8 -8
  162. package/dist/utils/js-doc/module.js +97 -97
  163. package/dist/utils/js-doc/utils.d.ts +2 -2
  164. package/dist/utils/js-doc/utils.js +28 -28
  165. package/dist/utils/node/index.d.ts +2 -2
  166. package/dist/utils/node/index.js +24 -24
  167. package/dist/utils/node/module.d.ts +9 -9
  168. package/dist/utils/node/module.js +51 -51
  169. package/dist/utils/node/type.d.ts +5 -5
  170. package/dist/utils/node/type.js +8 -8
  171. package/dist/utils/object.d.ts +1 -1
  172. package/dist/utils/object.js +14 -14
  173. package/dist/utils/path-normalize.d.ts +1 -1
  174. package/dist/utils/path-normalize.js +16 -16
  175. package/dist/utils/source-files.d.ts +2 -2
  176. package/dist/utils/source-files.js +31 -31
  177. package/dist/utils/tsconfig/index.d.ts +2 -2
  178. package/dist/utils/tsconfig/index.js +24 -24
  179. package/dist/utils/tsconfig/module.d.ts +3 -3
  180. package/dist/utils/tsconfig/module.js +53 -53
  181. package/dist/utils/tsconfig/type.d.ts +10 -10
  182. package/dist/utils/tsconfig/type.js +8 -8
  183. package/dist/utils/validator/constants.d.ts +12 -12
  184. package/dist/utils/validator/constants.js +22 -22
  185. package/dist/utils/validator/index.d.ts +3 -3
  186. package/dist/utils/validator/index.js +25 -25
  187. package/dist/utils/validator/module.d.ts +3 -3
  188. package/dist/utils/validator/module.js +141 -141
  189. package/dist/utils/validator/type.d.ts +5 -5
  190. package/dist/utils/validator/type.js +8 -8
  191. package/package.json +5 -6
@@ -1,555 +1,556 @@
1
- "use strict";
2
- /*
3
- * Copyright (c) 2021-2023.
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.ParameterGenerator = void 0;
33
- const locter_1 = require("locter");
34
- const ts = __importStar(require("typescript"));
35
- const decorator_1 = require("../../decorator");
36
- const resolver_1 = require("../../resolver");
37
- const utils_1 = require("../../utils");
38
- const constants_1 = require("./constants");
39
- const error_1 = require("./error");
40
- const parameterKeys = [
41
- decorator_1.DecoratorID.CONTEXT,
42
- decorator_1.DecoratorID.PARAM,
43
- decorator_1.DecoratorID.PARAMS,
44
- decorator_1.DecoratorID.QUERY,
45
- decorator_1.DecoratorID.FORM,
46
- decorator_1.DecoratorID.BODY,
47
- decorator_1.DecoratorID.HEADER,
48
- decorator_1.DecoratorID.HEADERS,
49
- decorator_1.DecoratorID.COOKIE,
50
- decorator_1.DecoratorID.COOKIES,
51
- decorator_1.DecoratorID.PATH,
52
- decorator_1.DecoratorID.PATHS,
53
- decorator_1.DecoratorID.FILE,
54
- decorator_1.DecoratorID.FILES,
55
- ];
56
- class ParameterGenerator {
57
- constructor(parameter, method, path, current) {
58
- this.parameter = parameter;
59
- this.method = method;
60
- this.path = path;
61
- this.current = current;
62
- }
63
- generate() {
64
- const decorators = (0, utils_1.getNodeDecorators)(this.parameter);
65
- for (let i = 0; i < parameterKeys.length; i++) {
66
- const manager = this.current.decoratorResolver.match(parameterKeys[i], decorators);
67
- if (typeof manager === 'undefined') {
68
- continue;
69
- }
70
- switch (manager.representation.id) {
71
- case decorator_1.DecoratorID.CONTEXT:
72
- return this.getContextParameter();
73
- case decorator_1.DecoratorID.PARAM:
74
- case decorator_1.DecoratorID.PARAMS:
75
- return this.getParamParameter(manager);
76
- case decorator_1.DecoratorID.FORM:
77
- return this.getFormParameter(manager);
78
- case decorator_1.DecoratorID.QUERY:
79
- return this.getQueryParameter(manager);
80
- case decorator_1.DecoratorID.BODY:
81
- return this.getBodyParameter(manager);
82
- case decorator_1.DecoratorID.HEADER:
83
- case decorator_1.DecoratorID.HEADERS:
84
- return this.getHeaderParameter(manager);
85
- case decorator_1.DecoratorID.COOKIE:
86
- case decorator_1.DecoratorID.COOKIES:
87
- return this.getCookieParameter(manager);
88
- case decorator_1.DecoratorID.PATH:
89
- case decorator_1.DecoratorID.PATHS:
90
- return this.getPathParameter(manager);
91
- case decorator_1.DecoratorID.FILE:
92
- case decorator_1.DecoratorID.FILES:
93
- return this.getFileParameter(manager);
94
- }
95
- }
96
- // todo: add BodyProp decorator, due the fact that single body parameter can contain object.
97
- return this.getBodyParameter();
98
- }
99
- buildParametersForObject(type, details) {
100
- if (type.properties.length === 0) {
101
- return [];
102
- }
103
- const parameterName = this.parameter.name.text;
104
- const initializerValue = (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type);
105
- const output = [];
106
- for (let i = 0; i < type.properties.length; i++) {
107
- const property = type.properties[i];
108
- let propertyDefaultValue = property.default;
109
- if (typeof propertyDefaultValue === 'undefined' &&
110
- (0, locter_1.isObject)(initializerValue)) {
111
- propertyDefaultValue = initializerValue[property.name];
112
- }
113
- let propertyRequired = !this.parameter.questionToken;
114
- if (propertyRequired) {
115
- propertyRequired = property.required;
116
- }
117
- output.push({
118
- ...details,
119
- default: propertyDefaultValue,
120
- description: property.description || details.description || this.getParameterDescription(),
121
- name: property.name,
122
- parameterName,
123
- required: propertyRequired,
124
- type: property.type,
125
- deprecated: property.deprecated || this.getParameterDeprecation(),
126
- });
127
- // todo: example, format
128
- }
129
- return output;
130
- }
131
- getParamParameter(manager) {
132
- return [
133
- ...this.getBodyParameter(manager),
134
- ...this.getCookieParameter(manager),
135
- ];
136
- }
137
- getContextParameter() {
138
- const parameterName = this.parameter.name.text;
139
- // todo: req, res, next should maybe be separate parameter sources.
140
- return [
141
- {
142
- description: this.getParameterDescription(),
143
- in: constants_1.ParameterSource.CONTEXT,
144
- name: parameterName,
145
- parameterName,
146
- required: !this.parameter.questionToken,
147
- type: null,
148
- },
149
- ];
150
- }
151
- getFileParameter(manager) {
152
- const parameterName = this.parameter.name.text;
153
- let name = parameterName;
154
- const value = manager.get('value');
155
- if (typeof value === 'string') {
156
- name = value;
157
- }
158
- if (!this.isBodySupportedForMethod(this.method)) {
159
- throw error_1.ParameterError.methodUnsupported({
160
- decoratorName: manager.representation.name,
161
- propertyName: name,
162
- method: this.method,
163
- node: this.parameter,
164
- });
165
- }
166
- const elementType = { typeName: 'file' };
167
- let type;
168
- if (manager.representation.id === decorator_1.DecoratorID.FILES) {
169
- type = { typeName: 'array', elementType };
170
- }
171
- else {
172
- type = elementType;
173
- }
174
- const { examples, exampleLabels } = this.getParameterExample(parameterName);
175
- return [
176
- {
177
- default: (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type),
178
- description: this.getParameterDescription(),
179
- examples,
180
- exampleLabels,
181
- in: constants_1.ParameterSource.FORM_DATA,
182
- name: name || parameterName,
183
- parameterName,
184
- required: !this.parameter.questionToken && !this.parameter.initializer,
185
- type,
186
- deprecated: this.getParameterDeprecation(),
187
- validators: (0, utils_1.getDeclarationValidators)(this.parameter, parameterName),
188
- },
189
- ];
190
- }
191
- getFormParameter(manager) {
192
- const parameterName = this.parameter.name.text;
193
- let name = parameterName;
194
- const type = this.getValidatedType(this.parameter);
195
- if (!this.isBodySupportedForMethod(this.method)) {
196
- throw error_1.ParameterError.methodUnsupported({
197
- decoratorName: manager.representation.name,
198
- propertyName: name,
199
- method: this.method,
200
- node: this.parameter,
201
- });
202
- }
203
- const value = manager.get('value');
204
- if (typeof value === 'string') {
205
- name = value;
206
- }
207
- const { examples, exampleLabels } = this.getParameterExample(parameterName);
208
- return [
209
- {
210
- default: (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type),
211
- description: this.getParameterDescription(),
212
- examples,
213
- exampleLabels,
214
- in: constants_1.ParameterSource.FORM_DATA,
215
- name: name || parameterName,
216
- parameterName,
217
- required: !this.parameter.questionToken && !this.parameter.initializer,
218
- type,
219
- deprecated: this.getParameterDeprecation(),
220
- validators: (0, utils_1.getDeclarationValidators)(this.parameter, parameterName),
221
- },
222
- ];
223
- }
224
- getCookieParameter(manager) {
225
- const parameterName = this.parameter.name.text;
226
- let name = parameterName;
227
- const type = this.getValidatedType(this.parameter);
228
- const { examples, exampleLabels } = this.getParameterExample(parameterName);
229
- if (type.typeName === 'nestedObjectLiteral' ||
230
- type.typeName === 'refObject') {
231
- return this.buildParametersForObject(type, {
232
- in: constants_1.ParameterSource.COOKIE,
233
- examples,
234
- exampleLabels,
235
- });
236
- }
237
- if (!this.isTypeSupported(type)) {
238
- throw error_1.ParameterError.typeUnsupported({
239
- decoratorName: manager.representation.name,
240
- propertyName: name,
241
- type,
242
- node: this.parameter,
243
- });
244
- }
245
- const value = manager.get('value');
246
- if (typeof value === 'string') {
247
- name = value;
248
- }
249
- return [
250
- {
251
- default: (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type),
252
- description: this.getParameterDescription(),
253
- examples,
254
- exampleLabels,
255
- in: constants_1.ParameterSource.COOKIE,
256
- name: name || parameterName,
257
- parameterName,
258
- required: !this.parameter.questionToken && !this.parameter.initializer,
259
- type,
260
- deprecated: this.getParameterDeprecation(),
261
- validators: (0, utils_1.getDeclarationValidators)(this.parameter, parameterName),
262
- },
263
- ];
264
- }
265
- getBodyParameter(manager) {
266
- const parameterName = this.parameter.name.text;
267
- let name = parameterName;
268
- let source = constants_1.ParameterSource.BODY;
269
- if (manager) {
270
- const value = manager.get('value');
271
- if (typeof value === 'string') {
272
- name = value;
273
- source = constants_1.ParameterSource.BODY_PROP;
274
- }
275
- }
276
- const type = this.getValidatedType(this.parameter);
277
- if (!this.isBodySupportedForMethod(this.method)) {
278
- throw error_1.ParameterError.methodUnsupported({
279
- decoratorName: manager ? manager.representation.name : 'Body',
280
- propertyName: name,
281
- method: this.method,
282
- node: this.parameter,
283
- });
284
- }
285
- const { examples, exampleLabels } = this.getParameterExample(parameterName);
286
- return [
287
- {
288
- default: (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type),
289
- description: this.getParameterDescription(),
290
- examples,
291
- exampleLabels,
292
- in: source,
293
- name: name || parameterName,
294
- parameterName,
295
- required: !this.parameter.questionToken && !this.parameter.initializer,
296
- type,
297
- deprecated: this.getParameterDeprecation(),
298
- validators: (0, utils_1.getDeclarationValidators)(this.parameter, parameterName),
299
- },
300
- ];
301
- }
302
- getHeaderParameter(manager) {
303
- const parameterName = this.parameter.name.text;
304
- let name = parameterName;
305
- const type = this.getValidatedType(this.parameter);
306
- const value = manager.get('value');
307
- if (typeof value === 'string') {
308
- name = value;
309
- }
310
- const { examples, exampleLabels } = this.getParameterExample(parameterName);
311
- if (type.typeName === 'nestedObjectLiteral' || type.typeName === 'refObject') {
312
- return this.buildParametersForObject(type, {
313
- in: constants_1.ParameterSource.HEADER,
314
- examples,
315
- exampleLabels,
316
- });
317
- }
318
- if (!this.isTypeSupported(type)) {
319
- throw error_1.ParameterError.typeUnsupported({
320
- decoratorName: manager.representation.name,
321
- propertyName: name,
322
- type,
323
- node: this.parameter,
324
- });
325
- }
326
- return [
327
- {
328
- default: (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type),
329
- description: this.getParameterDescription(),
330
- examples,
331
- exampleLabels,
332
- in: constants_1.ParameterSource.HEADER,
333
- name: name || parameterName,
334
- parameterName,
335
- required: !this.parameter.questionToken && !this.parameter.initializer,
336
- type,
337
- deprecated: this.getParameterDeprecation(),
338
- validators: (0, utils_1.getDeclarationValidators)(this.parameter, parameterName),
339
- },
340
- ];
341
- }
342
- getQueryParameter(manager) {
343
- const parameterName = this.parameter.name.text;
344
- const type = this.getValidatedType(this.parameter);
345
- let name = parameterName;
346
- let options = {};
347
- let source = constants_1.ParameterSource.QUERY;
348
- const nameValue = manager.get('value');
349
- if (typeof nameValue === 'string') {
350
- name = nameValue;
351
- source = constants_1.ParameterSource.QUERY_PROP;
352
- }
353
- const optionsValue = manager.get('options');
354
- if ((0, locter_1.isObject)(optionsValue)) {
355
- options = optionsValue;
356
- }
357
- const { examples, exampleLabels } = this.getParameterExample(parameterName);
358
- if (source === constants_1.ParameterSource.QUERY) {
359
- // yeah! we can transform the object to individual properties.
360
- if (type.typeName === 'nestedObjectLiteral' ||
361
- type.typeName === 'refObject') {
362
- return this.buildParametersForObject(type, {
363
- in: constants_1.ParameterSource.QUERY_PROP,
364
- examples,
365
- exampleLabels,
366
- });
367
- // todo: transform ( type.typeName === 'array')
368
- }
369
- }
370
- const properties = {
371
- allowEmptyValue: options.allowEmptyValue,
372
- collectionFormat: options.collectionFormat,
373
- default: (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type),
374
- description: this.getParameterDescription(),
375
- examples,
376
- exampleLabels,
377
- in: source,
378
- maxItems: options.maxItems,
379
- minItems: options.minItems,
380
- name,
381
- parameterName,
382
- required: !this.parameter.questionToken && !this.parameter.initializer,
383
- type,
384
- deprecated: this.getParameterDeprecation(),
385
- validators: (0, utils_1.getDeclarationValidators)(this.parameter, parameterName),
386
- };
387
- if (type.typeName === 'array') {
388
- if (!this.isTypeSupported(type.elementType)) {
389
- throw error_1.ParameterError.typeUnsupported({
390
- decoratorName: manager.representation.name,
391
- propertyName: name,
392
- type: type.elementType,
393
- node: this.parameter,
394
- });
395
- }
396
- return [{
397
- ...properties,
398
- collectionFormat: constants_1.CollectionFormat.MULTI,
399
- type,
400
- }];
401
- }
402
- // todo: investigate if this refEnum and union are valid types
403
- if (!this.isTypeSupportedForQueryParameter(type)) {
404
- throw error_1.ParameterError.typeUnsupported({
405
- decoratorName: manager.representation.name,
406
- propertyName: name,
407
- type,
408
- node: this.parameter,
409
- });
410
- }
411
- return [properties];
412
- }
413
- isTypeSupportedForQueryParameter(type) {
414
- return this.isTypeSupported(type) ||
415
- type.typeName === 'refEnum' ||
416
- type.typeName === 'union';
417
- }
418
- getPathParameter(manager) {
419
- const parameterName = this.parameter.name.text;
420
- let name = parameterName;
421
- const type = this.getValidatedType(this.parameter);
422
- const value = manager.get('value');
423
- if (typeof value === 'string') {
424
- name = value;
425
- }
426
- const { examples, exampleLabels } = this.getParameterExample(parameterName);
427
- if (type.typeName === 'nestedObjectLiteral' || type.typeName === 'refObject') {
428
- const output = this.buildParametersForObject(type, {
429
- in: constants_1.ParameterSource.PATH,
430
- examples,
431
- exampleLabels,
432
- });
433
- for (let i = 0; i < output.length; i++) {
434
- if ((!this.path.includes(`{${output[i].name}}`)) &&
435
- (!this.path.includes(`:${output[i].name}`))) {
436
- throw error_1.ParameterError.invalidPathMatch({
437
- decoratorName: manager.representation.name,
438
- propertyName: name,
439
- path: this.path,
440
- node: this.parameter,
441
- });
442
- }
443
- }
444
- return output;
445
- }
446
- if (!this.isTypeSupported(type)) {
447
- throw error_1.ParameterError.typeUnsupported({
448
- decoratorName: manager.representation.name,
449
- propertyName: name,
450
- type,
451
- node: this.parameter,
452
- });
453
- }
454
- if ((!this.path.includes(`{${name}}`)) &&
455
- (!this.path.includes(`:${name}`))) {
456
- throw error_1.ParameterError.invalidPathMatch({
457
- decoratorName: manager.representation.name,
458
- propertyName: name,
459
- path: this.path,
460
- node: this.parameter,
461
- });
462
- }
463
- return [
464
- {
465
- default: (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type),
466
- description: this.getParameterDescription(),
467
- examples,
468
- exampleLabels,
469
- in: constants_1.ParameterSource.PATH,
470
- name: name || parameterName,
471
- parameterName,
472
- required: true,
473
- type,
474
- deprecated: this.getParameterDeprecation(),
475
- validators: (0, utils_1.getDeclarationValidators)(this.parameter, parameterName),
476
- },
477
- ];
478
- }
479
- // -------------------------------------------------------------------------------------
480
- getParameterDescription() {
481
- const symbol = this.current.typeChecker.getSymbolAtLocation(this.parameter.name);
482
- if (symbol) {
483
- const comments = symbol.getDocumentationComment(this.current.typeChecker);
484
- if (comments.length) {
485
- return ts.displayPartsToString(comments);
486
- }
487
- }
488
- return '';
489
- }
490
- getParameterDeprecation() {
491
- if ((0, utils_1.hasJSDocTag)(this.parameter, utils_1.JSDocTagName.DEPRECATED)) {
492
- return true;
493
- }
494
- const match = this.current.decoratorResolver.match(decorator_1.DecoratorID.DEPRECATED, this.parameter);
495
- return !!match;
496
- }
497
- getParameterExample(parameterName) {
498
- const exampleLabels = [];
499
- const examples = (0, utils_1.getJSDocTags)(this.parameter.parent, (tag) => {
500
- const comment = (0, utils_1.transformJSDocComment)(tag.comment);
501
- const isExample = (tag.tagName.text === utils_1.JSDocTagName.EXAMPLE || tag.tagName.escapedText === utils_1.JSDocTagName.EXAMPLE) &&
502
- !!comment && comment.startsWith(parameterName);
503
- if (isExample && comment) {
504
- const hasExampleLabel = (comment.split(' ')[0].indexOf('.') || -1) > 0;
505
- // custom example label is delimited by first '.' and the rest will all be included as example label
506
- exampleLabels.push(hasExampleLabel ? comment.split(' ')[0].split('.').slice(1).join('.') : undefined);
507
- }
508
- return isExample ?? false;
509
- }).map((tag) => ((0, utils_1.transformJSDocComment)(tag.comment) || '')
510
- .replace(`${(0, utils_1.transformJSDocComment)(tag.comment)?.split(' ')[0] || ''}`, '')
511
- .replace(/\r/g, ''));
512
- if (examples.length === 0) {
513
- return {
514
- examples: undefined,
515
- exampleLabels: undefined,
516
- };
517
- }
518
- try {
519
- return {
520
- examples: examples.map((example) => JSON.parse(example)),
521
- exampleLabels,
522
- };
523
- }
524
- catch (e) {
525
- throw error_1.ParameterError.invalidExampleSchema();
526
- }
527
- }
528
- isBodySupportedForMethod(method) {
529
- return ['delete', 'post', 'put', 'patch', 'get'].some((m) => m === method);
530
- }
531
- isTypeSupported(parameterType) {
532
- return [
533
- 'string',
534
- 'integer',
535
- 'long',
536
- 'float',
537
- 'double',
538
- 'date',
539
- 'datetime',
540
- 'buffer',
541
- 'boolean',
542
- 'enum',
543
- ].find((t) => t === parameterType.typeName);
544
- }
545
- getValidatedType(parameter) {
546
- let typeNode = parameter.type;
547
- if (!typeNode) {
548
- const type = this.current.typeChecker.getTypeAtLocation(parameter);
549
- typeNode = this.current.typeChecker.typeToTypeNode(type, undefined, ts.NodeBuilderFlags.NoTruncation);
550
- }
551
- return new resolver_1.TypeNodeResolver(typeNode, this.current, parameter).resolve();
552
- }
553
- }
554
- exports.ParameterGenerator = ParameterGenerator;
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2021-2023.
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.ParameterGenerator = void 0;
33
+ const locter_1 = require("locter");
34
+ const ts = __importStar(require("typescript"));
35
+ const decorator_1 = require("../../decorator");
36
+ const resolver_1 = require("../../resolver");
37
+ const utils_1 = require("../../utils");
38
+ const constants_1 = require("./constants");
39
+ const error_1 = require("./error");
40
+ const parameterKeys = [
41
+ decorator_1.DecoratorID.CONTEXT,
42
+ decorator_1.DecoratorID.PARAM,
43
+ decorator_1.DecoratorID.PARAMS,
44
+ decorator_1.DecoratorID.QUERY,
45
+ decorator_1.DecoratorID.FORM,
46
+ decorator_1.DecoratorID.BODY,
47
+ decorator_1.DecoratorID.HEADER,
48
+ decorator_1.DecoratorID.HEADERS,
49
+ decorator_1.DecoratorID.COOKIE,
50
+ decorator_1.DecoratorID.COOKIES,
51
+ decorator_1.DecoratorID.PATH,
52
+ decorator_1.DecoratorID.PATHS,
53
+ decorator_1.DecoratorID.FILE,
54
+ decorator_1.DecoratorID.FILES,
55
+ ];
56
+ class ParameterGenerator {
57
+ constructor(parameter, method, path, current) {
58
+ this.parameter = parameter;
59
+ this.method = method;
60
+ this.path = path;
61
+ this.current = current;
62
+ }
63
+ generate() {
64
+ const decorators = (0, utils_1.getNodeDecorators)(this.parameter);
65
+ for (let i = 0; i < parameterKeys.length; i++) {
66
+ const manager = this.current.decoratorResolver.match(parameterKeys[i], decorators);
67
+ if (typeof manager === 'undefined') {
68
+ continue;
69
+ }
70
+ switch (manager.representation.id) {
71
+ case decorator_1.DecoratorID.CONTEXT:
72
+ return this.getContextParameter();
73
+ case decorator_1.DecoratorID.PARAM:
74
+ case decorator_1.DecoratorID.PARAMS:
75
+ return this.getParamParameter(manager);
76
+ case decorator_1.DecoratorID.FORM:
77
+ return this.getFormParameter(manager);
78
+ case decorator_1.DecoratorID.QUERY:
79
+ return this.getQueryParameter(manager);
80
+ case decorator_1.DecoratorID.BODY:
81
+ return this.getBodyParameter(manager);
82
+ case decorator_1.DecoratorID.HEADER:
83
+ case decorator_1.DecoratorID.HEADERS:
84
+ return this.getHeaderParameter(manager);
85
+ case decorator_1.DecoratorID.COOKIE:
86
+ case decorator_1.DecoratorID.COOKIES:
87
+ return this.getCookieParameter(manager);
88
+ case decorator_1.DecoratorID.PATH:
89
+ case decorator_1.DecoratorID.PATHS:
90
+ return this.getPathParameter(manager);
91
+ case decorator_1.DecoratorID.FILE:
92
+ case decorator_1.DecoratorID.FILES:
93
+ return this.getFileParameter(manager);
94
+ }
95
+ }
96
+ return this.getBodyParameter();
97
+ }
98
+ buildParametersForObject(type, details) {
99
+ if (type.properties.length === 0) {
100
+ return [];
101
+ }
102
+ const parameterName = this.parameter.name.text;
103
+ const initializerValue = (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type);
104
+ const output = [];
105
+ for (let i = 0; i < type.properties.length; i++) {
106
+ const property = type.properties[i];
107
+ let propertyDefaultValue = property.default;
108
+ if (typeof propertyDefaultValue === 'undefined' &&
109
+ (0, locter_1.isObject)(initializerValue)) {
110
+ propertyDefaultValue = initializerValue[property.name];
111
+ }
112
+ let propertyRequired = !this.parameter.questionToken;
113
+ if (propertyRequired) {
114
+ propertyRequired = property.required;
115
+ }
116
+ output.push({
117
+ ...details,
118
+ default: propertyDefaultValue,
119
+ description: property.description || details.description || this.getParameterDescription(),
120
+ name: property.name,
121
+ parameterName,
122
+ required: propertyRequired,
123
+ type: property.type,
124
+ deprecated: property.deprecated || this.getParameterDeprecation(),
125
+ });
126
+ // todo: example, format
127
+ }
128
+ return output;
129
+ }
130
+ getParamParameter(manager) {
131
+ return [
132
+ ...this.getBodyParameter(manager),
133
+ ...this.getCookieParameter(manager),
134
+ ];
135
+ }
136
+ getContextParameter() {
137
+ const parameterName = this.parameter.name.text;
138
+ // todo: req, res, next should maybe be separate parameter sources.
139
+ return [
140
+ {
141
+ description: this.getParameterDescription(),
142
+ in: constants_1.ParameterSource.CONTEXT,
143
+ name: parameterName,
144
+ parameterName,
145
+ required: !this.parameter.questionToken,
146
+ type: null,
147
+ },
148
+ ];
149
+ }
150
+ getFileParameter(manager) {
151
+ const parameterName = this.parameter.name.text;
152
+ let name = parameterName;
153
+ const value = manager.get('value');
154
+ if (typeof value === 'string') {
155
+ name = value;
156
+ }
157
+ if (!this.isBodySupportedForMethod(this.method)) {
158
+ throw error_1.ParameterError.methodUnsupported({
159
+ decoratorName: manager.representation.name,
160
+ propertyName: name,
161
+ method: this.method,
162
+ node: this.parameter,
163
+ });
164
+ }
165
+ const elementType = { typeName: resolver_1.TypeName.FILE };
166
+ let type;
167
+ if (manager.representation.id === decorator_1.DecoratorID.FILES) {
168
+ type = { typeName: resolver_1.TypeName.ARRAY, elementType };
169
+ }
170
+ else {
171
+ type = elementType;
172
+ }
173
+ const { examples, exampleLabels } = this.getParameterExample(parameterName);
174
+ return [
175
+ {
176
+ default: (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type),
177
+ description: this.getParameterDescription(),
178
+ examples,
179
+ exampleLabels,
180
+ in: constants_1.ParameterSource.FORM_DATA,
181
+ name: name || parameterName,
182
+ parameterName,
183
+ required: !this.parameter.questionToken && !this.parameter.initializer,
184
+ type,
185
+ deprecated: this.getParameterDeprecation(),
186
+ validators: (0, utils_1.getDeclarationValidators)(this.parameter, parameterName),
187
+ },
188
+ ];
189
+ }
190
+ getFormParameter(manager) {
191
+ const parameterName = this.parameter.name.text;
192
+ let name = parameterName;
193
+ const type = this.getValidatedType(this.parameter);
194
+ if (!this.isBodySupportedForMethod(this.method)) {
195
+ throw error_1.ParameterError.methodUnsupported({
196
+ decoratorName: manager.representation.name,
197
+ propertyName: name,
198
+ method: this.method,
199
+ node: this.parameter,
200
+ });
201
+ }
202
+ const value = manager.get('value');
203
+ if (typeof value === 'string') {
204
+ name = value;
205
+ }
206
+ const { examples, exampleLabels } = this.getParameterExample(parameterName);
207
+ return [
208
+ {
209
+ default: (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type),
210
+ description: this.getParameterDescription(),
211
+ examples,
212
+ exampleLabels,
213
+ in: constants_1.ParameterSource.FORM_DATA,
214
+ name: name || parameterName,
215
+ parameterName,
216
+ required: !this.parameter.questionToken && !this.parameter.initializer,
217
+ type,
218
+ deprecated: this.getParameterDeprecation(),
219
+ validators: (0, utils_1.getDeclarationValidators)(this.parameter, parameterName),
220
+ },
221
+ ];
222
+ }
223
+ getCookieParameter(manager) {
224
+ const parameterName = this.parameter.name.text;
225
+ let name = parameterName;
226
+ const type = this.getValidatedType(this.parameter);
227
+ const { examples, exampleLabels } = this.getParameterExample(parameterName);
228
+ if ((0, resolver_1.isNestedObjectLiteralType)(type) ||
229
+ (0, resolver_1.isRefObjectType)(type)) {
230
+ return this.buildParametersForObject(type, {
231
+ in: constants_1.ParameterSource.COOKIE,
232
+ examples,
233
+ exampleLabels,
234
+ });
235
+ }
236
+ if (!this.isTypeSupported(type)) {
237
+ throw error_1.ParameterError.typeUnsupported({
238
+ decoratorName: manager.representation.name,
239
+ propertyName: name,
240
+ type,
241
+ node: this.parameter,
242
+ });
243
+ }
244
+ const value = manager.get('value');
245
+ if (typeof value === 'string') {
246
+ name = value;
247
+ }
248
+ return [
249
+ {
250
+ default: (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type),
251
+ description: this.getParameterDescription(),
252
+ examples,
253
+ exampleLabels,
254
+ in: constants_1.ParameterSource.COOKIE,
255
+ name: name || parameterName,
256
+ parameterName,
257
+ required: !this.parameter.questionToken && !this.parameter.initializer,
258
+ type,
259
+ deprecated: this.getParameterDeprecation(),
260
+ validators: (0, utils_1.getDeclarationValidators)(this.parameter, parameterName),
261
+ },
262
+ ];
263
+ }
264
+ getBodyParameter(manager) {
265
+ const parameterName = this.parameter.name.text;
266
+ let name = parameterName;
267
+ let source = constants_1.ParameterSource.BODY;
268
+ if (manager) {
269
+ const value = manager.get('value');
270
+ if (typeof value === 'string') {
271
+ name = value;
272
+ source = constants_1.ParameterSource.BODY_PROP;
273
+ }
274
+ }
275
+ const type = this.getValidatedType(this.parameter);
276
+ if (!this.isBodySupportedForMethod(this.method)) {
277
+ throw error_1.ParameterError.methodUnsupported({
278
+ decoratorName: manager ? manager.representation.name : 'Body',
279
+ propertyName: name,
280
+ method: this.method,
281
+ node: this.parameter,
282
+ });
283
+ }
284
+ const { examples, exampleLabels } = this.getParameterExample(parameterName);
285
+ return [
286
+ {
287
+ default: (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type),
288
+ description: this.getParameterDescription(),
289
+ examples,
290
+ exampleLabels,
291
+ in: source,
292
+ name: name || parameterName,
293
+ parameterName,
294
+ required: !this.parameter.questionToken && !this.parameter.initializer,
295
+ type,
296
+ deprecated: this.getParameterDeprecation(),
297
+ validators: (0, utils_1.getDeclarationValidators)(this.parameter, parameterName),
298
+ },
299
+ ];
300
+ }
301
+ getHeaderParameter(manager) {
302
+ const parameterName = this.parameter.name.text;
303
+ let name = parameterName;
304
+ const type = this.getValidatedType(this.parameter);
305
+ const value = manager.get('value');
306
+ if (typeof value === 'string') {
307
+ name = value;
308
+ }
309
+ const { examples, exampleLabels } = this.getParameterExample(parameterName);
310
+ if ((0, resolver_1.isNestedObjectLiteralType)(type) ||
311
+ (0, resolver_1.isRefObjectType)(type)) {
312
+ return this.buildParametersForObject(type, {
313
+ in: constants_1.ParameterSource.HEADER,
314
+ examples,
315
+ exampleLabels,
316
+ });
317
+ }
318
+ if (!this.isTypeSupported(type)) {
319
+ throw error_1.ParameterError.typeUnsupported({
320
+ decoratorName: manager.representation.name,
321
+ propertyName: name,
322
+ type,
323
+ node: this.parameter,
324
+ });
325
+ }
326
+ return [
327
+ {
328
+ default: (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type),
329
+ description: this.getParameterDescription(),
330
+ examples,
331
+ exampleLabels,
332
+ in: constants_1.ParameterSource.HEADER,
333
+ name: name || parameterName,
334
+ parameterName,
335
+ required: !this.parameter.questionToken && !this.parameter.initializer,
336
+ type,
337
+ deprecated: this.getParameterDeprecation(),
338
+ validators: (0, utils_1.getDeclarationValidators)(this.parameter, parameterName),
339
+ },
340
+ ];
341
+ }
342
+ getQueryParameter(manager) {
343
+ const parameterName = this.parameter.name.text;
344
+ const type = this.getValidatedType(this.parameter);
345
+ let name = parameterName;
346
+ let options = {};
347
+ let source = constants_1.ParameterSource.QUERY;
348
+ const nameValue = manager.get('value');
349
+ if (typeof nameValue === 'string') {
350
+ name = nameValue;
351
+ source = constants_1.ParameterSource.QUERY_PROP;
352
+ }
353
+ const optionsValue = manager.get('options');
354
+ if ((0, locter_1.isObject)(optionsValue)) {
355
+ options = optionsValue;
356
+ }
357
+ const { examples, exampleLabels } = this.getParameterExample(parameterName);
358
+ if (source === constants_1.ParameterSource.QUERY) {
359
+ // yeah! we can transform the object to individual properties.
360
+ if ((0, resolver_1.isNestedObjectLiteralType)(type) ||
361
+ (0, resolver_1.isRefObjectType)(type)) {
362
+ return this.buildParametersForObject(type, {
363
+ in: constants_1.ParameterSource.QUERY_PROP,
364
+ examples,
365
+ exampleLabels,
366
+ });
367
+ // todo: transform ( type.typeName === 'array')
368
+ }
369
+ }
370
+ const properties = {
371
+ allowEmptyValue: options.allowEmptyValue,
372
+ collectionFormat: options.collectionFormat,
373
+ default: (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type),
374
+ description: this.getParameterDescription(),
375
+ examples,
376
+ exampleLabels,
377
+ in: source,
378
+ maxItems: options.maxItems,
379
+ minItems: options.minItems,
380
+ name,
381
+ parameterName,
382
+ required: !this.parameter.questionToken && !this.parameter.initializer,
383
+ type,
384
+ deprecated: this.getParameterDeprecation(),
385
+ validators: (0, utils_1.getDeclarationValidators)(this.parameter, parameterName),
386
+ };
387
+ if ((0, resolver_1.isArrayType)(type)) {
388
+ if (!this.isTypeSupported(type.elementType)) {
389
+ throw error_1.ParameterError.typeUnsupported({
390
+ decoratorName: manager.representation.name,
391
+ propertyName: name,
392
+ type: type.elementType,
393
+ node: this.parameter,
394
+ });
395
+ }
396
+ return [{
397
+ ...properties,
398
+ collectionFormat: constants_1.CollectionFormat.MULTI,
399
+ type,
400
+ }];
401
+ }
402
+ // todo: investigate if this refEnum and union are valid types
403
+ if (!this.isTypeSupportedForQueryParameter(type)) {
404
+ throw error_1.ParameterError.typeUnsupported({
405
+ decoratorName: manager.representation.name,
406
+ propertyName: name,
407
+ type,
408
+ node: this.parameter,
409
+ });
410
+ }
411
+ return [properties];
412
+ }
413
+ isTypeSupportedForQueryParameter(type) {
414
+ return this.isTypeSupported(type) ||
415
+ (0, resolver_1.isRefEnumType)(type) ||
416
+ (0, resolver_1.isUnionType)(type);
417
+ }
418
+ getPathParameter(manager) {
419
+ const parameterName = this.parameter.name.text;
420
+ let name = parameterName;
421
+ const type = this.getValidatedType(this.parameter);
422
+ const value = manager.get('value');
423
+ if (typeof value === 'string') {
424
+ name = value;
425
+ }
426
+ const { examples, exampleLabels } = this.getParameterExample(parameterName);
427
+ if ((0, resolver_1.isNestedObjectLiteralType)(type) ||
428
+ (0, resolver_1.isRefObjectType)(type)) {
429
+ const output = this.buildParametersForObject(type, {
430
+ in: constants_1.ParameterSource.PATH,
431
+ examples,
432
+ exampleLabels,
433
+ });
434
+ for (let i = 0; i < output.length; i++) {
435
+ if ((!this.path.includes(`{${output[i].name}}`)) &&
436
+ (!this.path.includes(`:${output[i].name}`))) {
437
+ throw error_1.ParameterError.invalidPathMatch({
438
+ decoratorName: manager.representation.name,
439
+ propertyName: name,
440
+ path: this.path,
441
+ node: this.parameter,
442
+ });
443
+ }
444
+ }
445
+ return output;
446
+ }
447
+ if (!this.isTypeSupported(type)) {
448
+ throw error_1.ParameterError.typeUnsupported({
449
+ decoratorName: manager.representation.name,
450
+ propertyName: name,
451
+ type,
452
+ node: this.parameter,
453
+ });
454
+ }
455
+ if ((!this.path.includes(`{${name}}`)) &&
456
+ (!this.path.includes(`:${name}`))) {
457
+ throw error_1.ParameterError.invalidPathMatch({
458
+ decoratorName: manager.representation.name,
459
+ propertyName: name,
460
+ path: this.path,
461
+ node: this.parameter,
462
+ });
463
+ }
464
+ return [
465
+ {
466
+ default: (0, utils_1.getInitializerValue)(this.parameter.initializer, this.current.typeChecker, type),
467
+ description: this.getParameterDescription(),
468
+ examples,
469
+ exampleLabels,
470
+ in: constants_1.ParameterSource.PATH,
471
+ name: name || parameterName,
472
+ parameterName,
473
+ required: true,
474
+ type,
475
+ deprecated: this.getParameterDeprecation(),
476
+ validators: (0, utils_1.getDeclarationValidators)(this.parameter, parameterName),
477
+ },
478
+ ];
479
+ }
480
+ // -------------------------------------------------------------------------------------
481
+ getParameterDescription() {
482
+ const symbol = this.current.typeChecker.getSymbolAtLocation(this.parameter.name);
483
+ if (symbol) {
484
+ const comments = symbol.getDocumentationComment(this.current.typeChecker);
485
+ if (comments.length) {
486
+ return ts.displayPartsToString(comments);
487
+ }
488
+ }
489
+ return '';
490
+ }
491
+ getParameterDeprecation() {
492
+ if ((0, utils_1.hasJSDocTag)(this.parameter, utils_1.JSDocTagName.DEPRECATED)) {
493
+ return true;
494
+ }
495
+ const match = this.current.decoratorResolver.match(decorator_1.DecoratorID.DEPRECATED, this.parameter);
496
+ return !!match;
497
+ }
498
+ getParameterExample(parameterName) {
499
+ const exampleLabels = [];
500
+ const examples = (0, utils_1.getJSDocTags)(this.parameter.parent, (tag) => {
501
+ const comment = (0, utils_1.transformJSDocComment)(tag.comment);
502
+ const isExample = (tag.tagName.text === utils_1.JSDocTagName.EXAMPLE || tag.tagName.escapedText === utils_1.JSDocTagName.EXAMPLE) &&
503
+ !!comment && comment.startsWith(parameterName);
504
+ if (isExample && comment) {
505
+ const hasExampleLabel = (comment.split(' ')[0].indexOf('.') || -1) > 0;
506
+ // custom example label is delimited by first '.' and the rest will all be included as example label
507
+ exampleLabels.push(hasExampleLabel ? comment.split(' ')[0].split('.').slice(1).join('.') : undefined);
508
+ }
509
+ return isExample ?? false;
510
+ }).map((tag) => ((0, utils_1.transformJSDocComment)(tag.comment) || '')
511
+ .replace(`${(0, utils_1.transformJSDocComment)(tag.comment)?.split(' ')[0] || ''}`, '')
512
+ .replace(/\r/g, ''));
513
+ if (examples.length === 0) {
514
+ return {
515
+ examples: undefined,
516
+ exampleLabels: undefined,
517
+ };
518
+ }
519
+ try {
520
+ return {
521
+ examples: examples.map((example) => JSON.parse(example)),
522
+ exampleLabels,
523
+ };
524
+ }
525
+ catch (e) {
526
+ throw error_1.ParameterError.invalidExampleSchema();
527
+ }
528
+ }
529
+ isBodySupportedForMethod(method) {
530
+ return ['delete', 'post', 'put', 'patch', 'get'].some((m) => m === method);
531
+ }
532
+ isTypeSupported(parameterType) {
533
+ return [
534
+ resolver_1.TypeName.STRING,
535
+ resolver_1.TypeName.INTEGER,
536
+ resolver_1.TypeName.LONG,
537
+ resolver_1.TypeName.FLOAT,
538
+ resolver_1.TypeName.DOUBLE,
539
+ resolver_1.TypeName.DATE,
540
+ resolver_1.TypeName.DATETIME,
541
+ resolver_1.TypeName.BUFFER,
542
+ resolver_1.TypeName.BOOLEAN,
543
+ resolver_1.TypeName.ENUM,
544
+ ].find((t) => t === parameterType.typeName);
545
+ }
546
+ getValidatedType(parameter) {
547
+ let typeNode = parameter.type;
548
+ if (!typeNode) {
549
+ const type = this.current.typeChecker.getTypeAtLocation(parameter);
550
+ typeNode = this.current.typeChecker.typeToTypeNode(type, undefined, ts.NodeBuilderFlags.NoTruncation);
551
+ }
552
+ return new resolver_1.TypeNodeResolver(typeNode, this.current, parameter).resolve();
553
+ }
554
+ }
555
+ exports.ParameterGenerator = ParameterGenerator;
555
556
  //# sourceMappingURL=module.js.map