@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 {DecoratorTypes, isArray} from "@tsed/core";
2
+
3
+ import type {JsonClassStore} from "../../domain/JsonClassStore.js";
4
+ import type {JsonParameterStore} from "../../domain/JsonParameterStore.js";
5
+ import {matchGroups} from "../../utils/matchGroups.js";
6
+ import {CustomKey} from "./customKey.js";
7
+ import {JsonEntityFn} from "./jsonEntityFn.js";
8
+
9
+ /**
10
+ * @ignore
11
+ */
12
+ function groupsClass(groups: any, entity: JsonClassStore) {
13
+ const entries: [string, string[]][] = Object.entries(groups[0]);
14
+
15
+ entity.children.forEach((propEntity) => {
16
+ const groups = entries.filter(([, props]) => props.includes(propEntity.propertyName)).map(([key]) => key);
17
+ const decorator: any = Groups(...groups);
18
+
19
+ decorator(propEntity.target, propEntity.propertyKey);
20
+ });
21
+ }
22
+
23
+ /**
24
+ * Apply groups validation strategy
25
+ *
26
+ * @decorator
27
+ * @validation
28
+ * @swagger
29
+ * @schema
30
+ * @input
31
+ */
32
+ export function Groups<T>(groupsDefinition: Record<string, (keyof T)[]>): ClassDecorator;
33
+ export function Groups<T>(groupName: string, groups: string[]): ParameterDecorator;
34
+ export function Groups(...groups: string[]): Function;
35
+ export function Groups(...groups: any): any {
36
+ return JsonEntityFn((entity) => {
37
+ switch (entity.decoratorType) {
38
+ case DecoratorTypes.CLASS:
39
+ groupsClass(groups, entity as JsonClassStore);
40
+ break;
41
+ case DecoratorTypes.PROP:
42
+ CustomKey("x-groups", groups)(entity.target, entity.propertyKey);
43
+ entity.schema.$hooks.on("groups", (prev: boolean, givenGroups: string[]) => {
44
+ if (!prev) {
45
+ if (matchGroups(groups, givenGroups)) {
46
+ return true;
47
+ }
48
+ }
49
+
50
+ return prev;
51
+ });
52
+ break;
53
+ case DecoratorTypes.PARAM:
54
+ let groupsName = "";
55
+
56
+ if (groups.length == 2 && isArray(groups[1])) {
57
+ groupsName = groups[0];
58
+ groups = groups[1];
59
+ }
60
+
61
+ (entity as JsonParameterStore).parameter.groups = groups;
62
+ (entity as JsonParameterStore).parameter.groupsName = groupsName;
63
+ break;
64
+ }
65
+ });
66
+ }
@@ -0,0 +1,52 @@
1
+ import {Get, getSpec, Path, SpecTypes} from "../../index.js";
2
+ import {getJsonSchema} from "../../utils/getJsonSchema.js";
3
+ import {Hidden} from "./hidden.js";
4
+
5
+ describe("@Hidden", () => {
6
+ it("should generate the right json schema", () => {
7
+ // WHEN
8
+ class Model {
9
+ @Hidden()
10
+ prop: number;
11
+ }
12
+
13
+ expect(getJsonSchema(Model)).toEqual({
14
+ type: "object"
15
+ });
16
+ });
17
+
18
+ it("should generate the right json schema (2)", () => {
19
+ // WHEN
20
+ @Path("/")
21
+ class Model {
22
+ @Hidden()
23
+ @Get("/hidden")
24
+ hidden() {}
25
+
26
+ @Get("/hidden")
27
+ method() {}
28
+ }
29
+
30
+ expect(getSpec(Model, {specType: SpecTypes.OPENAPI})).toEqual({
31
+ paths: {
32
+ "/hidden": {
33
+ get: {
34
+ operationId: "modelMethod",
35
+ parameters: [],
36
+ responses: {
37
+ "200": {
38
+ description: "Success"
39
+ }
40
+ },
41
+ tags: ["Model"]
42
+ }
43
+ }
44
+ },
45
+ tags: [
46
+ {
47
+ name: "Model"
48
+ }
49
+ ]
50
+ });
51
+ });
52
+ });
@@ -0,0 +1,36 @@
1
+ import {StoreSet} from "@tsed/core";
2
+
3
+ /**
4
+ * Disable documentation for the class and his endpoint.
5
+ *
6
+ * ````typescript
7
+ * @Controller('/')
8
+ * export class Ctrl {
9
+ *
10
+ * @Get('/')
11
+ * @Hidden()
12
+ * hiddenRoute(){
13
+ *
14
+ * }
15
+ * }
16
+ *
17
+ * @Controller('/')
18
+ * @Hidden()
19
+ * export class Ctrl {
20
+ * @Get('/')
21
+ * hiddenRoute() {
22
+ *
23
+ * }
24
+ * @Get('/2')
25
+ * hiddenRoute2() {
26
+ *
27
+ * }
28
+ * }
29
+ * ```
30
+ *
31
+ * @decorator
32
+ * @ignore
33
+ */
34
+ export function Hidden() {
35
+ return StoreSet("hidden", true);
36
+ }
@@ -0,0 +1,88 @@
1
+ import {getJsonSchema} from "../../utils/getJsonSchema.js";
2
+ import {Ignore} from "./ignore.js";
3
+ import {Property} from "./property.js";
4
+
5
+ describe("@Ignore", () => {
6
+ it("should declare prop", () => {
7
+ // WHEN
8
+ class Model {
9
+ @Ignore()
10
+ prop1: string;
11
+
12
+ @Property()
13
+ prop2: string;
14
+ }
15
+
16
+ expect(getJsonSchema(Model)).toEqual({
17
+ properties: {
18
+ prop2: {
19
+ type: "string"
20
+ }
21
+ },
22
+ type: "object"
23
+ });
24
+ });
25
+
26
+ it("should declare prop (boolean)", () => {
27
+ // WHEN
28
+ class Model {
29
+ @Ignore(true)
30
+ prop1: string;
31
+
32
+ @Property()
33
+ prop2: string;
34
+ }
35
+
36
+ expect(getJsonSchema(Model)).toEqual({
37
+ properties: {
38
+ prop2: {
39
+ type: "string"
40
+ }
41
+ },
42
+ type: "object"
43
+ });
44
+ });
45
+
46
+ it("should declare prop (with callback)", () => {
47
+ // WHEN
48
+ class Model {
49
+ @Ignore((value, ctx) => !ctx.endpoint)
50
+ prop1: string;
51
+
52
+ @Property()
53
+ prop2: string;
54
+ }
55
+
56
+ expect(getJsonSchema(Model)).toEqual({
57
+ properties: {
58
+ prop1: {
59
+ type: "string"
60
+ },
61
+ prop2: {
62
+ type: "string"
63
+ }
64
+ },
65
+ type: "object"
66
+ });
67
+ });
68
+
69
+ it("should ignore prop (with callback)", () => {
70
+ // WHEN
71
+ class Model {
72
+ @Ignore((value, ctx) => ctx.endpoint)
73
+ prop1: string;
74
+
75
+ @Property()
76
+ prop2: string;
77
+ }
78
+
79
+ expect(getJsonSchema(Model)).toEqual({
80
+ properties: {
81
+ prop2: {
82
+ type: "string"
83
+ }
84
+ },
85
+ type: "object"
86
+ });
87
+ });
88
+ });
@@ -0,0 +1,66 @@
1
+ import {IgnoreCallback} from "../../interfaces/IgnoreCallback.js";
2
+ import {JsonEntityFn} from "./jsonEntityFn.js";
3
+
4
+ /**
5
+ * Ignore the property when JsonMapper serialize the class to a Plain Object JavaScript.
6
+ *
7
+ * ::: warning
8
+ * Swagger will not generate documentation for the ignored property.
9
+ * :::
10
+ *
11
+ * ```typescript
12
+ * class User {
13
+ * @Ignore()
14
+ * _id: string;
15
+ *
16
+ * @Property()
17
+ * firstName: string;
18
+ *
19
+ * @Property()
20
+ * lastName: string;
21
+ *
22
+ * @Ignore((value, ctx) => !ctx.endpoint)
23
+ * password: string;
24
+ * }
25
+ * ```
26
+ *
27
+ * The controller:
28
+ * ```typescript
29
+ * import {Controller, BodyParams} from "@tsed/platform-http";
30
+ * import {Post} from "@tsed/schema";
31
+ * import {Person} from "../models/Person.js";
32
+ *
33
+ * @Controller("/")
34
+ * export class UsersCtrl {
35
+ * @Get("/")
36
+ * get(): User {
37
+ * const user = new User();
38
+ * user._id = "12345";
39
+ * user.firstName = "John";
40
+ * user.lastName = "Doe";
41
+ * user.password = "secretpassword";
42
+ * return
43
+ * }
44
+ * }
45
+ * ```
46
+ *
47
+ * The expected json object:
48
+ *
49
+ * ```json
50
+ * {
51
+ * "firstName": "John",
52
+ * "lastName": "Doe"
53
+ * }
54
+ * ```
55
+ * @param cb Callback to know if the property must be ignored
56
+ * @decorator
57
+ * @validation
58
+ * @swagger
59
+ * @schema
60
+ * @deprecated Since v7. Use @Groups decorator instead of and enable `jsonMapper.strictGroups` in your configuration.
61
+ */
62
+ export function Ignore(cb: boolean | IgnoreCallback = true) {
63
+ return JsonEntityFn((store) => {
64
+ store.schema.ignore(cb);
65
+ });
66
+ }
@@ -0,0 +1,110 @@
1
+ import {BodyParams} from "@tsed/platform-params";
2
+
3
+ import {validateSpec} from "../../../test/helpers/validateSpec.js";
4
+ import {SpecTypes} from "../../domain/SpecTypes.js";
5
+ import {getJsonSchema} from "../../utils/getJsonSchema.js";
6
+ import {getSpec} from "../../utils/getSpec.js";
7
+ import {OperationPath} from "../operations/operationPath.js";
8
+ import {Path} from "../operations/path.js";
9
+ import {Returns} from "../operations/returns.js";
10
+ import {Integer} from "./integer.js";
11
+
12
+ describe("@Integer", () => {
13
+ it("should generate the right json schema", () => {
14
+ // WHEN
15
+ class Model {
16
+ @Integer()
17
+ prop: number;
18
+ }
19
+
20
+ expect(getJsonSchema(Model)).toEqual({
21
+ properties: {
22
+ prop: {
23
+ multipleOf: 1,
24
+ type: "integer"
25
+ }
26
+ },
27
+ type: "object"
28
+ });
29
+ });
30
+
31
+ it("should generate the right json schema (array)", () => {
32
+ // WHEN
33
+ class Model {
34
+ @Integer()
35
+ prop: number[];
36
+ }
37
+
38
+ expect(getJsonSchema(Model)).toEqual({
39
+ properties: {
40
+ prop: {
41
+ items: {
42
+ multipleOf: 1,
43
+ type: "integer"
44
+ },
45
+ type: "array"
46
+ }
47
+ },
48
+ type: "object"
49
+ });
50
+ });
51
+
52
+ it("should generate the OS3", async () => {
53
+ @Path("/")
54
+ class TestIntegerCtrl {
55
+ @OperationPath("GET", "/")
56
+ @(Returns(200, Array).OfInteger())
57
+ async get(@BodyParams() @Integer() number: number[]) {}
58
+ }
59
+
60
+ const spec = getSpec(TestIntegerCtrl, {specType: SpecTypes.OPENAPI});
61
+
62
+ expect(spec).toEqual({
63
+ paths: {
64
+ "/": {
65
+ get: {
66
+ operationId: "testIntegerCtrlGet",
67
+ parameters: [],
68
+ requestBody: {
69
+ content: {
70
+ "application/json": {
71
+ schema: {
72
+ items: {
73
+ multipleOf: 1,
74
+ type: "integer"
75
+ },
76
+ type: "array"
77
+ }
78
+ }
79
+ },
80
+ required: false
81
+ },
82
+ responses: {
83
+ "200": {
84
+ content: {
85
+ "application/json": {
86
+ schema: {
87
+ items: {
88
+ multipleOf: 1,
89
+ type: "integer"
90
+ },
91
+ type: "array"
92
+ }
93
+ }
94
+ },
95
+ description: "Success"
96
+ }
97
+ },
98
+ tags: ["TestIntegerCtrl"]
99
+ }
100
+ }
101
+ },
102
+ tags: [
103
+ {
104
+ name: "TestIntegerCtrl"
105
+ }
106
+ ]
107
+ });
108
+ expect(await validateSpec(spec, SpecTypes.OPENAPI)).toBe(true);
109
+ });
110
+ });
@@ -0,0 +1,69 @@
1
+ import type {JSONSchema6} from "json-schema";
2
+
3
+ import {JsonEntityFn} from "./jsonEntityFn.js";
4
+
5
+ /**
6
+ * Set integer type.
7
+ *
8
+ * ::: warning
9
+ * For v6 user, use @@Integer@@ from @tsed/schema instead of @@Integer@@ from @tsed/platform-http.
10
+ * :::
11
+ *
12
+ * ## Example
13
+ *
14
+ * ```typescript
15
+ * class Model {
16
+ * @Integer()
17
+ * property: number;
18
+ * }
19
+ * ```
20
+ *
21
+ * Will produce:
22
+ *
23
+ * ```json
24
+ * {
25
+ * "type": "object",
26
+ * "properties": {
27
+ * "property": {
28
+ * "type": "integer"
29
+ * }
30
+ * }
31
+ * }
32
+ * ```
33
+ *
34
+ * ### With array of multiple types
35
+ *
36
+ * ```typescript
37
+ * class Model {
38
+ * @Integer()
39
+ * property: number[];
40
+ * }
41
+ * ```
42
+ *
43
+ * Will produce:
44
+ *
45
+ * ```json
46
+ * {
47
+ * "type": "object",
48
+ * "properties": {
49
+ * "property": {
50
+ * "type": "array",
51
+ * "items": {
52
+ * "type": "integer"
53
+ * }
54
+ * }
55
+ * }
56
+ * }
57
+ * ```
58
+ *
59
+ * @decorator
60
+ * @validation
61
+ * @swagger
62
+ * @schema
63
+ * @input
64
+ */
65
+ export function Integer() {
66
+ return JsonEntityFn((store) => {
67
+ store.itemSchema.type("integer");
68
+ });
69
+ }
@@ -0,0 +1,16 @@
1
+ import {JsonEntityFn} from "../../index.js";
2
+
3
+ describe("JsonSchemaStoreFn", () => {
4
+ it("should decorate property", () => {
5
+ const stub = vi.fn();
6
+
7
+ class Model {
8
+ @JsonEntityFn(() => {
9
+ return stub;
10
+ })
11
+ prop: string;
12
+ }
13
+
14
+ expect(stub).toHaveBeenCalledWith(Model.prototype, "prop", undefined);
15
+ });
16
+ });
@@ -0,0 +1,33 @@
1
+ import {DecoratorParameters} from "@tsed/core";
2
+
3
+ import type {JsonEntityStore} from "../../domain/JsonEntityStore.js";
4
+ import {getJsonEntityStore} from "../../utils/getJsonEntityStore.js";
5
+
6
+ /**
7
+ * Decorator util to compose another decorator. See @@Description@@ decorator implementation for more details.
8
+ *
9
+ * ## Usage
10
+ *
11
+ * ```typescript
12
+ * export function Description(description: any) {
13
+ * return JsonEntityFn((entity: JsonEntityStore, args: DecoratorParameters) => {
14
+ * entity.itemSchema.description(description)
15
+ * });
16
+ * }
17
+ * ```
18
+ *
19
+ * @param fn
20
+ * @decorator
21
+ * @utils
22
+ * @model
23
+ */
24
+ export function JsonEntityFn<T extends JsonEntityStore = JsonEntityStore>(
25
+ fn: (entity: T, parameters: DecoratorParameters) => any
26
+ ): (...args: any[]) => any {
27
+ return (...parameters: DecoratorParameters) => {
28
+ const result: any = fn(getJsonEntityStore<T>(...parameters) as T, parameters);
29
+ if (typeof result === "function") {
30
+ result(...parameters);
31
+ }
32
+ };
33
+ }
@@ -0,0 +1,61 @@
1
+ import {JsonEntityStore} from "../../domain/JsonEntityStore.js";
2
+ import {getJsonSchema} from "../../utils/getJsonSchema.js";
3
+ import {CollectionOf} from "../collections/collectionOf.js";
4
+ import {MaxLength} from "./maxLength.js";
5
+
6
+ describe("@MaxLength", () => {
7
+ it("should declare minimum value", () => {
8
+ // WHEN
9
+ class Model {
10
+ @MaxLength(0)
11
+ word: string;
12
+ }
13
+
14
+ // THEN
15
+ expect(getJsonSchema(Model)).toEqual({
16
+ properties: {
17
+ word: {
18
+ maxLength: 0,
19
+ type: "string"
20
+ }
21
+ },
22
+ type: "object"
23
+ });
24
+ });
25
+ it("should throw error", () => {
26
+ // WHEN
27
+ let actualError: any;
28
+ try {
29
+ MaxLength(-1);
30
+ } catch (er) {
31
+ actualError = er;
32
+ }
33
+
34
+ // THEN
35
+ expect(actualError.message).toBe("The value of maxLength MUST be a non-negative integer.");
36
+ });
37
+ it("should declare minimum value (collection)", () => {
38
+ // WHEN
39
+ class Model {
40
+ @MaxLength(0)
41
+ @CollectionOf(String)
42
+ words: string[];
43
+ }
44
+
45
+ // THEN
46
+ const classSchema = JsonEntityStore.from(Model);
47
+
48
+ expect(classSchema.schema.toJSON()).toEqual({
49
+ properties: {
50
+ words: {
51
+ type: "array",
52
+ items: {
53
+ maxLength: 0,
54
+ type: "string"
55
+ }
56
+ }
57
+ },
58
+ type: "object"
59
+ });
60
+ });
61
+ });
@@ -0,0 +1,88 @@
1
+ import {withErrorMsg} from "../../utils/withErrorMsg.js";
2
+ import {JsonEntityFn} from "./jsonEntityFn.js";
3
+
4
+ /**
5
+ * A string instance is valid against this keyword if its length is greater than, or equal to, the value of this keyword.
6
+ *
7
+ * The length of a string instance is defined as the number of its characters as defined by [RFC 7159](http://json-schema.org/latest/json-schema-validation.html#RFC7159).
8
+ *
9
+ * ::: warning
10
+ * The value of maxLength MUST be a non-negative integer.
11
+ * :::
12
+ *
13
+ * ::: tip
14
+ * Omitting this keyword has the same behavior as a value of 0.
15
+ * :::
16
+ *
17
+ * ::: warning
18
+ * For v6 user, use @@MaxLength@@ from @tsed/schema instead of @tsed/platform-http.
19
+ * :::
20
+ *
21
+ * ## Example
22
+ * ### With primitive type
23
+ *
24
+ * ```typescript
25
+ * class Model {
26
+ * @MaxLength(10)
27
+ * property: number;
28
+ * }
29
+ * ```
30
+ *
31
+ * Will produce:
32
+ *
33
+ * ```json
34
+ * {
35
+ * "type": "object",
36
+ * "properties": {
37
+ * "property": {
38
+ * "type": "string",
39
+ * "maxLength": 10
40
+ * }
41
+ * }
42
+ * }
43
+ * ```
44
+ *
45
+ * ### With array type
46
+ *
47
+ * ```typescript
48
+ * class Model {
49
+ * @MaxLength(10)
50
+ * @CollectionOf(String)
51
+ * property: string[];
52
+ * }
53
+ * ```
54
+ *
55
+ * Will produce:
56
+ *
57
+ * ```json
58
+ * {
59
+ * "type": "object",
60
+ * "properties": {
61
+ * "property": {
62
+ * "type": "array",
63
+ * "items": {
64
+ * "type": "string",
65
+ * "maxLength": 10
66
+ * }
67
+ * }
68
+ * }
69
+ * }
70
+ * ```
71
+ *
72
+ * @param {number} maxLength The maximum length allowed
73
+ * @decorator
74
+ * @validation
75
+ * @swagger
76
+ * @schema
77
+ * @input
78
+ * @ajv-errors
79
+ */
80
+ export const MaxLength = withErrorMsg("maxLength", (maxLength: number) => {
81
+ if (maxLength < 0) {
82
+ throw new Error("The value of maxLength MUST be a non-negative integer.");
83
+ }
84
+
85
+ return JsonEntityFn((store) => {
86
+ store.itemSchema.maxLength(maxLength);
87
+ });
88
+ });