@tsed/schema 8.0.0 → 8.0.2

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 (291) hide show
  1. package/package.json +11 -10
  2. package/src/components/async-api/channelsMapper.ts +81 -0
  3. package/src/components/async-api/generate.ts +24 -0
  4. package/src/components/async-api/messageMapper.ts +62 -0
  5. package/src/components/async-api/payloadMapper.ts +61 -0
  6. package/src/components/async-api/responseMapper.ts +70 -0
  7. package/src/components/default/anyMapper.spec.ts +7 -0
  8. package/src/components/default/anyMapper.ts +33 -0
  9. package/src/components/default/classMapper.ts +55 -0
  10. package/src/components/default/discriminatorMappingMapper.ts +36 -0
  11. package/src/components/default/enumsMapper.spec.ts +64 -0
  12. package/src/components/default/enumsMapper.ts +17 -0
  13. package/src/components/default/genericsMapper.ts +70 -0
  14. package/src/components/default/inheritedClassMapper.ts +24 -0
  15. package/src/components/default/itemMapper.ts +8 -0
  16. package/src/components/default/lazyRefMapper.ts +21 -0
  17. package/src/components/default/mapMapper.ts +25 -0
  18. package/src/components/default/nullableMapper.ts +55 -0
  19. package/src/components/default/objectMapper.ts +36 -0
  20. package/src/components/default/ofMapper.ts +16 -0
  21. package/src/components/default/propertiesMapper.ts +25 -0
  22. package/src/components/default/requiredMapper.ts +69 -0
  23. package/src/components/default/schemaMapper.ts +151 -0
  24. package/src/components/index.ts +36 -0
  25. package/src/components/open-spec/discriminatorMappingMapper.ts +7 -0
  26. package/src/components/open-spec/enumsMapper.ts +20 -0
  27. package/src/components/open-spec/generate.ts +29 -0
  28. package/src/components/open-spec/nullableMapper.ts +51 -0
  29. package/src/components/open-spec/operationInFilesMapper.ts +32 -0
  30. package/src/components/open-spec/operationInParameterMapper.ts +56 -0
  31. package/src/components/open-spec/operationInParametersMapper.ts +9 -0
  32. package/src/components/open-spec/operationInQueryMapper.ts +74 -0
  33. package/src/components/open-spec/operationMapper.ts +65 -0
  34. package/src/components/open-spec/operationMediaMapper.ts +11 -0
  35. package/src/components/open-spec/operationRequestBodyMapper.ts +82 -0
  36. package/src/components/open-spec/operationResponseMapper.ts +26 -0
  37. package/src/components/open-spec/pathsMapper.ts +132 -0
  38. package/src/constants/OperationVerbs.ts +29 -0
  39. package/src/constants/httpStatusMessages.ts +21 -0
  40. package/src/constants/jsonSchemaProperties.ts +17 -0
  41. package/src/decorators/class/children.ts +22 -0
  42. package/src/decorators/class/discriminatorValue.ts +53 -0
  43. package/src/decorators/collections/collectionContains.ts +25 -0
  44. package/src/decorators/collections/collectionOf.spec.ts +327 -0
  45. package/src/decorators/collections/collectionOf.ts +182 -0
  46. package/src/decorators/collections/maxItems.spec.ts +40 -0
  47. package/src/decorators/collections/maxItems.ts +59 -0
  48. package/src/decorators/collections/maxProperties.spec.ts +109 -0
  49. package/src/decorators/collections/maxProperties.ts +82 -0
  50. package/src/decorators/collections/minItems.spec.ts +40 -0
  51. package/src/decorators/collections/minItems.ts +63 -0
  52. package/src/decorators/collections/minProperties.spec.ts +109 -0
  53. package/src/decorators/collections/minProperties.ts +81 -0
  54. package/src/decorators/collections/uniqueItems.spec.ts +28 -0
  55. package/src/decorators/collections/uniqueItems.ts +59 -0
  56. package/src/decorators/common/__snapshots__/groups.spec.ts.snap +321 -0
  57. package/src/decorators/common/additionalProperties.spec.ts +133 -0
  58. package/src/decorators/common/additionalProperties.ts +17 -0
  59. package/src/decorators/common/allOf.spec.ts +276 -0
  60. package/src/decorators/common/allOf.ts +19 -0
  61. package/src/decorators/common/allow.spec.ts +130 -0
  62. package/src/decorators/common/allow.ts +50 -0
  63. package/src/decorators/common/any.spec.ts +109 -0
  64. package/src/decorators/common/any.ts +45 -0
  65. package/src/decorators/common/anyOf.spec.ts +270 -0
  66. package/src/decorators/common/anyOf.ts +23 -0
  67. package/src/decorators/common/const.spec.ts +98 -0
  68. package/src/decorators/common/const.ts +68 -0
  69. package/src/decorators/common/customKey.spec.ts +105 -0
  70. package/src/decorators/common/customKey.ts +39 -0
  71. package/src/decorators/common/default.spec.ts +25 -0
  72. package/src/decorators/common/default.ts +47 -0
  73. package/src/decorators/common/defaultMsg.spec.ts +22 -0
  74. package/src/decorators/common/defaultMsg.ts +38 -0
  75. package/src/decorators/common/description.spec.ts +166 -0
  76. package/src/decorators/common/description.ts +77 -0
  77. package/src/decorators/common/discriminatorKey.ts +14 -0
  78. package/src/decorators/common/enum.spec.ts +305 -0
  79. package/src/decorators/common/enum.ts +111 -0
  80. package/src/decorators/common/errorMsg.spec.ts +57 -0
  81. package/src/decorators/common/errorMsg.ts +14 -0
  82. package/src/decorators/common/example.spec.ts +93 -0
  83. package/src/decorators/common/example.ts +18 -0
  84. package/src/decorators/common/examples.spec.ts +101 -0
  85. package/src/decorators/common/examples.ts +20 -0
  86. package/src/decorators/common/exclusiveMaximum.spec.ts +47 -0
  87. package/src/decorators/common/exclusiveMaximum.ts +75 -0
  88. package/src/decorators/common/exclusiveMinimum.spec.ts +47 -0
  89. package/src/decorators/common/exclusiveMinimum.ts +75 -0
  90. package/src/decorators/common/format.spec.ts +149 -0
  91. package/src/decorators/common/format.ts +486 -0
  92. package/src/decorators/common/forwardGroups.spec.ts +270 -0
  93. package/src/decorators/common/forwardGroups.ts +16 -0
  94. package/src/decorators/common/groups.spec.ts +968 -0
  95. package/src/decorators/common/groups.ts +66 -0
  96. package/src/decorators/common/hidden.spec.ts +52 -0
  97. package/src/decorators/common/hidden.ts +36 -0
  98. package/src/decorators/common/ignore.spec.ts +88 -0
  99. package/src/decorators/common/ignore.ts +66 -0
  100. package/src/decorators/common/integer.spec.ts +110 -0
  101. package/src/decorators/common/integer.ts +69 -0
  102. package/src/decorators/common/jsonEntityFn.spec.ts +16 -0
  103. package/src/decorators/common/jsonEntityFn.ts +33 -0
  104. package/src/decorators/common/maxLength.spec.ts +61 -0
  105. package/src/decorators/common/maxLength.ts +88 -0
  106. package/src/decorators/common/maximum.spec.ts +73 -0
  107. package/src/decorators/common/maximum.ts +146 -0
  108. package/src/decorators/common/minLength.spec.ts +186 -0
  109. package/src/decorators/common/minLength.ts +89 -0
  110. package/src/decorators/common/minimum.spec.ts +74 -0
  111. package/src/decorators/common/minimum.ts +145 -0
  112. package/src/decorators/common/multipleOf.spec.ts +33 -0
  113. package/src/decorators/common/multipleOf.ts +80 -0
  114. package/src/decorators/common/name.spec.ts +56 -0
  115. package/src/decorators/common/name.ts +50 -0
  116. package/src/decorators/common/nullable.spec.ts +818 -0
  117. package/src/decorators/common/nullable.ts +32 -0
  118. package/src/decorators/common/oneOf.spec.ts +301 -0
  119. package/src/decorators/common/oneOf.ts +24 -0
  120. package/src/decorators/common/optional.spec.ts +43 -0
  121. package/src/decorators/common/optional.ts +26 -0
  122. package/src/decorators/common/pattern.spec.ts +27 -0
  123. package/src/decorators/common/pattern.ts +102 -0
  124. package/src/decorators/common/property.ts +24 -0
  125. package/src/decorators/common/readOnly.spec.ts +135 -0
  126. package/src/decorators/common/readOnly.ts +17 -0
  127. package/src/decorators/common/recordOf.spec.ts +41 -0
  128. package/src/decorators/common/recordOf.ts +59 -0
  129. package/src/decorators/common/required.spec.ts +188 -0
  130. package/src/decorators/common/required.ts +50 -0
  131. package/src/decorators/common/requiredGroups.spec.ts +127 -0
  132. package/src/decorators/common/requiredGroups.ts +23 -0
  133. package/src/decorators/common/schema.spec.ts +23 -0
  134. package/src/decorators/common/schema.ts +64 -0
  135. package/src/decorators/common/title.spec.ts +20 -0
  136. package/src/decorators/common/title.ts +45 -0
  137. package/src/decorators/common/typeError.spec.ts +22 -0
  138. package/src/decorators/common/typeError.ts +15 -0
  139. package/src/decorators/common/writeOnly.spec.ts +105 -0
  140. package/src/decorators/common/writeOnly.ts +17 -0
  141. package/src/decorators/config/jsonEntityComponent.ts +16 -0
  142. package/src/decorators/generics/genericOf.spec.ts +246 -0
  143. package/src/decorators/generics/genericOf.ts +112 -0
  144. package/src/decorators/generics/generics.ts +22 -0
  145. package/src/decorators/operations/acceptMime.spec.ts +39 -0
  146. package/src/decorators/operations/acceptMime.ts +25 -0
  147. package/src/decorators/operations/consumes.spec.ts +89 -0
  148. package/src/decorators/operations/consumes.ts +37 -0
  149. package/src/decorators/operations/contentType.spec.ts +40 -0
  150. package/src/decorators/operations/contentType.ts +24 -0
  151. package/src/decorators/operations/deprecated.spec.ts +223 -0
  152. package/src/decorators/operations/deprecated.ts +49 -0
  153. package/src/decorators/operations/header.spec.ts +214 -0
  154. package/src/decorators/operations/header.ts +62 -0
  155. package/src/decorators/operations/in.spec.ts +321 -0
  156. package/src/decorators/operations/in.ts +141 -0
  157. package/src/decorators/operations/inFile.spec.ts +209 -0
  158. package/src/decorators/operations/inFile.ts +55 -0
  159. package/src/decorators/operations/location.spec.ts +51 -0
  160. package/src/decorators/operations/location.ts +26 -0
  161. package/src/decorators/operations/operation.ts +119 -0
  162. package/src/decorators/operations/operationId.spec.ts +43 -0
  163. package/src/decorators/operations/operationId.ts +22 -0
  164. package/src/decorators/operations/operationPath.spec.ts +42 -0
  165. package/src/decorators/operations/operationPath.ts +33 -0
  166. package/src/decorators/operations/partial.spec.ts +249 -0
  167. package/src/decorators/operations/partial.ts +14 -0
  168. package/src/decorators/operations/path.spec.ts +47 -0
  169. package/src/decorators/operations/path.ts +27 -0
  170. package/src/decorators/operations/produces.spec.ts +89 -0
  171. package/src/decorators/operations/produces.ts +44 -0
  172. package/src/decorators/operations/publish.spec.ts +26 -0
  173. package/src/decorators/operations/publish.ts +6 -0
  174. package/src/decorators/operations/redirect.spec.ts +146 -0
  175. package/src/decorators/operations/redirect.ts +82 -0
  176. package/src/decorators/operations/returns.spec.ts +1393 -0
  177. package/src/decorators/operations/returns.ts +662 -0
  178. package/src/decorators/operations/route.spec.ts +211 -0
  179. package/src/decorators/operations/route.ts +154 -0
  180. package/src/decorators/operations/security.spec.ts +162 -0
  181. package/src/decorators/operations/security.ts +83 -0
  182. package/src/decorators/operations/status.spec.ts +582 -0
  183. package/src/decorators/operations/status.ts +130 -0
  184. package/src/decorators/operations/subscribe.spec.ts +32 -0
  185. package/src/decorators/operations/subscribe.ts +6 -0
  186. package/src/decorators/operations/summary.spec.ts +45 -0
  187. package/src/decorators/operations/summary.ts +32 -0
  188. package/src/decorators/operations/tags.spec.ts +113 -0
  189. package/src/decorators/operations/tags.ts +53 -0
  190. package/src/decorators/operations/view.spec.ts +16 -0
  191. package/src/decorators/operations/view.ts +27 -0
  192. package/src/domain/DecoratorContext.ts +116 -0
  193. package/src/domain/JsonAliasMap.ts +19 -0
  194. package/src/domain/JsonClassStore.ts +35 -0
  195. package/src/domain/JsonDiscriminator.spec.ts +65 -0
  196. package/src/domain/JsonDiscriminator.ts +52 -0
  197. package/src/domain/JsonEntityStore.spec.ts +277 -0
  198. package/src/domain/JsonEntityStore.ts +284 -0
  199. package/src/domain/JsonFormatTypes.ts +17 -0
  200. package/src/domain/JsonLazyRef.ts +21 -0
  201. package/src/domain/JsonMap.spec.ts +15 -0
  202. package/src/domain/JsonMap.ts +33 -0
  203. package/src/domain/JsonMedia.ts +24 -0
  204. package/src/domain/JsonMethodStore.spec.ts +301 -0
  205. package/src/domain/JsonMethodStore.ts +212 -0
  206. package/src/domain/JsonOperation.spec.ts +126 -0
  207. package/src/domain/JsonOperation.ts +219 -0
  208. package/src/domain/JsonOperationPathsMap.ts +16 -0
  209. package/src/domain/JsonOperationRoute.spec.ts +109 -0
  210. package/src/domain/JsonOperationRoute.ts +75 -0
  211. package/src/domain/JsonParameter.ts +70 -0
  212. package/src/domain/JsonParameterStore.spec.ts +212 -0
  213. package/src/domain/JsonParameterStore.ts +138 -0
  214. package/src/domain/JsonParameterTypes.spec.ts +12 -0
  215. package/src/domain/JsonParameterTypes.ts +20 -0
  216. package/src/domain/JsonPropertyStore.spec.ts +177 -0
  217. package/src/domain/JsonPropertyStore.ts +92 -0
  218. package/src/domain/JsonRequestBody.ts +47 -0
  219. package/src/domain/JsonResponse.spec.ts +33 -0
  220. package/src/domain/JsonResponse.ts +64 -0
  221. package/src/domain/JsonSchema.spec.ts +1470 -0
  222. package/src/domain/JsonSchema.ts +1049 -0
  223. package/src/domain/SpecTypes.ts +6 -0
  224. package/src/hooks/alterIgnore.ts +25 -0
  225. package/src/hooks/alterOneOf.ts +67 -0
  226. package/src/hooks/alterRequiredGroups.ts +12 -0
  227. package/src/index.ts +185 -0
  228. package/src/interfaces/IgnoreCallback.ts +5 -0
  229. package/src/interfaces/JsonHookContext.ts +18 -0
  230. package/src/interfaces/JsonOpenSpec.ts +7 -0
  231. package/src/interfaces/JsonSchemaOptions.ts +35 -0
  232. package/src/registries/JsonSchemaMapperContainer.ts +52 -0
  233. package/src/registries/enumRegistries.ts +3 -0
  234. package/src/utils/__snapshots__/generateSpec.spec.ts.snap +109 -0
  235. package/src/utils/buildPath.ts +8 -0
  236. package/src/utils/concatParameters.ts +12 -0
  237. package/src/utils/concatPath.spec.ts +23 -0
  238. package/src/utils/concatPath.ts +24 -0
  239. package/src/utils/defineStatusModel.ts +11 -0
  240. package/src/utils/from.spec.ts +243 -0
  241. package/src/utils/from.ts +281 -0
  242. package/src/utils/generateSpec.spec.ts +1262 -0
  243. package/src/utils/generateSpec.ts +54 -0
  244. package/src/utils/generics.ts +83 -0
  245. package/src/utils/getComputedType.spec.ts +45 -0
  246. package/src/utils/getComputedType.ts +39 -0
  247. package/src/utils/getInheritedStores.spec.ts +47 -0
  248. package/src/utils/getInheritedStores.ts +23 -0
  249. package/src/utils/getJsonEntityStore.ts +36 -0
  250. package/src/utils/getJsonPathParameters.spec.ts +126 -0
  251. package/src/utils/getJsonPathParameters.ts +97 -0
  252. package/src/utils/getJsonSchema.spec.ts +695 -0
  253. package/src/utils/getJsonSchema.ts +69 -0
  254. package/src/utils/getJsonType.spec.ts +28 -0
  255. package/src/utils/getJsonType.ts +46 -0
  256. package/src/utils/getOperationsRoutes.spec.ts +284 -0
  257. package/src/utils/getOperationsRoutes.ts +56 -0
  258. package/src/utils/getOperationsStore.spec.ts +47 -0
  259. package/src/utils/getOperationsStores.ts +37 -0
  260. package/src/utils/getPropertiesStores.spec.ts +138 -0
  261. package/src/utils/getPropertiesStores.ts +66 -0
  262. package/src/utils/getSpec.spec.ts +610 -0
  263. package/src/utils/getSpec.ts +117 -0
  264. package/src/utils/getSpecType.spec.ts +16 -0
  265. package/src/utils/getSpecType.ts +19 -0
  266. package/src/utils/isSuccessStatus.spec.ts +22 -0
  267. package/src/utils/isSuccessStatus.ts +2 -0
  268. package/src/utils/mapHeaders.spec.ts +57 -0
  269. package/src/utils/mapHeaders.ts +33 -0
  270. package/src/utils/mapOpenSpec.ts +44 -0
  271. package/src/utils/mapOpenSpec2.ts +50 -0
  272. package/src/utils/mapOpenSpec3.ts +25 -0
  273. package/src/utils/mapOpenSpecInfo.ts +19 -0
  274. package/src/utils/mapOperationOptions.ts +34 -0
  275. package/src/utils/matchGroups.spec.ts +85 -0
  276. package/src/utils/matchGroups.ts +64 -0
  277. package/src/utils/mergeSpec.spec.ts +533 -0
  278. package/src/utils/mergeSpec.ts +54 -0
  279. package/src/utils/operationIdFormatter.spec.ts +11 -0
  280. package/src/utils/operationIdFormatter.ts +49 -0
  281. package/src/utils/ref.ts +65 -0
  282. package/src/utils/removeHiddenOperation.ts +5 -0
  283. package/src/utils/serializeEnumValues.ts +27 -0
  284. package/src/utils/somethingOf.ts +11 -0
  285. package/src/utils/toJsonMapCollection.spec.ts +18 -0
  286. package/src/utils/toJsonMapCollection.ts +12 -0
  287. package/src/utils/toJsonRegex.ts +7 -0
  288. package/src/utils/transformToOS2.spec.ts +177 -0
  289. package/src/utils/transformToOS2.ts +607 -0
  290. package/src/utils/withErrorMsg.spec.ts +16 -0
  291. package/src/utils/withErrorMsg.ts +56 -0
@@ -0,0 +1,66 @@
1
+ import {isBoolean, Type} from "@tsed/core";
2
+
3
+ import type {JsonClassStore} from "../domain/JsonClassStore.js";
4
+ import type {JsonPropertyStore} from "../domain/JsonPropertyStore.js";
5
+ import {alterIgnore} from "../hooks/alterIgnore.js";
6
+ import {getInheritedStores} from "./getInheritedStores.js";
7
+ import {getJsonEntityStore} from "./getJsonEntityStore.js";
8
+
9
+ /**
10
+ * Return the list of properties including properties from inherited classes
11
+ * @param target
12
+ * @ignore
13
+ */
14
+ export function getPropertiesStores<T extends JsonPropertyStore = JsonPropertyStore>(
15
+ target: Type<any> | any
16
+ ): Map<string | symbol | number, T> {
17
+ const store: JsonClassStore = target.isStore ? target : getJsonEntityStore(target);
18
+
19
+ if (!store.$properties) {
20
+ const stores = getInheritedStores(store);
21
+ store.$properties = new Map();
22
+
23
+ stores.forEach((currentStore) => {
24
+ currentStore.children.forEach((propStore) => {
25
+ if (!store.$properties.has(propStore.propertyKey)) {
26
+ store.$properties.set(propStore.propertyKey, propStore);
27
+ }
28
+ });
29
+ });
30
+ }
31
+
32
+ return store.$properties;
33
+ }
34
+
35
+ /**
36
+ * @ignore
37
+ */
38
+ export interface GetPropertiesOptions {
39
+ withIgnoredProps?: boolean;
40
+ groups?: string[] | false;
41
+
42
+ [type: string]: any;
43
+ }
44
+
45
+ /**
46
+ * @ignore
47
+ */
48
+ export function getProperties<T extends JsonPropertyStore = JsonPropertyStore>(
49
+ target: Type<any> | any,
50
+ options: GetPropertiesOptions = {}
51
+ ) {
52
+ const stores = getPropertiesStores<T>(target);
53
+ const map: Map<string | symbol | number, T> = new Map();
54
+
55
+ stores.forEach((store, key) => {
56
+ if (!options.withIgnoredProps) {
57
+ if (alterIgnore(store.itemSchema, options)) {
58
+ return;
59
+ }
60
+ }
61
+
62
+ map.set(key, store);
63
+ });
64
+
65
+ return map;
66
+ }
@@ -0,0 +1,610 @@
1
+ import {validateSpec} from "../../test/helpers/validateSpec.js";
2
+ import {CollectionOf} from "../decorators/collections/collectionOf.js";
3
+ import {Min} from "../decorators/common/minimum.js";
4
+ import {Name} from "../decorators/common/name.js";
5
+ import {Property} from "../decorators/common/property.js";
6
+ import {Required} from "../decorators/common/required.js";
7
+ import {Consumes} from "../decorators/operations/consumes.js";
8
+ import {In} from "../decorators/operations/in.js";
9
+ import {OperationPath} from "../decorators/operations/operationPath.js";
10
+ import {Returns} from "../decorators/operations/returns.js";
11
+ import {JsonParameterTypes} from "../domain/JsonParameterTypes.js";
12
+ import {SpecTypes} from "../domain/SpecTypes.js";
13
+ import {getSpec} from "./getSpec.js";
14
+
15
+ describe("getSpec()", () => {
16
+ describe("with on controller", () => {
17
+ describe("In", () => {
18
+ describe("Path", () => {
19
+ it("should declare all schema correctly (path - openspec3)", async () => {
20
+ // WHEN
21
+ class Controller {
22
+ @OperationPath("GET", "/:basic")
23
+ method(@In("path") @Name("basic") basic: string) {}
24
+ }
25
+
26
+ // THEN
27
+ const spec = getSpec(Controller, {
28
+ specType: SpecTypes.OPENAPI
29
+ });
30
+ expect(spec).toEqual({
31
+ paths: {
32
+ "/{basic}": {
33
+ get: {
34
+ operationId: "controllerMethod",
35
+ parameters: [
36
+ {
37
+ in: "path",
38
+ name: "basic",
39
+ required: true,
40
+ schema: {type: "string"}
41
+ }
42
+ ],
43
+ responses: {
44
+ "200": {
45
+ description: "Success"
46
+ }
47
+ },
48
+ tags: ["Controller"]
49
+ }
50
+ }
51
+ },
52
+ tags: [
53
+ {
54
+ name: "Controller"
55
+ }
56
+ ]
57
+ });
58
+ expect(await validateSpec(spec, SpecTypes.OPENAPI)).toBe(true);
59
+ });
60
+ it("should declare all schema correctly (path optional - openspec3)", async () => {
61
+ // WHEN
62
+ class Controller {
63
+ @OperationPath("GET", "/:id?")
64
+ method(@In("path") @Name("id") id: string) {}
65
+ }
66
+
67
+ // THEN
68
+ const spec = getSpec(Controller, {specType: SpecTypes.OPENAPI});
69
+
70
+ expect(await validateSpec(spec, SpecTypes.OPENAPI)).toBe(true);
71
+ expect(spec).toEqual({
72
+ paths: {
73
+ "/": {
74
+ get: {
75
+ operationId: "controllerMethod",
76
+ parameters: [],
77
+ responses: {
78
+ "200": {
79
+ description: "Success"
80
+ }
81
+ },
82
+ tags: ["Controller"]
83
+ }
84
+ },
85
+ "/{id}": {
86
+ get: {
87
+ operationId: "controllerMethodById",
88
+ parameters: [
89
+ {
90
+ in: "path",
91
+ name: "id",
92
+ required: true,
93
+ schema: {
94
+ type: "string"
95
+ }
96
+ }
97
+ ],
98
+ responses: {
99
+ "200": {
100
+ description: "Success"
101
+ }
102
+ },
103
+ tags: ["Controller"]
104
+ }
105
+ }
106
+ },
107
+ tags: [
108
+ {
109
+ name: "Controller"
110
+ }
111
+ ]
112
+ });
113
+ });
114
+ });
115
+ describe("Query", () => {
116
+ it("should declare all schema correctly (query - openspec3 - model)", () => {
117
+ // WHEN
118
+ class QueryModel {
119
+ @Property()
120
+ id: string;
121
+
122
+ @Property()
123
+ name: string;
124
+ }
125
+
126
+ class Controller {
127
+ @OperationPath("GET", "/:id")
128
+ method(@In("query") basic: QueryModel) {}
129
+ }
130
+
131
+ // THEN
132
+ const spec = getSpec(Controller, {specType: SpecTypes.OPENAPI});
133
+ expect(spec).toEqual({
134
+ paths: {
135
+ "/{id}": {
136
+ get: {
137
+ operationId: "controllerMethod",
138
+ parameters: [
139
+ {in: "path", name: "id", required: true, schema: {type: "string"}},
140
+ {in: "query", required: false, name: "id", schema: {type: "string"}},
141
+ {in: "query", required: false, name: "name", schema: {type: "string"}}
142
+ ],
143
+ responses: {"200": {description: "Success"}},
144
+ tags: ["Controller"]
145
+ }
146
+ }
147
+ },
148
+ tags: [{name: "Controller"}]
149
+ });
150
+ });
151
+ it("should declare all schema correctly (query - openspec3 - array string)", () => {
152
+ // WHEN
153
+ class Controller {
154
+ @OperationPath("GET", "/:id")
155
+ method(@In("query") @Name("basic") basic: string[]) {}
156
+ }
157
+
158
+ // THEN
159
+ const spec = getSpec(Controller, {specType: SpecTypes.OPENAPI});
160
+
161
+ expect(spec).toEqual({
162
+ paths: {
163
+ "/{id}": {
164
+ get: {
165
+ operationId: "controllerMethod",
166
+ parameters: [
167
+ {
168
+ in: "path",
169
+ name: "id",
170
+ required: true,
171
+ schema: {type: "string"}
172
+ },
173
+ {
174
+ in: "query",
175
+ name: "basic",
176
+ required: false,
177
+ schema: {
178
+ items: {
179
+ type: "object"
180
+ },
181
+ type: "array"
182
+ }
183
+ }
184
+ ],
185
+ responses: {
186
+ "200": {
187
+ description: "Success"
188
+ }
189
+ },
190
+ tags: ["Controller"]
191
+ }
192
+ }
193
+ },
194
+ tags: [
195
+ {
196
+ name: "Controller"
197
+ }
198
+ ]
199
+ });
200
+ });
201
+ it("should declare all schema correctly (query - openspec3 - Map)", () => {
202
+ // WHEN
203
+ class Controller {
204
+ @OperationPath("GET", "/:id")
205
+ method(@In("query") @Name("basic") @CollectionOf(String) basic: Map<string, string>) {}
206
+ }
207
+
208
+ // THEN
209
+ const spec = getSpec(Controller, {specType: SpecTypes.OPENAPI});
210
+
211
+ expect(spec).toEqual({
212
+ paths: {
213
+ "/{id}": {
214
+ get: {
215
+ operationId: "controllerMethod",
216
+ parameters: [
217
+ {
218
+ in: "path",
219
+ name: "id",
220
+ required: true,
221
+ schema: {type: "string"}
222
+ },
223
+ {
224
+ in: "query",
225
+ name: "basic",
226
+ required: false,
227
+ schema: {
228
+ additionalProperties: {
229
+ type: "string"
230
+ },
231
+ type: "object"
232
+ }
233
+ }
234
+ ],
235
+ responses: {
236
+ "200": {
237
+ description: "Success"
238
+ }
239
+ },
240
+ tags: ["Controller"]
241
+ }
242
+ }
243
+ },
244
+ tags: [
245
+ {
246
+ name: "Controller"
247
+ }
248
+ ]
249
+ });
250
+ });
251
+ });
252
+ describe("Body", () => {
253
+ it("should declare all schema correctly (model - openspec3)", () => {
254
+ class MyModel {
255
+ @Property()
256
+ prop: string;
257
+ }
258
+
259
+ class Controller {
260
+ @Consumes("application/json")
261
+ @OperationPath("POST", "/")
262
+ method(@In("body") @Required() num: MyModel) {}
263
+ }
264
+
265
+ // THEN
266
+ const spec = getSpec(Controller, {specType: SpecTypes.OPENAPI});
267
+
268
+ expect(spec).toEqual({
269
+ components: {
270
+ schemas: {
271
+ MyModel: {
272
+ properties: {
273
+ prop: {
274
+ type: "string"
275
+ }
276
+ },
277
+ type: "object"
278
+ }
279
+ }
280
+ },
281
+ tags: [
282
+ {
283
+ name: "Controller"
284
+ }
285
+ ],
286
+ paths: {
287
+ "/": {
288
+ post: {
289
+ operationId: "controllerMethod",
290
+ parameters: [],
291
+ requestBody: {
292
+ content: {
293
+ "application/json": {
294
+ schema: {
295
+ $ref: "#/components/schemas/MyModel"
296
+ }
297
+ }
298
+ },
299
+ required: true
300
+ },
301
+ tags: ["Controller"],
302
+ responses: {
303
+ "200": {
304
+ description: "Success"
305
+ }
306
+ }
307
+ }
308
+ }
309
+ }
310
+ });
311
+ });
312
+ it("should declare all schema correctly (Array - inline - OS3)", () => {
313
+ class Product {
314
+ @Property()
315
+ title: string;
316
+ }
317
+
318
+ class Controller {
319
+ @Consumes("application/json")
320
+ @OperationPath("POST", "/")
321
+ method(@In("body") @Required() @CollectionOf(Product) products: Product[]) {}
322
+ }
323
+
324
+ // THEN
325
+ const spec = getSpec(Controller, {specType: SpecTypes.OPENAPI});
326
+
327
+ expect(spec).toEqual({
328
+ components: {
329
+ schemas: {
330
+ Product: {
331
+ properties: {
332
+ title: {
333
+ type: "string"
334
+ }
335
+ },
336
+ type: "object"
337
+ }
338
+ }
339
+ },
340
+ paths: {
341
+ "/": {
342
+ post: {
343
+ operationId: "controllerMethod",
344
+ parameters: [],
345
+ requestBody: {
346
+ content: {
347
+ "application/json": {
348
+ schema: {
349
+ items: {
350
+ $ref: "#/components/schemas/Product"
351
+ },
352
+ type: "array"
353
+ }
354
+ }
355
+ },
356
+ required: true
357
+ },
358
+ responses: {
359
+ "200": {
360
+ description: "Success"
361
+ }
362
+ },
363
+ tags: ["Controller"]
364
+ }
365
+ }
366
+ },
367
+ tags: [
368
+ {
369
+ name: "Controller"
370
+ }
371
+ ]
372
+ });
373
+ });
374
+ it("should declare all schema correctly (Array - inline - number - OS3)", () => {
375
+ class Controller {
376
+ @Consumes("application/json")
377
+ @OperationPath("POST", "/")
378
+ method(@In("body") products: number[]) {}
379
+ }
380
+
381
+ // THEN
382
+ const spec = getSpec(Controller, {specType: SpecTypes.OPENAPI});
383
+
384
+ expect(spec).toEqual({
385
+ paths: {
386
+ "/": {
387
+ post: {
388
+ operationId: "controllerMethod",
389
+ parameters: [],
390
+ requestBody: {
391
+ content: {
392
+ "application/json": {
393
+ schema: {
394
+ type: "array",
395
+ items: {
396
+ type: "object"
397
+ }
398
+ }
399
+ }
400
+ },
401
+ required: false
402
+ },
403
+ responses: {
404
+ "200": {
405
+ description: "Success"
406
+ }
407
+ },
408
+ tags: ["Controller"]
409
+ }
410
+ }
411
+ },
412
+ tags: [
413
+ {
414
+ name: "Controller"
415
+ }
416
+ ]
417
+ });
418
+ });
419
+ it("should declare all schema correctly (inline - openspec3)", async () => {
420
+ class Controller {
421
+ @Consumes("application/json")
422
+ @OperationPath("POST", "/")
423
+ method(
424
+ @In("body") @Required() @Name("num") @CollectionOf(Number) @Min(0) num: number[],
425
+ @In("body") @Required() @Name("test") @Min(0) num2: number
426
+ ) {}
427
+ }
428
+
429
+ // THEN
430
+ const spec = getSpec(Controller, {specType: SpecTypes.OPENAPI});
431
+ expect(await validateSpec(spec, SpecTypes.OPENAPI)).toBe(true);
432
+ expect(spec).toEqual({
433
+ tags: [
434
+ {
435
+ name: "Controller"
436
+ }
437
+ ],
438
+ paths: {
439
+ "/": {
440
+ post: {
441
+ operationId: "controllerMethod",
442
+ parameters: [],
443
+ requestBody: {
444
+ content: {
445
+ "application/json": {
446
+ schema: {
447
+ properties: {
448
+ num: {
449
+ items: {
450
+ minimum: 0,
451
+ type: "number"
452
+ },
453
+ type: "array"
454
+ },
455
+ test: {
456
+ minimum: 0,
457
+ type: "number"
458
+ }
459
+ },
460
+ required: ["num", "test"],
461
+ type: "object"
462
+ }
463
+ }
464
+ },
465
+ required: true
466
+ },
467
+ responses: {
468
+ "200": {
469
+ description: "Success"
470
+ }
471
+ },
472
+ tags: ["Controller"]
473
+ }
474
+ }
475
+ }
476
+ });
477
+ });
478
+ });
479
+ describe("Cookies", () => {
480
+ it("should declare all schema correctly (OS3)", () => {
481
+ class Controller {
482
+ @Consumes("application/json")
483
+ @OperationPath("POST", "/")
484
+ method(@In(JsonParameterTypes.COOKIES) @Name("hello") @Required() hello: string) {}
485
+ }
486
+
487
+ // THEN
488
+ const spec = getSpec(Controller, {specType: SpecTypes.OPENAPI});
489
+
490
+ expect(spec).toEqual({
491
+ tags: [
492
+ {
493
+ name: "Controller"
494
+ }
495
+ ],
496
+ paths: {
497
+ "/": {
498
+ post: {
499
+ operationId: "controllerMethod",
500
+ parameters: [
501
+ {
502
+ in: "cookie",
503
+ name: "hello",
504
+ required: true,
505
+ schema: {
506
+ minLength: 1,
507
+ type: "string"
508
+ }
509
+ }
510
+ ],
511
+ tags: ["Controller"],
512
+ responses: {
513
+ "200": {
514
+ description: "Success"
515
+ }
516
+ }
517
+ }
518
+ }
519
+ }
520
+ });
521
+ });
522
+ });
523
+ });
524
+ describe("Response", () => {
525
+ it("should declare all schema correctly (openspec3)", () => {
526
+ // WHEN
527
+ class Controller {
528
+ @OperationPath("POST", "/")
529
+ @(Returns(200, String).Description("description"))
530
+ method() {}
531
+ }
532
+
533
+ // THEN
534
+ const spec = getSpec(Controller, {specType: SpecTypes.OPENAPI});
535
+
536
+ expect(spec).toEqual({
537
+ tags: [
538
+ {
539
+ name: "Controller"
540
+ }
541
+ ],
542
+ paths: {
543
+ "/": {
544
+ post: {
545
+ operationId: "controllerMethod",
546
+ parameters: [],
547
+ tags: ["Controller"],
548
+ responses: {
549
+ "200": {
550
+ content: {
551
+ "*/*": {
552
+ schema: {
553
+ type: "string"
554
+ }
555
+ }
556
+ },
557
+ description: "description"
558
+ }
559
+ }
560
+ }
561
+ }
562
+ }
563
+ });
564
+ });
565
+ it("should declare an Array of string (openspec3)", () => {
566
+ // WHEN
567
+ class Controller {
568
+ @OperationPath("POST", "/")
569
+ @(Returns(200, Array).Of(String).Description("description"))
570
+ method() {}
571
+ }
572
+
573
+ // THEN
574
+ const spec = getSpec(Controller, {specType: SpecTypes.OPENAPI});
575
+
576
+ expect(spec).toEqual({
577
+ tags: [
578
+ {
579
+ name: "Controller"
580
+ }
581
+ ],
582
+ paths: {
583
+ "/": {
584
+ post: {
585
+ operationId: "controllerMethod",
586
+ parameters: [],
587
+ tags: ["Controller"],
588
+ responses: {
589
+ "200": {
590
+ content: {
591
+ "application/json": {
592
+ schema: {
593
+ items: {
594
+ type: "string"
595
+ },
596
+ type: "array"
597
+ }
598
+ }
599
+ },
600
+ description: "description"
601
+ }
602
+ }
603
+ }
604
+ }
605
+ }
606
+ });
607
+ });
608
+ });
609
+ });
610
+ });