@typespec/http-specs 0.1.0-alpha.3-dev.6 → 0.1.0-alpha.30-dev.0

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 (206) hide show
  1. package/CHANGELOG.md +238 -0
  2. package/README.md +11 -3
  3. package/dist/specs/documentation/mockapi.d.ts.map +1 -0
  4. package/dist/specs/documentation/mockapi.js +38 -0
  5. package/dist/specs/documentation/mockapi.js.map +1 -0
  6. package/dist/specs/encode/array/mockapi.d.ts +3 -0
  7. package/dist/specs/encode/array/mockapi.d.ts.map +1 -0
  8. package/dist/specs/encode/array/mockapi.js +25 -0
  9. package/dist/specs/encode/array/mockapi.js.map +1 -0
  10. package/dist/specs/encode/bytes/mockapi.js +16 -24
  11. package/dist/specs/encode/bytes/mockapi.js.map +1 -1
  12. package/dist/specs/encode/datetime/mockapi.js +2 -2
  13. package/dist/specs/encode/datetime/mockapi.js.map +1 -1
  14. package/dist/specs/encode/duration/mockapi.js +74 -2
  15. package/dist/specs/encode/duration/mockapi.js.map +1 -1
  16. package/dist/specs/encode/numeric/mockapi.js +2 -2
  17. package/dist/specs/encode/numeric/mockapi.js.map +1 -1
  18. package/dist/specs/helper.d.ts +2 -2
  19. package/dist/specs/helper.d.ts.map +1 -1
  20. package/dist/specs/parameters/basic/mockapi.d.ts.map +1 -1
  21. package/dist/specs/parameters/basic/mockapi.js +3 -3
  22. package/dist/specs/parameters/basic/mockapi.js.map +1 -1
  23. package/dist/specs/parameters/body-optionality/mockapi.d.ts.map +1 -1
  24. package/dist/specs/parameters/body-optionality/mockapi.js +14 -4
  25. package/dist/specs/parameters/body-optionality/mockapi.js.map +1 -1
  26. package/dist/specs/parameters/collection-format/mockapi.js +4 -15
  27. package/dist/specs/parameters/collection-format/mockapi.js.map +1 -1
  28. package/dist/specs/parameters/path/mockapi.d.ts +3 -0
  29. package/dist/specs/parameters/path/mockapi.d.ts.map +1 -0
  30. package/dist/specs/parameters/path/mockapi.js +29 -0
  31. package/dist/specs/parameters/path/mockapi.js.map +1 -0
  32. package/dist/specs/parameters/spread/mockapi.d.ts.map +1 -1
  33. package/dist/specs/parameters/spread/mockapi.js +19 -19
  34. package/dist/specs/parameters/spread/mockapi.js.map +1 -1
  35. package/dist/specs/payload/json-merge-patch/mockapi.js +4 -4
  36. package/dist/specs/payload/json-merge-patch/mockapi.js.map +1 -1
  37. package/dist/specs/payload/media-type/mockapi.js +2 -2
  38. package/dist/specs/payload/media-type/mockapi.js.map +1 -1
  39. package/dist/specs/payload/multipart/mockapi.d.ts.map +1 -1
  40. package/dist/specs/payload/multipart/mockapi.js +42 -60
  41. package/dist/specs/payload/multipart/mockapi.js.map +1 -1
  42. package/dist/specs/payload/pageable/mockapi.d.ts.map +1 -1
  43. package/dist/specs/payload/pageable/mockapi.js +425 -18
  44. package/dist/specs/payload/pageable/mockapi.js.map +1 -1
  45. package/dist/specs/payload/xml/mockapi.js +1 -4
  46. package/dist/specs/payload/xml/mockapi.js.map +1 -1
  47. package/dist/specs/response/status-code-range/mockapi.d.ts +3 -0
  48. package/dist/specs/response/status-code-range/mockapi.d.ts.map +1 -0
  49. package/dist/specs/response/status-code-range/mockapi.js +29 -0
  50. package/dist/specs/response/status-code-range/mockapi.js.map +1 -0
  51. package/dist/specs/routes/mockapi.js +25 -25
  52. package/dist/specs/routes/mockapi.js.map +1 -1
  53. package/dist/specs/serialization/encoded-name/json/mockapi.js +1 -1
  54. package/dist/specs/serialization/encoded-name/json/mockapi.js.map +1 -1
  55. package/dist/specs/server/versions/not-versioned/mockapi.js +1 -1
  56. package/dist/specs/server/versions/not-versioned/mockapi.js.map +1 -1
  57. package/dist/specs/server/versions/versioned/mockapi.js +8 -12
  58. package/dist/specs/server/versions/versioned/mockapi.js.map +1 -1
  59. package/dist/specs/special-words/mockapi.d.ts.map +1 -1
  60. package/dist/specs/special-words/mockapi.js +28 -6
  61. package/dist/specs/special-words/mockapi.js.map +1 -1
  62. package/dist/specs/streaming/jsonl/mockapi.d.ts +3 -0
  63. package/dist/specs/streaming/jsonl/mockapi.d.ts.map +1 -0
  64. package/dist/specs/streaming/jsonl/mockapi.js +30 -0
  65. package/dist/specs/streaming/jsonl/mockapi.js.map +1 -0
  66. package/dist/specs/type/array/mockapi.js +1 -1
  67. package/dist/specs/type/array/mockapi.js.map +1 -1
  68. package/dist/specs/type/dictionary/mockapi.js +1 -1
  69. package/dist/specs/type/dictionary/mockapi.js.map +1 -1
  70. package/dist/specs/type/enum/extensible/mockapi.js +1 -1
  71. package/dist/specs/type/enum/extensible/mockapi.js.map +1 -1
  72. package/dist/specs/type/enum/fixed/mockapi.js +2 -2
  73. package/dist/specs/type/enum/fixed/mockapi.js.map +1 -1
  74. package/dist/specs/type/model/empty/mockapi.js +2 -2
  75. package/dist/specs/type/model/empty/mockapi.js.map +1 -1
  76. package/dist/specs/type/model/inheritance/enum-discriminator/mockapi.js +1 -1
  77. package/dist/specs/type/model/inheritance/enum-discriminator/mockapi.js.map +1 -1
  78. package/dist/specs/type/model/inheritance/nested-discriminator/mockapi.js +2 -2
  79. package/dist/specs/type/model/inheritance/nested-discriminator/mockapi.js.map +1 -1
  80. package/dist/specs/type/model/inheritance/not-discriminated/mockapi.js +2 -2
  81. package/dist/specs/type/model/inheritance/not-discriminated/mockapi.js.map +1 -1
  82. package/dist/specs/type/model/inheritance/recursive/mockapi.js +1 -1
  83. package/dist/specs/type/model/inheritance/recursive/mockapi.js.map +1 -1
  84. package/dist/specs/type/model/inheritance/single-discriminator/mockapi.js +2 -2
  85. package/dist/specs/type/model/inheritance/single-discriminator/mockapi.js.map +1 -1
  86. package/dist/specs/type/model/usage/mockapi.js +4 -4
  87. package/dist/specs/type/model/usage/mockapi.js.map +1 -1
  88. package/dist/specs/type/model/visibility/mockapi.js +9 -10
  89. package/dist/specs/type/model/visibility/mockapi.js.map +1 -1
  90. package/dist/specs/type/property/additional-properties/mockapi.js +9 -6
  91. package/dist/specs/type/property/additional-properties/mockapi.js.map +1 -1
  92. package/dist/specs/type/property/nullable/mockapi.js +2 -6
  93. package/dist/specs/type/property/nullable/mockapi.js.map +1 -1
  94. package/dist/specs/type/property/optionality/mockapi.js +1 -1
  95. package/dist/specs/type/property/optionality/mockapi.js.map +1 -1
  96. package/dist/specs/type/property/value-types/mockapi.js +3 -3
  97. package/dist/specs/type/property/value-types/mockapi.js.map +1 -1
  98. package/dist/specs/type/scalar/mockapi.js +9 -9
  99. package/dist/specs/type/scalar/mockapi.js.map +1 -1
  100. package/dist/specs/type/union/discriminated/mockapi.d.ts +3 -0
  101. package/dist/specs/type/union/discriminated/mockapi.d.ts.map +1 -0
  102. package/dist/specs/type/union/discriminated/mockapi.js +212 -0
  103. package/dist/specs/type/union/discriminated/mockapi.js.map +1 -0
  104. package/dist/specs/type/union/mockapi.js +2 -2
  105. package/dist/specs/type/union/mockapi.js.map +1 -1
  106. package/dist/specs/versioning/added/mockapi.js +6 -6
  107. package/dist/specs/versioning/added/mockapi.js.map +1 -1
  108. package/dist/specs/versioning/madeOptional/mockapi.js +2 -2
  109. package/dist/specs/versioning/madeOptional/mockapi.js.map +1 -1
  110. package/dist/specs/versioning/removed/mockapi.js +46 -2
  111. package/dist/specs/versioning/removed/mockapi.js.map +1 -1
  112. package/dist/specs/versioning/renamedFrom/mockapi.js +5 -5
  113. package/dist/specs/versioning/renamedFrom/mockapi.js.map +1 -1
  114. package/dist/specs/versioning/returnTypeChangedFrom/mockapi.js +1 -1
  115. package/dist/specs/versioning/returnTypeChangedFrom/mockapi.js.map +1 -1
  116. package/dist/specs/versioning/typeChangedFrom/mockapi.js +3 -3
  117. package/dist/specs/versioning/typeChangedFrom/mockapi.js.map +1 -1
  118. package/package.json +32 -19
  119. package/smoke/petstore/main.tsp +96 -0
  120. package/smoke/todoapp/main.tsp +293 -0
  121. package/spec-summary.md +1289 -265
  122. package/specs/documentation/main.tsp +158 -0
  123. package/specs/documentation/mockapi.ts +57 -0
  124. package/specs/encode/array/main.tsp +112 -0
  125. package/specs/encode/array/mockapi.ts +43 -0
  126. package/specs/encode/bytes/main.tsp +29 -20
  127. package/specs/encode/bytes/mockapi.ts +13 -31
  128. package/specs/encode/datetime/main.tsp +2 -7
  129. package/specs/encode/datetime/mockapi.ts +2 -2
  130. package/specs/encode/duration/main.tsp +420 -7
  131. package/specs/encode/duration/mockapi.ts +174 -2
  132. package/specs/encode/numeric/mockapi.ts +2 -2
  133. package/specs/parameters/basic/mockapi.ts +3 -3
  134. package/specs/parameters/body-optionality/main.tsp +2 -0
  135. package/specs/parameters/body-optionality/mockapi.ts +24 -4
  136. package/specs/parameters/collection-format/main.tsp +5 -25
  137. package/specs/parameters/collection-format/mockapi.ts +4 -16
  138. package/specs/parameters/path/main.tsp +48 -0
  139. package/specs/parameters/path/mockapi.ts +34 -0
  140. package/specs/parameters/spread/mockapi.ts +19 -19
  141. package/specs/payload/json-merge-patch/main.tsp +2 -2
  142. package/specs/payload/json-merge-patch/mockapi.ts +4 -4
  143. package/specs/payload/media-type/mockapi.ts +2 -2
  144. package/specs/payload/multipart/main.tsp +34 -32
  145. package/specs/payload/multipart/mockapi.ts +42 -59
  146. package/specs/payload/pageable/main.tsp +462 -7
  147. package/specs/payload/pageable/mockapi.ts +478 -18
  148. package/specs/payload/xml/mockapi.ts +1 -4
  149. package/specs/response/status-code-range/main.tsp +82 -0
  150. package/specs/response/status-code-range/mockapi.ts +31 -0
  151. package/specs/routes/main.tsp +48 -48
  152. package/specs/routes/mockapi.ts +25 -25
  153. package/specs/serialization/encoded-name/json/main.tsp +1 -1
  154. package/specs/serialization/encoded-name/json/mockapi.ts +1 -1
  155. package/specs/server/endpoint/not-defined/main.tsp +1 -3
  156. package/specs/server/path/multiple/main.tsp +3 -5
  157. package/specs/server/versions/not-versioned/mockapi.ts +1 -1
  158. package/specs/server/versions/versioned/main.tsp +1 -1
  159. package/specs/server/versions/versioned/mockapi.ts +6 -12
  160. package/specs/special-headers/conditional-request/main.tsp +1 -1
  161. package/specs/special-headers/repeatability/main.tsp +2 -2
  162. package/specs/special-words/main.tsp +44 -6
  163. package/specs/special-words/mockapi.ts +29 -6
  164. package/specs/streaming/jsonl/main.tsp +33 -0
  165. package/specs/streaming/jsonl/mockapi.ts +32 -0
  166. package/specs/type/array/mockapi.ts +1 -1
  167. package/specs/type/dictionary/mockapi.ts +1 -1
  168. package/specs/type/enum/extensible/main.tsp +18 -2
  169. package/specs/type/enum/extensible/mockapi.ts +1 -1
  170. package/specs/type/enum/fixed/main.tsp +15 -3
  171. package/specs/type/enum/fixed/mockapi.ts +2 -2
  172. package/specs/type/model/empty/mockapi.ts +2 -2
  173. package/specs/type/model/inheritance/enum-discriminator/mockapi.ts +1 -1
  174. package/specs/type/model/inheritance/nested-discriminator/mockapi.ts +2 -2
  175. package/specs/type/model/inheritance/not-discriminated/mockapi.ts +2 -2
  176. package/specs/type/model/inheritance/recursive/mockapi.ts +1 -1
  177. package/specs/type/model/inheritance/single-discriminator/mockapi.ts +2 -2
  178. package/specs/type/model/usage/mockapi.ts +4 -4
  179. package/specs/type/model/visibility/main.tsp +15 -23
  180. package/specs/type/model/visibility/mockapi.ts +9 -10
  181. package/specs/type/property/additional-properties/main.tsp +17 -17
  182. package/specs/type/property/additional-properties/mockapi.ts +10 -10
  183. package/specs/type/property/nullable/mockapi.ts +7 -8
  184. package/specs/type/property/optionality/mockapi.ts +1 -1
  185. package/specs/type/property/value-types/mockapi.ts +3 -3
  186. package/specs/type/scalar/main.tsp +58 -9
  187. package/specs/type/scalar/mockapi.ts +9 -9
  188. package/specs/type/union/discriminated/main.tsp +251 -0
  189. package/specs/type/union/discriminated/mockapi.ts +230 -0
  190. package/specs/type/union/mockapi.ts +2 -2
  191. package/specs/versioning/added/mockapi.ts +6 -6
  192. package/specs/versioning/madeOptional/mockapi.ts +2 -2
  193. package/specs/versioning/removed/main.tsp +65 -3
  194. package/specs/versioning/removed/mockapi.ts +49 -2
  195. package/specs/versioning/renamedFrom/mockapi.ts +5 -5
  196. package/specs/versioning/returnTypeChangedFrom/main.tsp +17 -2
  197. package/specs/versioning/returnTypeChangedFrom/mockapi.ts +1 -1
  198. package/specs/versioning/typeChangedFrom/mockapi.ts +3 -3
  199. package/temp/.tsbuildinfo +1 -1
  200. package/tspconfig.yaml +0 -2
  201. package/dist/specs/type/model/templated/mockapi.d.ts.map +0 -1
  202. package/dist/specs/type/model/templated/mockapi.js +0 -63
  203. package/dist/specs/type/model/templated/mockapi.js.map +0 -1
  204. package/specs/type/model/templated/main.tsp +0 -130
  205. package/specs/type/model/templated/mockapi.ts +0 -66
  206. /package/dist/specs/{type/model/templated → documentation}/mockapi.d.ts +0 -0
@@ -463,11 +463,11 @@ interface SpreadRecordUnion
463
463
  > {}
464
464
 
465
465
  // ****************** spread record of discriminated unions **************************
466
- @discriminator("kind")
467
- union WidgetData {
468
- kind0: WidgetData0,
469
- kind1: WidgetData1,
470
- }
466
+ // @discriminated(#{ envelope: "none" })
467
+ // union WidgetData {
468
+ // kind0: WidgetData0,
469
+ // kind1: WidgetData1,
470
+ // }
471
471
 
472
472
  model WidgetData0 {
473
473
  kind: "kind0";
@@ -485,20 +485,20 @@ model WidgetData2 {
485
485
  start: string;
486
486
  }
487
487
 
488
- @doc("The model spread Record<WidgetData>")
489
- model SpreadRecordForDiscriminatedUnion {
490
- @doc("The name property")
491
- name: string;
488
+ // @doc("The model spread Record<WidgetData>")
489
+ // model SpreadRecordForDiscriminatedUnion {
490
+ // @doc("The name property")
491
+ // name: string;
492
492
 
493
- ...Record<WidgetData>;
494
- }
493
+ // ...Record<WidgetData>;
494
+ // }
495
495
 
496
- @route("/spreadRecordDiscriminatedUnion")
497
- interface SpreadRecordDiscriminatedUnion
498
- extends ModelOperations<
499
- SpreadRecordForDiscriminatedUnion,
500
- "{'name': 'abc', 'prop1': {'kind': 'kind0', 'fooProp': 'abc'}, 'prop2': {'kind': 'kind1', 'start': '2021-01-01T00:00:00Z', 'end': '2021-01-02T00:00:00Z'}}"
501
- > {}
496
+ // @route("/spreadRecordDiscriminatedUnion")
497
+ // interface SpreadRecordDiscriminatedUnion
498
+ // extends ModelOperations<
499
+ // SpreadRecordForDiscriminatedUnion,
500
+ // "{'name': 'abc', 'prop1': {'kind': 'kind0', 'fooProp': 'abc'}, 'prop2': {'kind': 'kind1', 'start': '2021-01-01T00:00:00Z', 'end': '2021-01-02T00:00:00Z'}}"
501
+ // > {}
502
502
 
503
503
  // ****************** spread record of non-discriminated unions but could guess a discriminator **************************
504
504
  @doc("The model spread Record<WidgetData0 | WidgetData1>")
@@ -98,7 +98,7 @@ const recordNonDiscriminatedUnion3Body = {
98
98
  end: "2021-01-02T00:00:00Z",
99
99
  },
100
100
  };
101
- function createServerTests(url: string, value: any) {
101
+ function createServerTests(url: string, value: unknown) {
102
102
  return {
103
103
  get: passOnSuccess({
104
104
  uri: url,
@@ -114,7 +114,7 @@ function createServerTests(url: string, value: any) {
114
114
  uri: url,
115
115
  method: `put`,
116
116
  request: {
117
- body: value,
117
+ body: json(value),
118
118
  },
119
119
  response: {
120
120
  status: 204,
@@ -432,14 +432,14 @@ Scenarios.Type_Property_AdditionalProperties_SpreadRecordUnion_get =
432
432
  Scenarios.Type_Property_AdditionalProperties_SpreadRecordUnion_put =
433
433
  Type_Property_Additional_Properties_Spread_Record_Union.put;
434
434
 
435
- const Type_Property_Additional_Properties_Spread_Record_Discriminated_Union = createServerTests(
436
- `/type/property/additionalProperties/spreadRecordDiscriminatedUnion`,
437
- recordDiscriminatedUnionBody,
438
- );
439
- Scenarios.Type_Property_AdditionalProperties_SpreadRecordDiscriminatedUnion_get =
440
- Type_Property_Additional_Properties_Spread_Record_Discriminated_Union.get;
441
- Scenarios.Type_Property_AdditionalProperties_SpreadRecordDiscriminatedUnion_put =
442
- Type_Property_Additional_Properties_Spread_Record_Discriminated_Union.put;
435
+ // const Type_Property_Additional_Properties_Spread_Record_Discriminated_Union = createServerTests(
436
+ // `/type/property/additionalProperties/spreadRecordDiscriminatedUnion`,
437
+ // recordDiscriminatedUnionBody,
438
+ // );
439
+ // Scenarios.Type_Property_AdditionalProperties_SpreadRecordDiscriminatedUnion_get =
440
+ // Type_Property_Additional_Properties_Spread_Record_Discriminated_Union.get;
441
+ // Scenarios.Type_Property_AdditionalProperties_SpreadRecordDiscriminatedUnion_put =
442
+ // Type_Property_Additional_Properties_Spread_Record_Discriminated_Union.put;
443
443
 
444
444
  const Type_Property_Additional_Properties_Spread_Record_Non_Discriminated_Union = createServerTests(
445
445
  `/type/property/additionalProperties/spreadRecordNonDiscriminatedUnion`,
@@ -7,7 +7,6 @@ function createServerTests(url: string, value: unknown, patchNullableProperty?:
7
7
  get: passOnSuccess({
8
8
  uri: url,
9
9
  method: `get`,
10
- request: {},
11
10
  response: {
12
11
  status: 200,
13
12
  body: json(value),
@@ -18,13 +17,13 @@ function createServerTests(url: string, value: unknown, patchNullableProperty?:
18
17
  uri: url,
19
18
  method: `patch`,
20
19
  request: {
21
- body: {
22
- requiredProperty: "foo",
23
- nullableProperty: patchNullableProperty || null,
24
- },
25
- headers: {
26
- "Content-Type": "application/merge-patch+json",
27
- },
20
+ body: json(
21
+ {
22
+ requiredProperty: "foo",
23
+ nullableProperty: patchNullableProperty || null,
24
+ },
25
+ "application/merge-patch+json",
26
+ ),
28
27
  },
29
28
  response: {
30
29
  status: 204,
@@ -18,7 +18,7 @@ function createServerTests(url: string, value: unknown) {
18
18
  uri: url,
19
19
  method: `put`,
20
20
  request: {
21
- body: value,
21
+ body: json(value),
22
22
  },
23
23
  response: {
24
24
  status: 204,
@@ -18,7 +18,7 @@ function createServerTests(url: string, data: unknown) {
18
18
  uri: url,
19
19
  method: `put`,
20
20
  request: {
21
- body: data,
21
+ body: json(data),
22
22
  },
23
23
  response: {
24
24
  status: 204,
@@ -166,9 +166,9 @@ Scenarios.Type_Property_ValueTypes_Never_put = passOnSuccess({
166
166
  uri: `/type/property/value-types/never`,
167
167
  method: `put`,
168
168
  request: {
169
- body: {
169
+ body: json({
170
170
  property: undefined,
171
- },
171
+ }),
172
172
  },
173
173
  response: {
174
174
  status: 204,
@@ -14,14 +14,25 @@ interface String {
14
14
  @scenarioDoc("Expect to handle a string value. Mock api will return 'test'")
15
15
  @get
16
16
  @doc("get string value")
17
- get(): string;
17
+ get(): {
18
+ @header
19
+ contentType: "application/json";
20
+
21
+ @body
22
+ body: string;
23
+ };
18
24
 
19
25
  #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "For testing"
20
26
  @scenario
21
27
  @scenarioDoc("Expect to send a string value. Mock api expect to receive 'test'")
22
28
  @put
23
29
  @doc("put string value")
24
- put(@body @doc("_") body: string): void;
30
+ put(
31
+ @header
32
+ contentType: "application/json",
33
+
34
+ @body @doc("_") body: string,
35
+ ): void;
25
36
  }
26
37
 
27
38
  @route("/boolean")
@@ -31,14 +42,25 @@ interface Boolean {
31
42
  @scenarioDoc("Expect to handle a boolean value. Mock api will return true ")
32
43
  @get
33
44
  @doc("get boolean value")
34
- get(): boolean;
45
+ get(): {
46
+ @header
47
+ contentType: "application/json";
48
+
49
+ @body
50
+ body: boolean;
51
+ };
35
52
 
36
53
  #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "For testing"
37
54
  @scenario
38
55
  @scenarioDoc("Expect to send a boolean value. Mock api expect to receive 'true'")
39
56
  @put
40
57
  @doc("put boolean value")
41
- put(@body @doc("_") body: boolean): void;
58
+ put(
59
+ @header
60
+ contentType: "application/json",
61
+
62
+ @body @doc("_") body: boolean,
63
+ ): void;
42
64
  }
43
65
 
44
66
  @route("/unknown")
@@ -48,14 +70,25 @@ interface Unknown {
48
70
  @scenarioDoc("Expect to handle a unknown type value. Mock api will return 'test'")
49
71
  @get
50
72
  @doc("get unknown value")
51
- get(): unknown;
73
+ get(): {
74
+ @header
75
+ contentType: "application/json";
76
+
77
+ @body
78
+ body: unknown;
79
+ };
52
80
 
53
81
  #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "For testing"
54
82
  @scenario
55
83
  @scenarioDoc("Expect to send a string value. Mock api expect to receive 'test'")
56
84
  @put
57
85
  @doc("put unknown value")
58
- put(@body @doc("_") body: unknown): void;
86
+ put(
87
+ @header
88
+ contentType: "application/json",
89
+
90
+ @body @doc("_") body: unknown,
91
+ ): void;
59
92
  }
60
93
 
61
94
  @doc("Template to have scalar types operations")
@@ -69,7 +102,13 @@ interface ScalarTypesOperations<T, TDoc extends valueof string> {
69
102
  """)
70
103
  @get
71
104
  @route("/response_body")
72
- responseBody(): T;
105
+ responseBody(): {
106
+ @header
107
+ contentType: "application/json";
108
+
109
+ @body
110
+ body: T;
111
+ };
73
112
 
74
113
  @scenario
75
114
  @scenarioDoc("""
@@ -80,7 +119,12 @@ interface ScalarTypesOperations<T, TDoc extends valueof string> {
80
119
  """)
81
120
  @put
82
121
  @route("/resquest_body")
83
- requestBody(@body body: T): void;
122
+ requestBody(
123
+ @header
124
+ contentType: "application/json",
125
+
126
+ @body body: T,
127
+ ): void;
84
128
 
85
129
  @scenario
86
130
  @scenarioDoc("""
@@ -124,7 +168,12 @@ interface NumberTypesVerifyOperations<
124
168
  """)
125
169
  @post
126
170
  @route("/verify")
127
- verify(@body body: T): void;
171
+ verify(
172
+ @header
173
+ contentType: "application/json",
174
+
175
+ @body body: T,
176
+ ): void;
128
177
  }
129
178
 
130
179
  @doc("Decimal type verification")
@@ -17,7 +17,7 @@ Scenarios.Type_Scalar_String_put = passOnSuccess({
17
17
  uri: "/type/scalar/string",
18
18
  method: `put`,
19
19
  request: {
20
- body: "test",
20
+ body: json("test"),
21
21
  headers: {
22
22
  "Content-Type": "text/plain",
23
23
  },
@@ -43,7 +43,7 @@ Scenarios.Type_Scalar_Boolean_put = passOnSuccess({
43
43
  uri: "/type/scalar/boolean",
44
44
  method: `put`,
45
45
  request: {
46
- body: true,
46
+ body: json(true),
47
47
  headers: {
48
48
  "Content-Type": "application/json; charset=utf-8",
49
49
  },
@@ -68,7 +68,7 @@ Scenarios.Type_Scalar_Unknown_put = passOnSuccess({
68
68
  uri: "/type/scalar/unknown",
69
69
  method: `put`,
70
70
  request: {
71
- body: "test",
71
+ body: json("test"),
72
72
  headers: {
73
73
  "Content-Type": "text/plain",
74
74
  },
@@ -103,7 +103,7 @@ Scenarios.Type_Scalar_DecimalType_requestBody = passOnSuccess({
103
103
  uri: "/type/scalar/decimal/resquest_body",
104
104
  method: `put`,
105
105
  request: {
106
- body: 0.33333,
106
+ body: json(0.33333),
107
107
  headers: {
108
108
  "Content-Type": "application/json; charset=utf-8",
109
109
  },
@@ -117,7 +117,7 @@ Scenarios.Type_Scalar_Decimal128Type_requestBody = passOnSuccess({
117
117
  uri: "/type/scalar/decimal128/resquest_body",
118
118
  method: `put`,
119
119
  request: {
120
- body: 0.33333,
120
+ body: json(0.33333),
121
121
  headers: {
122
122
  "Content-Type": "application/json; charset=utf-8",
123
123
  },
@@ -131,7 +131,7 @@ Scenarios.Type_Scalar_DecimalType_requestParameter = passOnSuccess({
131
131
  uri: "/type/scalar/decimal/request_parameter",
132
132
  method: `get`,
133
133
  request: {
134
- params: { value: "0.33333" },
134
+ query: { value: "0.33333" },
135
135
  },
136
136
  response: {
137
137
  status: 204,
@@ -142,7 +142,7 @@ Scenarios.Type_Scalar_Decimal128Type_requestParameter = passOnSuccess({
142
142
  uri: "/type/scalar/decimal128/request_parameter",
143
143
  method: `get`,
144
144
  request: {
145
- params: { value: "0.33333" },
145
+ query: { value: "0.33333" },
146
146
  },
147
147
  response: {
148
148
  status: 204,
@@ -173,7 +173,7 @@ Scenarios.Type_Scalar_DecimalVerify_verify = passOnSuccess({
173
173
  uri: "/type/scalar/decimal/verify",
174
174
  method: `post`,
175
175
  request: {
176
- body: 0.3,
176
+ body: json(0.3),
177
177
  headers: {
178
178
  "Content-Type": "application/json; charset=utf-8",
179
179
  },
@@ -187,7 +187,7 @@ Scenarios.Type_Scalar_Decimal128Verify_verify = passOnSuccess({
187
187
  uri: "/type/scalar/decimal128/verify",
188
188
  method: `post`,
189
189
  request: {
190
- body: 0.3,
190
+ body: json(0.3),
191
191
  headers: {
192
192
  "Content-Type": "application/json; charset=utf-8",
193
193
  },
@@ -0,0 +1,251 @@
1
+ import "@typespec/http";
2
+ import "@typespec/spector";
3
+
4
+ using Http;
5
+ using Spector;
6
+
7
+ /**
8
+ * Describe scenarios for discriminated unions.
9
+ */
10
+ @scenarioService("/type/union/discriminated")
11
+ namespace Type.Union.Discriminated;
12
+
13
+ // Models for discriminated unions
14
+ model Cat {
15
+ name: string;
16
+ meow: boolean;
17
+ }
18
+
19
+ model Dog {
20
+ name: string;
21
+ bark: boolean;
22
+ }
23
+
24
+ /**
25
+ * Test discriminated union with default envelope serialization.
26
+ * The discriminated union should serialize with "kind" as discriminator
27
+ * and "value" as envelope property.
28
+ */
29
+ @discriminated
30
+ union PetWithEnvelope {
31
+ cat: Cat,
32
+ dog: Dog,
33
+ }
34
+
35
+ @route("/envelope")
36
+ namespace Envelope {
37
+ @route("/object")
38
+ namespace Object {
39
+ @route("/default")
40
+ interface Default {
41
+ @scenario
42
+ @scenarioDoc("""
43
+ Test discriminated union with envelope serialization.
44
+ When value of query parameter "kind" is "cat" or no query parameter input, the expected response is:
45
+ ```json
46
+ {
47
+ "kind": "cat",
48
+ "value": {
49
+ "name": "Whiskers",
50
+ "meow": true
51
+ }
52
+ }
53
+ ```
54
+ When it is "dog", expected response is:
55
+ ```json
56
+ {
57
+ "kind": "dog",
58
+ "value": {
59
+ "name": "Rex",
60
+ "bark": false
61
+ }
62
+ }
63
+ ```
64
+ """)
65
+ @get
66
+ get(@query kind?: string): PetWithEnvelope;
67
+
68
+ @scenario
69
+ @scenarioDoc("""
70
+ Test discriminated union with envelope serialization.
71
+ Send the union as:
72
+ ```json
73
+ {
74
+ "kind": "cat",
75
+ "value": {
76
+ "name": "Whiskers",
77
+ "meow": true
78
+ }
79
+ }
80
+ ```
81
+ """)
82
+ @put
83
+ put(@body input: PetWithEnvelope): PetWithEnvelope;
84
+ }
85
+
86
+ @route("/custom-properties")
87
+ interface CustomProperties {
88
+ @scenario
89
+ @scenarioDoc("""
90
+ Test discriminated union with custom property names.
91
+ When value of query parameter "petType" is "cat" or no query parameter input, the expected response is:
92
+ ```json
93
+ {
94
+ "petType": "cat",
95
+ "petData": {
96
+ "name": "Whiskers",
97
+ "meow": true
98
+ }
99
+ }
100
+ ```
101
+ When it is "dog", expected response is:
102
+ ```json
103
+ {
104
+ "petType": "dog",
105
+ "petData": {
106
+ "name": "Rex",
107
+ "bark": false
108
+ }
109
+ }
110
+ ```
111
+ """)
112
+ @get
113
+ get(@query petType?: string): PetWithCustomNames;
114
+
115
+ @scenario
116
+ @scenarioDoc("""
117
+ Test discriminated union with custom property names.
118
+ Send the union as:
119
+ ```json
120
+ {
121
+ "petType": "cat",
122
+ "petData": {
123
+ "name": "Whiskers",
124
+ "meow": true
125
+ }
126
+ }
127
+ ```
128
+ """)
129
+ @put
130
+ put(@body input: PetWithCustomNames): PetWithCustomNames;
131
+ }
132
+ }
133
+ }
134
+
135
+ /**
136
+ * Test discriminated union with custom property names.
137
+ * The discriminated union should serialize with custom discriminator
138
+ * and envelope property names.
139
+ */
140
+ @discriminated(#{ discriminatorPropertyName: "petType", envelopePropertyName: "petData" })
141
+ union PetWithCustomNames {
142
+ cat: Cat,
143
+ dog: Dog,
144
+ }
145
+
146
+ /**
147
+ * Test discriminated union with inline discriminator (no envelope).
148
+ * The discriminated union should serialize with discriminator property
149
+ * injected directly into the variant object.
150
+ */
151
+ @discriminated(#{ envelope: "none" })
152
+ union PetInline {
153
+ cat: Cat,
154
+ dog: Dog,
155
+ }
156
+
157
+ /**
158
+ * Test discriminated union with inline discriminator and custom discriminator property name.
159
+ * The discriminated union should serialize with custom discriminator property
160
+ * injected directly into the variant object.
161
+ */
162
+ @discriminated(#{ envelope: "none", discriminatorPropertyName: "type" })
163
+ union PetInlineWithCustomDiscriminator {
164
+ cat: Cat,
165
+ dog: Dog,
166
+ }
167
+
168
+ @route("/no-envelope")
169
+ namespace NoEnvelope {
170
+ @route("/default")
171
+ interface Default {
172
+ @scenario
173
+ @scenarioDoc("""
174
+ Test discriminated union with inline discriminator.
175
+ When value of query parameter "kind" is "cat" or no query parameter input, the expected response is:
176
+ ```json
177
+ {
178
+ "kind": "cat",
179
+ "name": "Whiskers",
180
+ "meow": true
181
+ }
182
+ ```
183
+ When it is "dog", expected response is:
184
+ ```json
185
+ {
186
+ "kind": "dog",
187
+ "name": "Rex",
188
+ "bark": false
189
+ }
190
+ ```
191
+ """)
192
+ @get
193
+ get(@query kind?: string): PetInline;
194
+
195
+ @scenario
196
+ @scenarioDoc("""
197
+ Test discriminated union with inline discriminator.
198
+ Send the union as:
199
+ ```json
200
+ {
201
+ "kind": "cat",
202
+ "name": "Whiskers",
203
+ "meow": true
204
+ }
205
+ ```
206
+ """)
207
+ @put
208
+ put(@body input: PetInline): PetInline;
209
+ }
210
+
211
+ @route("/custom-discriminator")
212
+ interface CustomDiscriminator {
213
+ @scenario
214
+ @scenarioDoc("""
215
+ Test discriminated union with inline discriminator and custom discriminator property name.
216
+ When value of query parameter "type" is "cat" or no query parameter input, the expected response is:
217
+ ```json
218
+ {
219
+ "type": "cat",
220
+ "name": "Whiskers",
221
+ "meow": true
222
+ }
223
+ ```
224
+ When it is "dog", expected response is:
225
+ ```json
226
+ {
227
+ "type": "dog",
228
+ "name": "Rex",
229
+ "bark": false
230
+ }
231
+ ```
232
+ """)
233
+ @get
234
+ get(@query type?: string): PetInlineWithCustomDiscriminator;
235
+
236
+ @scenario
237
+ @scenarioDoc("""
238
+ Test discriminated union with inline discriminator and custom discriminator property name.
239
+ Send the union as:
240
+ ```json
241
+ {
242
+ "type": "cat",
243
+ "name": "Whiskers",
244
+ "meow": true
245
+ }
246
+ ```
247
+ """)
248
+ @put
249
+ put(@body input: PetInlineWithCustomDiscriminator): PetInlineWithCustomDiscriminator;
250
+ }
251
+ }