@tsed/schema 8.0.1 → 8.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/package.json +11 -10
  2. package/readme.md +6 -6
  3. package/src/components/async-api/channelsMapper.ts +81 -0
  4. package/src/components/async-api/generate.ts +24 -0
  5. package/src/components/async-api/messageMapper.ts +62 -0
  6. package/src/components/async-api/payloadMapper.ts +61 -0
  7. package/src/components/async-api/responseMapper.ts +70 -0
  8. package/src/components/default/anyMapper.spec.ts +7 -0
  9. package/src/components/default/anyMapper.ts +33 -0
  10. package/src/components/default/classMapper.ts +55 -0
  11. package/src/components/default/discriminatorMappingMapper.ts +36 -0
  12. package/src/components/default/enumsMapper.spec.ts +64 -0
  13. package/src/components/default/enumsMapper.ts +17 -0
  14. package/src/components/default/genericsMapper.ts +70 -0
  15. package/src/components/default/inheritedClassMapper.ts +24 -0
  16. package/src/components/default/itemMapper.ts +8 -0
  17. package/src/components/default/lazyRefMapper.ts +21 -0
  18. package/src/components/default/mapMapper.ts +25 -0
  19. package/src/components/default/nullableMapper.ts +55 -0
  20. package/src/components/default/objectMapper.ts +36 -0
  21. package/src/components/default/ofMapper.ts +16 -0
  22. package/src/components/default/propertiesMapper.ts +25 -0
  23. package/src/components/default/requiredMapper.ts +69 -0
  24. package/src/components/default/schemaMapper.ts +151 -0
  25. package/src/components/index.ts +36 -0
  26. package/src/components/open-spec/discriminatorMappingMapper.ts +7 -0
  27. package/src/components/open-spec/enumsMapper.ts +20 -0
  28. package/src/components/open-spec/generate.ts +29 -0
  29. package/src/components/open-spec/nullableMapper.ts +51 -0
  30. package/src/components/open-spec/operationInFilesMapper.ts +32 -0
  31. package/src/components/open-spec/operationInParameterMapper.ts +56 -0
  32. package/src/components/open-spec/operationInParametersMapper.ts +9 -0
  33. package/src/components/open-spec/operationInQueryMapper.ts +74 -0
  34. package/src/components/open-spec/operationMapper.ts +65 -0
  35. package/src/components/open-spec/operationMediaMapper.ts +11 -0
  36. package/src/components/open-spec/operationRequestBodyMapper.ts +82 -0
  37. package/src/components/open-spec/operationResponseMapper.ts +26 -0
  38. package/src/components/open-spec/pathsMapper.ts +132 -0
  39. package/src/constants/OperationVerbs.ts +29 -0
  40. package/src/constants/httpStatusMessages.ts +21 -0
  41. package/src/constants/jsonSchemaProperties.ts +17 -0
  42. package/src/decorators/class/children.ts +22 -0
  43. package/src/decorators/class/discriminatorValue.ts +53 -0
  44. package/src/decorators/collections/collectionContains.ts +25 -0
  45. package/src/decorators/collections/collectionOf.spec.ts +327 -0
  46. package/src/decorators/collections/collectionOf.ts +182 -0
  47. package/src/decorators/collections/maxItems.spec.ts +40 -0
  48. package/src/decorators/collections/maxItems.ts +59 -0
  49. package/src/decorators/collections/maxProperties.spec.ts +109 -0
  50. package/src/decorators/collections/maxProperties.ts +82 -0
  51. package/src/decorators/collections/minItems.spec.ts +40 -0
  52. package/src/decorators/collections/minItems.ts +63 -0
  53. package/src/decorators/collections/minProperties.spec.ts +109 -0
  54. package/src/decorators/collections/minProperties.ts +81 -0
  55. package/src/decorators/collections/uniqueItems.spec.ts +28 -0
  56. package/src/decorators/collections/uniqueItems.ts +59 -0
  57. package/src/decorators/common/__snapshots__/groups.spec.ts.snap +321 -0
  58. package/src/decorators/common/additionalProperties.spec.ts +133 -0
  59. package/src/decorators/common/additionalProperties.ts +17 -0
  60. package/src/decorators/common/allOf.spec.ts +276 -0
  61. package/src/decorators/common/allOf.ts +19 -0
  62. package/src/decorators/common/allow.spec.ts +130 -0
  63. package/src/decorators/common/allow.ts +50 -0
  64. package/src/decorators/common/any.spec.ts +109 -0
  65. package/src/decorators/common/any.ts +45 -0
  66. package/src/decorators/common/anyOf.spec.ts +270 -0
  67. package/src/decorators/common/anyOf.ts +23 -0
  68. package/src/decorators/common/const.spec.ts +98 -0
  69. package/src/decorators/common/const.ts +68 -0
  70. package/src/decorators/common/customKey.spec.ts +105 -0
  71. package/src/decorators/common/customKey.ts +39 -0
  72. package/src/decorators/common/default.spec.ts +25 -0
  73. package/src/decorators/common/default.ts +47 -0
  74. package/src/decorators/common/defaultMsg.spec.ts +22 -0
  75. package/src/decorators/common/defaultMsg.ts +38 -0
  76. package/src/decorators/common/description.spec.ts +166 -0
  77. package/src/decorators/common/description.ts +77 -0
  78. package/src/decorators/common/discriminatorKey.ts +14 -0
  79. package/src/decorators/common/enum.spec.ts +305 -0
  80. package/src/decorators/common/enum.ts +111 -0
  81. package/src/decorators/common/errorMsg.spec.ts +57 -0
  82. package/src/decorators/common/errorMsg.ts +14 -0
  83. package/src/decorators/common/example.spec.ts +93 -0
  84. package/src/decorators/common/example.ts +18 -0
  85. package/src/decorators/common/examples.spec.ts +101 -0
  86. package/src/decorators/common/examples.ts +20 -0
  87. package/src/decorators/common/exclusiveMaximum.spec.ts +47 -0
  88. package/src/decorators/common/exclusiveMaximum.ts +75 -0
  89. package/src/decorators/common/exclusiveMinimum.spec.ts +47 -0
  90. package/src/decorators/common/exclusiveMinimum.ts +75 -0
  91. package/src/decorators/common/format.spec.ts +149 -0
  92. package/src/decorators/common/format.ts +486 -0
  93. package/src/decorators/common/forwardGroups.spec.ts +270 -0
  94. package/src/decorators/common/forwardGroups.ts +16 -0
  95. package/src/decorators/common/groups.spec.ts +968 -0
  96. package/src/decorators/common/groups.ts +66 -0
  97. package/src/decorators/common/hidden.spec.ts +52 -0
  98. package/src/decorators/common/hidden.ts +36 -0
  99. package/src/decorators/common/ignore.spec.ts +88 -0
  100. package/src/decorators/common/ignore.ts +66 -0
  101. package/src/decorators/common/integer.spec.ts +110 -0
  102. package/src/decorators/common/integer.ts +69 -0
  103. package/src/decorators/common/jsonEntityFn.spec.ts +16 -0
  104. package/src/decorators/common/jsonEntityFn.ts +33 -0
  105. package/src/decorators/common/maxLength.spec.ts +61 -0
  106. package/src/decorators/common/maxLength.ts +88 -0
  107. package/src/decorators/common/maximum.spec.ts +73 -0
  108. package/src/decorators/common/maximum.ts +146 -0
  109. package/src/decorators/common/minLength.spec.ts +186 -0
  110. package/src/decorators/common/minLength.ts +89 -0
  111. package/src/decorators/common/minimum.spec.ts +74 -0
  112. package/src/decorators/common/minimum.ts +145 -0
  113. package/src/decorators/common/multipleOf.spec.ts +33 -0
  114. package/src/decorators/common/multipleOf.ts +80 -0
  115. package/src/decorators/common/name.spec.ts +56 -0
  116. package/src/decorators/common/name.ts +50 -0
  117. package/src/decorators/common/nullable.spec.ts +818 -0
  118. package/src/decorators/common/nullable.ts +32 -0
  119. package/src/decorators/common/oneOf.spec.ts +301 -0
  120. package/src/decorators/common/oneOf.ts +24 -0
  121. package/src/decorators/common/optional.spec.ts +43 -0
  122. package/src/decorators/common/optional.ts +26 -0
  123. package/src/decorators/common/pattern.spec.ts +27 -0
  124. package/src/decorators/common/pattern.ts +102 -0
  125. package/src/decorators/common/property.ts +24 -0
  126. package/src/decorators/common/readOnly.spec.ts +135 -0
  127. package/src/decorators/common/readOnly.ts +17 -0
  128. package/src/decorators/common/recordOf.spec.ts +41 -0
  129. package/src/decorators/common/recordOf.ts +59 -0
  130. package/src/decorators/common/required.spec.ts +188 -0
  131. package/src/decorators/common/required.ts +50 -0
  132. package/src/decorators/common/requiredGroups.spec.ts +127 -0
  133. package/src/decorators/common/requiredGroups.ts +23 -0
  134. package/src/decorators/common/schema.spec.ts +23 -0
  135. package/src/decorators/common/schema.ts +64 -0
  136. package/src/decorators/common/title.spec.ts +20 -0
  137. package/src/decorators/common/title.ts +45 -0
  138. package/src/decorators/common/typeError.spec.ts +22 -0
  139. package/src/decorators/common/typeError.ts +15 -0
  140. package/src/decorators/common/writeOnly.spec.ts +105 -0
  141. package/src/decorators/common/writeOnly.ts +17 -0
  142. package/src/decorators/config/jsonEntityComponent.ts +16 -0
  143. package/src/decorators/generics/genericOf.spec.ts +246 -0
  144. package/src/decorators/generics/genericOf.ts +112 -0
  145. package/src/decorators/generics/generics.ts +22 -0
  146. package/src/decorators/operations/acceptMime.spec.ts +39 -0
  147. package/src/decorators/operations/acceptMime.ts +25 -0
  148. package/src/decorators/operations/consumes.spec.ts +89 -0
  149. package/src/decorators/operations/consumes.ts +37 -0
  150. package/src/decorators/operations/contentType.spec.ts +40 -0
  151. package/src/decorators/operations/contentType.ts +24 -0
  152. package/src/decorators/operations/deprecated.spec.ts +223 -0
  153. package/src/decorators/operations/deprecated.ts +49 -0
  154. package/src/decorators/operations/header.spec.ts +214 -0
  155. package/src/decorators/operations/header.ts +62 -0
  156. package/src/decorators/operations/in.spec.ts +321 -0
  157. package/src/decorators/operations/in.ts +141 -0
  158. package/src/decorators/operations/inFile.spec.ts +209 -0
  159. package/src/decorators/operations/inFile.ts +55 -0
  160. package/src/decorators/operations/location.spec.ts +51 -0
  161. package/src/decorators/operations/location.ts +26 -0
  162. package/src/decorators/operations/operation.ts +119 -0
  163. package/src/decorators/operations/operationId.spec.ts +43 -0
  164. package/src/decorators/operations/operationId.ts +22 -0
  165. package/src/decorators/operations/operationPath.spec.ts +42 -0
  166. package/src/decorators/operations/operationPath.ts +33 -0
  167. package/src/decorators/operations/partial.spec.ts +249 -0
  168. package/src/decorators/operations/partial.ts +14 -0
  169. package/src/decorators/operations/path.spec.ts +47 -0
  170. package/src/decorators/operations/path.ts +27 -0
  171. package/src/decorators/operations/produces.spec.ts +89 -0
  172. package/src/decorators/operations/produces.ts +44 -0
  173. package/src/decorators/operations/publish.spec.ts +26 -0
  174. package/src/decorators/operations/publish.ts +6 -0
  175. package/src/decorators/operations/redirect.spec.ts +146 -0
  176. package/src/decorators/operations/redirect.ts +82 -0
  177. package/src/decorators/operations/returns.spec.ts +1393 -0
  178. package/src/decorators/operations/returns.ts +662 -0
  179. package/src/decorators/operations/route.spec.ts +211 -0
  180. package/src/decorators/operations/route.ts +154 -0
  181. package/src/decorators/operations/security.spec.ts +162 -0
  182. package/src/decorators/operations/security.ts +83 -0
  183. package/src/decorators/operations/status.spec.ts +582 -0
  184. package/src/decorators/operations/status.ts +130 -0
  185. package/src/decorators/operations/subscribe.spec.ts +32 -0
  186. package/src/decorators/operations/subscribe.ts +6 -0
  187. package/src/decorators/operations/summary.spec.ts +45 -0
  188. package/src/decorators/operations/summary.ts +32 -0
  189. package/src/decorators/operations/tags.spec.ts +113 -0
  190. package/src/decorators/operations/tags.ts +53 -0
  191. package/src/decorators/operations/view.spec.ts +16 -0
  192. package/src/decorators/operations/view.ts +27 -0
  193. package/src/domain/DecoratorContext.ts +116 -0
  194. package/src/domain/JsonAliasMap.ts +19 -0
  195. package/src/domain/JsonClassStore.ts +35 -0
  196. package/src/domain/JsonDiscriminator.spec.ts +65 -0
  197. package/src/domain/JsonDiscriminator.ts +52 -0
  198. package/src/domain/JsonEntityStore.spec.ts +277 -0
  199. package/src/domain/JsonEntityStore.ts +284 -0
  200. package/src/domain/JsonFormatTypes.ts +17 -0
  201. package/src/domain/JsonLazyRef.ts +21 -0
  202. package/src/domain/JsonMap.spec.ts +15 -0
  203. package/src/domain/JsonMap.ts +33 -0
  204. package/src/domain/JsonMedia.ts +24 -0
  205. package/src/domain/JsonMethodStore.spec.ts +301 -0
  206. package/src/domain/JsonMethodStore.ts +212 -0
  207. package/src/domain/JsonOperation.spec.ts +126 -0
  208. package/src/domain/JsonOperation.ts +219 -0
  209. package/src/domain/JsonOperationPathsMap.ts +16 -0
  210. package/src/domain/JsonOperationRoute.spec.ts +109 -0
  211. package/src/domain/JsonOperationRoute.ts +75 -0
  212. package/src/domain/JsonParameter.ts +70 -0
  213. package/src/domain/JsonParameterStore.spec.ts +212 -0
  214. package/src/domain/JsonParameterStore.ts +138 -0
  215. package/src/domain/JsonParameterTypes.spec.ts +12 -0
  216. package/src/domain/JsonParameterTypes.ts +20 -0
  217. package/src/domain/JsonPropertyStore.spec.ts +177 -0
  218. package/src/domain/JsonPropertyStore.ts +92 -0
  219. package/src/domain/JsonRequestBody.ts +47 -0
  220. package/src/domain/JsonResponse.spec.ts +33 -0
  221. package/src/domain/JsonResponse.ts +64 -0
  222. package/src/domain/JsonSchema.spec.ts +1470 -0
  223. package/src/domain/JsonSchema.ts +1049 -0
  224. package/src/domain/SpecTypes.ts +6 -0
  225. package/src/hooks/alterIgnore.ts +25 -0
  226. package/src/hooks/alterOneOf.ts +67 -0
  227. package/src/hooks/alterRequiredGroups.ts +12 -0
  228. package/src/index.ts +185 -0
  229. package/src/interfaces/IgnoreCallback.ts +5 -0
  230. package/src/interfaces/JsonHookContext.ts +18 -0
  231. package/src/interfaces/JsonOpenSpec.ts +7 -0
  232. package/src/interfaces/JsonSchemaOptions.ts +35 -0
  233. package/src/registries/JsonSchemaMapperContainer.ts +52 -0
  234. package/src/registries/enumRegistries.ts +3 -0
  235. package/src/utils/__snapshots__/generateSpec.spec.ts.snap +109 -0
  236. package/src/utils/buildPath.ts +8 -0
  237. package/src/utils/concatParameters.ts +12 -0
  238. package/src/utils/concatPath.spec.ts +23 -0
  239. package/src/utils/concatPath.ts +24 -0
  240. package/src/utils/defineStatusModel.ts +11 -0
  241. package/src/utils/from.spec.ts +243 -0
  242. package/src/utils/from.ts +281 -0
  243. package/src/utils/generateSpec.spec.ts +1262 -0
  244. package/src/utils/generateSpec.ts +54 -0
  245. package/src/utils/generics.ts +83 -0
  246. package/src/utils/getComputedType.spec.ts +45 -0
  247. package/src/utils/getComputedType.ts +39 -0
  248. package/src/utils/getInheritedStores.spec.ts +47 -0
  249. package/src/utils/getInheritedStores.ts +23 -0
  250. package/src/utils/getJsonEntityStore.ts +36 -0
  251. package/src/utils/getJsonPathParameters.spec.ts +126 -0
  252. package/src/utils/getJsonPathParameters.ts +97 -0
  253. package/src/utils/getJsonSchema.spec.ts +695 -0
  254. package/src/utils/getJsonSchema.ts +69 -0
  255. package/src/utils/getJsonType.spec.ts +28 -0
  256. package/src/utils/getJsonType.ts +46 -0
  257. package/src/utils/getOperationsRoutes.spec.ts +284 -0
  258. package/src/utils/getOperationsRoutes.ts +56 -0
  259. package/src/utils/getOperationsStore.spec.ts +47 -0
  260. package/src/utils/getOperationsStores.ts +37 -0
  261. package/src/utils/getPropertiesStores.spec.ts +138 -0
  262. package/src/utils/getPropertiesStores.ts +66 -0
  263. package/src/utils/getSpec.spec.ts +610 -0
  264. package/src/utils/getSpec.ts +117 -0
  265. package/src/utils/getSpecType.spec.ts +16 -0
  266. package/src/utils/getSpecType.ts +19 -0
  267. package/src/utils/isSuccessStatus.spec.ts +22 -0
  268. package/src/utils/isSuccessStatus.ts +2 -0
  269. package/src/utils/mapHeaders.spec.ts +57 -0
  270. package/src/utils/mapHeaders.ts +33 -0
  271. package/src/utils/mapOpenSpec.ts +44 -0
  272. package/src/utils/mapOpenSpec2.ts +50 -0
  273. package/src/utils/mapOpenSpec3.ts +25 -0
  274. package/src/utils/mapOpenSpecInfo.ts +19 -0
  275. package/src/utils/mapOperationOptions.ts +34 -0
  276. package/src/utils/matchGroups.spec.ts +85 -0
  277. package/src/utils/matchGroups.ts +64 -0
  278. package/src/utils/mergeSpec.spec.ts +533 -0
  279. package/src/utils/mergeSpec.ts +54 -0
  280. package/src/utils/operationIdFormatter.spec.ts +11 -0
  281. package/src/utils/operationIdFormatter.ts +49 -0
  282. package/src/utils/ref.ts +65 -0
  283. package/src/utils/removeHiddenOperation.ts +5 -0
  284. package/src/utils/serializeEnumValues.ts +27 -0
  285. package/src/utils/somethingOf.ts +11 -0
  286. package/src/utils/toJsonMapCollection.spec.ts +18 -0
  287. package/src/utils/toJsonMapCollection.ts +12 -0
  288. package/src/utils/toJsonRegex.ts +7 -0
  289. package/src/utils/transformToOS2.spec.ts +177 -0
  290. package/src/utils/transformToOS2.ts +607 -0
  291. package/src/utils/withErrorMsg.spec.ts +16 -0
  292. package/src/utils/withErrorMsg.ts +56 -0
@@ -0,0 +1,82 @@
1
+ import {withErrorMsg} from "../../utils/withErrorMsg.js";
2
+ import {JsonEntityFn} from "../common/jsonEntityFn.js";
3
+
4
+ /**
5
+ * An object instance is valid against `maxProperties` if its number of properties is less than, or equal to, the value of this keyword.
6
+ *
7
+ * ::: warning
8
+ * The value of this keyword MUST be a non-negative integer.
9
+ * :::
10
+ *
11
+ * ::: warning
12
+ * This decorator will be removed in v7.
13
+ * For v6 user, use @@MaxProperties@@ from @tsed/schema instead of @tsed/platform-http.
14
+ * :::
15
+ *
16
+ * ## Example
17
+ * ### On prop
18
+ * ```typescript
19
+ * class Model {
20
+ * @MaxProperties(10)
21
+ * property: any;
22
+ * }
23
+ * ```
24
+ *
25
+ * Will produce:
26
+ *
27
+ * ```json
28
+ * {
29
+ * "type": "object",
30
+ * "properties": {
31
+ * "property": {
32
+ * "type": "any",
33
+ * "maxProperties": 10
34
+ * }
35
+ * }
36
+ * }
37
+ * ```
38
+ *
39
+ * ### On class
40
+ *
41
+ * ```typescript
42
+ * @MaxProperties(10)
43
+ * class Model {
44
+ * }
45
+ * ```
46
+ *
47
+ * Will produce:
48
+ *
49
+ * ```json
50
+ * {
51
+ * "type": "object",
52
+ * "maxProperties": 10
53
+ * }
54
+ * ```
55
+ *
56
+ * ### On Parameter
57
+ *
58
+ * ```typescript
59
+ *
60
+ * class Model {
61
+ * method(@Any() @MaxProperties(10) obj: any){}
62
+ * }
63
+ * ```
64
+ *
65
+ * @param {number} maxProperties The maximum properties allowed on the given object
66
+ * @decorator
67
+ * @validation
68
+ * @swagger
69
+ * @schema
70
+ * @input
71
+ * @collections
72
+ * @ajv-errors
73
+ */
74
+ export const MaxProperties = withErrorMsg("maxProperties", (maxProperties: number) => {
75
+ if (maxProperties < 0) {
76
+ throw new Error("The value of maxProperties MUST be a non-negative integer.");
77
+ }
78
+
79
+ return JsonEntityFn((store) => {
80
+ store.isCollection ? store.schema.maxProperties(maxProperties) : store.itemSchema.maxProperties(maxProperties);
81
+ });
82
+ });
@@ -0,0 +1,40 @@
1
+ import {getJsonSchema} from "../../utils/getJsonSchema.js";
2
+ import {CollectionOf} from "./collectionOf.js";
3
+ import {MinItems} from "./minItems.js";
4
+
5
+ describe("@MinItems", () => {
6
+ it("should declare a prop", () => {
7
+ // WHEN
8
+ class Model {
9
+ @CollectionOf(Number)
10
+ @MinItems(10)
11
+ num: number[];
12
+ }
13
+
14
+ // THEN
15
+ expect(getJsonSchema(Model)).toEqual({
16
+ properties: {
17
+ num: {
18
+ items: {
19
+ type: "number"
20
+ },
21
+ minItems: 10,
22
+ type: "array"
23
+ }
24
+ },
25
+ type: "object"
26
+ });
27
+ });
28
+ it("should throw error", () => {
29
+ // WHEN
30
+ let actualError: any;
31
+ try {
32
+ MinItems(-1);
33
+ } catch (er) {
34
+ actualError = er;
35
+ }
36
+
37
+ // THEN
38
+ expect(actualError.message).toBe("The value of minItems MUST be a non-negative integer.");
39
+ });
40
+ });
@@ -0,0 +1,63 @@
1
+ import {withErrorMsg} from "../../utils/withErrorMsg.js";
2
+ import {JsonEntityFn} from "../common/jsonEntityFn.js";
3
+
4
+ /**
5
+ * An array instance is valid against `minItems` if its size is greater than, or equal to, the value of this keyword.
6
+ *
7
+ * ::: warning
8
+ * The value `minItems` MUST be a non-negative integer.
9
+ * :::
10
+ *
11
+ * ::: tip
12
+ * Omitting this keyword has the same behavior as a value of 0.
13
+ * :::
14
+ *
15
+ * ::: warning
16
+ * For v6 user, use @@MinItems@@ from @tsed/schema instead of @tsed/platform-http.
17
+ * :::
18
+ *
19
+ * ## Example
20
+ *
21
+ * ```typescript
22
+ * class Model {
23
+ * @CollectionOf(String)
24
+ * @MinItems(10)
25
+ * property: string[];
26
+ * }
27
+ * ```
28
+ *
29
+ * Will produce:
30
+ *
31
+ * ```json
32
+ * {
33
+ * "type": "object",
34
+ * "properties": {
35
+ * "property": {
36
+ * "type": "array",
37
+ * "minItems": 10,
38
+ * "items": {
39
+ * "type": "string"
40
+ * }
41
+ * }
42
+ * }
43
+ * }
44
+ * ```
45
+ *
46
+ * @param {number} minItems
47
+ * @decorator
48
+ * @validation
49
+ * @swagger
50
+ * @schema
51
+ * @input
52
+ * @collections
53
+ * @ajv-errors
54
+ */
55
+ export const MinItems = withErrorMsg("minItems", (minItems: number) => {
56
+ if (minItems < 0) {
57
+ throw new Error("The value of minItems MUST be a non-negative integer.");
58
+ }
59
+
60
+ return JsonEntityFn((storedJson) => {
61
+ storedJson.schema.minItems(minItems);
62
+ });
63
+ });
@@ -0,0 +1,109 @@
1
+ import {SpecTypes} from "../../domain/SpecTypes.js";
2
+ import {getJsonSchema} from "../../utils/getJsonSchema.js";
3
+ import {getSpec} from "../../utils/getSpec.js";
4
+ import {In} from "../operations/in.js";
5
+ import {OperationPath} from "../operations/operationPath.js";
6
+ import {MinProperties} from "./minProperties.js";
7
+
8
+ describe("@MinProperties", () => {
9
+ it("should declare min value (any)", () => {
10
+ // WHEN
11
+ class Model {
12
+ @MinProperties(10)
13
+ prop: any;
14
+ }
15
+
16
+ // THEN
17
+ expect(getJsonSchema(Model)).toEqual({
18
+ properties: {
19
+ prop: {
20
+ minProperties: 10,
21
+ type: "object"
22
+ }
23
+ },
24
+ type: "object"
25
+ });
26
+ });
27
+ it("should declare min value (Map<any>)", () => {
28
+ // WHEN
29
+ class Model {
30
+ @MinProperties(10)
31
+ prop: Map<string, any>;
32
+ }
33
+
34
+ // THEN
35
+ expect(getJsonSchema(Model)).toEqual({
36
+ properties: {
37
+ prop: {
38
+ minProperties: 10,
39
+ type: "object"
40
+ }
41
+ },
42
+ type: "object"
43
+ });
44
+ });
45
+ it("should declare min value on class", () => {
46
+ // WHEN
47
+ @MinProperties(10)
48
+ class Model {}
49
+
50
+ // THEN
51
+ expect(getJsonSchema(Model)).toEqual({
52
+ minProperties: 10,
53
+ type: "object"
54
+ });
55
+ });
56
+ it("should declare min value on param", () => {
57
+ // WHEN
58
+ class MyController {
59
+ @OperationPath("POST", "/")
60
+ method(@In("body") @MinProperties(10) test: any) {}
61
+ }
62
+
63
+ // THEN
64
+ expect(getSpec(MyController, {specType: SpecTypes.OPENAPI})).toEqual({
65
+ paths: {
66
+ "/": {
67
+ post: {
68
+ operationId: "myControllerMethod",
69
+ parameters: [],
70
+ requestBody: {
71
+ content: {
72
+ "application/json": {
73
+ schema: {
74
+ minProperties: 10,
75
+ type: "object"
76
+ }
77
+ }
78
+ },
79
+ required: false
80
+ },
81
+ responses: {
82
+ "200": {
83
+ description: "Success"
84
+ }
85
+ },
86
+ tags: ["MyController"]
87
+ }
88
+ }
89
+ },
90
+ tags: [
91
+ {
92
+ name: "MyController"
93
+ }
94
+ ]
95
+ });
96
+ });
97
+ it("should throw an error when the given parameters is as negative integer", () => {
98
+ // WHEN
99
+ let actualError: any;
100
+ try {
101
+ MinProperties(-1);
102
+ } catch (er) {
103
+ actualError = er;
104
+ }
105
+
106
+ // THEN
107
+ expect(actualError.message).toBe("The value of minProperties MUST be a non-negative integer.");
108
+ });
109
+ });
@@ -0,0 +1,81 @@
1
+ import {withErrorMsg} from "../../utils/withErrorMsg.js";
2
+ import {JsonEntityFn} from "../common/jsonEntityFn.js";
3
+
4
+ /**
5
+ * An object instance is valid against `minProperties` if its number of properties is less than, or equal to, the value of this keyword.
6
+ *
7
+ * ::: warning
8
+ * The value of this keyword MUST be a non-negative integer.
9
+ * :::
10
+ *
11
+ * ::: warning
12
+ * For v6 user, use @@MinProperties@@ from @tsed/schema instead of @tsed/platform-http.
13
+ * :::
14
+ *
15
+ * ## Example
16
+ * ### On prop
17
+ * ```typescript
18
+ * class Model {
19
+ * @MinProperties(10)
20
+ * property: any;
21
+ * }
22
+ * ```
23
+ *
24
+ * Will produce:
25
+ *
26
+ * ```json
27
+ * {
28
+ * "type": "object",
29
+ * "properties": {
30
+ * "property": {
31
+ * "type": "any",
32
+ * "minProperties": 10
33
+ * }
34
+ * }
35
+ * }
36
+ * ```
37
+ *
38
+ * ### On class
39
+ *
40
+ * ```typescript
41
+ * @MinProperties(10)
42
+ * class Model {
43
+ * }
44
+ * ```
45
+ *
46
+ * Will produce:
47
+ *
48
+ * ```json
49
+ * {
50
+ * "type": "object",
51
+ * "minProperties": 10
52
+ * }
53
+ * ```
54
+ *
55
+ * ### On Parameter
56
+ *
57
+ * ```typescript
58
+ *
59
+ * class Model {
60
+ * method(@Any() @MinProperties(10) obj: any){}
61
+ * }
62
+ * ```
63
+ *
64
+ * @param {number} minProperties The minimum properties allowed on the object.
65
+ * @decorator
66
+ * @validation
67
+ * @swagger
68
+ * @schema
69
+ * @input
70
+ * @collections
71
+ * @ajv-errors
72
+ */
73
+ export const MinProperties = withErrorMsg("minProperties", (minProperties: number) => {
74
+ if (minProperties < 0) {
75
+ throw new Error("The value of minProperties MUST be a non-negative integer.");
76
+ }
77
+
78
+ return JsonEntityFn((store) => {
79
+ store.isCollection ? store.schema.minProperties(minProperties) : store.itemSchema.minProperties(minProperties);
80
+ });
81
+ });
@@ -0,0 +1,28 @@
1
+ import {getJsonSchema} from "../../utils/getJsonSchema.js";
2
+ import {CollectionOf} from "./collectionOf.js";
3
+ import {UniqueItems} from "./uniqueItems.js";
4
+
5
+ describe("@UniqueItems", () => {
6
+ it("should declare a prop", () => {
7
+ // WHEN
8
+ class Model {
9
+ @CollectionOf(Number)
10
+ @UniqueItems(true)
11
+ num: number[];
12
+ }
13
+
14
+ // THEN
15
+ expect(getJsonSchema(Model)).toEqual({
16
+ properties: {
17
+ num: {
18
+ items: {
19
+ type: "number"
20
+ },
21
+ uniqueItems: true,
22
+ type: "array"
23
+ }
24
+ },
25
+ type: "object"
26
+ });
27
+ });
28
+ });
@@ -0,0 +1,59 @@
1
+ import {JsonEntityStore} from "../../domain/JsonEntityStore.js";
2
+ import {withErrorMsg} from "../../utils/withErrorMsg.js";
3
+ import {JsonEntityFn} from "../common/jsonEntityFn.js";
4
+
5
+ /**
6
+ * If this keyword has boolean value false, the instance validates successfully. If it has boolean value true, the instance validates successfully if all of its elements are unique.
7
+ *
8
+ * ::: warning
9
+ * For v6 user, use @@UniqueItems@@ from @tsed/schema instead of @tsed/platform-http.
10
+ * :::
11
+ *
12
+ * ## Example
13
+ *
14
+ * ```typescript
15
+ * class Model {
16
+ * @UniqueItems() // default true
17
+ * property: number[];
18
+ * }
19
+ * ```
20
+ *
21
+ * * ```typescript
22
+ * class Model {
23
+ * @CollectionOf(String)
24
+ * @UniqueItems()
25
+ * property: string[];
26
+ * }
27
+ * ```
28
+ *
29
+ * Will produce:
30
+ *
31
+ * ```json
32
+ * {
33
+ * "type": "object",
34
+ * "properties": {
35
+ * "property": {
36
+ * "type": "array",
37
+ * "uniqueItems": true,
38
+ * "items": {
39
+ * "type": "string"
40
+ * }
41
+ * }
42
+ * }
43
+ * }
44
+ * ```
45
+ *
46
+ * @param {boolean} uniqueItems
47
+ * @decorator
48
+ * @validation
49
+ * @swagger
50
+ * @schema
51
+ * @input
52
+ * @collections
53
+ * @ajv-errors
54
+ */
55
+ export const UniqueItems = withErrorMsg("uniqueItems", (uniqueItems: boolean = true) => {
56
+ return JsonEntityFn((store: JsonEntityStore) => {
57
+ store.schema.uniqueItems(uniqueItems);
58
+ });
59
+ });