@typespec/http-specs 0.1.0-alpha.9 → 0.1.0-dev.1

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 (224) hide show
  1. package/CHANGELOG.md +260 -3
  2. package/README.md +11 -3
  3. package/dist/specs/authentication/noauth/union/mockapi.d.ts +3 -0
  4. package/dist/specs/authentication/noauth/union/mockapi.d.ts.map +1 -0
  5. package/dist/specs/authentication/noauth/union/mockapi.js +25 -0
  6. package/dist/specs/authentication/noauth/union/mockapi.js.map +1 -0
  7. package/dist/specs/documentation/mockapi.d.ts +3 -0
  8. package/dist/specs/documentation/mockapi.d.ts.map +1 -0
  9. package/dist/specs/documentation/mockapi.js +40 -0
  10. package/dist/specs/documentation/mockapi.js.map +1 -0
  11. package/dist/specs/encode/array/mockapi.d.ts +3 -0
  12. package/dist/specs/encode/array/mockapi.d.ts.map +1 -0
  13. package/dist/specs/encode/array/mockapi.js +33 -0
  14. package/dist/specs/encode/array/mockapi.js.map +1 -0
  15. package/dist/specs/encode/bytes/mockapi.js +16 -24
  16. package/dist/specs/encode/bytes/mockapi.js.map +1 -1
  17. package/dist/specs/encode/datetime/mockapi.js +2 -2
  18. package/dist/specs/encode/datetime/mockapi.js.map +1 -1
  19. package/dist/specs/encode/duration/mockapi.d.ts.map +1 -1
  20. package/dist/specs/encode/duration/mockapi.js +115 -3
  21. package/dist/specs/encode/duration/mockapi.js.map +1 -1
  22. package/dist/specs/encode/numeric/mockapi.js +2 -2
  23. package/dist/specs/encode/numeric/mockapi.js.map +1 -1
  24. package/dist/specs/helper.d.ts +2 -2
  25. package/dist/specs/helper.d.ts.map +1 -1
  26. package/dist/specs/parameters/basic/mockapi.d.ts.map +1 -1
  27. package/dist/specs/parameters/basic/mockapi.js +3 -3
  28. package/dist/specs/parameters/basic/mockapi.js.map +1 -1
  29. package/dist/specs/parameters/body-optionality/mockapi.d.ts.map +1 -1
  30. package/dist/specs/parameters/body-optionality/mockapi.js +14 -4
  31. package/dist/specs/parameters/body-optionality/mockapi.js.map +1 -1
  32. package/dist/specs/parameters/collection-format/mockapi.js +4 -15
  33. package/dist/specs/parameters/collection-format/mockapi.js.map +1 -1
  34. package/dist/specs/parameters/path/mockapi.d.ts +3 -0
  35. package/dist/specs/parameters/path/mockapi.d.ts.map +1 -0
  36. package/dist/specs/parameters/path/mockapi.js +29 -0
  37. package/dist/specs/parameters/path/mockapi.js.map +1 -0
  38. package/dist/specs/parameters/query/mockapi.d.ts +3 -0
  39. package/dist/specs/parameters/query/mockapi.d.ts.map +1 -0
  40. package/dist/specs/parameters/query/mockapi.js +14 -0
  41. package/dist/specs/parameters/query/mockapi.js.map +1 -0
  42. package/dist/specs/parameters/spread/mockapi.d.ts.map +1 -1
  43. package/dist/specs/parameters/spread/mockapi.js +19 -19
  44. package/dist/specs/parameters/spread/mockapi.js.map +1 -1
  45. package/dist/specs/payload/json-merge-patch/mockapi.js +4 -4
  46. package/dist/specs/payload/json-merge-patch/mockapi.js.map +1 -1
  47. package/dist/specs/payload/media-type/mockapi.js +2 -2
  48. package/dist/specs/payload/media-type/mockapi.js.map +1 -1
  49. package/dist/specs/payload/multipart/mockapi.d.ts.map +1 -1
  50. package/dist/specs/payload/multipart/mockapi.js +196 -60
  51. package/dist/specs/payload/multipart/mockapi.js.map +1 -1
  52. package/dist/specs/payload/pageable/mockapi.d.ts.map +1 -1
  53. package/dist/specs/payload/pageable/mockapi.js +626 -14
  54. package/dist/specs/payload/pageable/mockapi.js.map +1 -1
  55. package/dist/specs/payload/xml/mockapi.d.ts +19 -5
  56. package/dist/specs/payload/xml/mockapi.d.ts.map +1 -1
  57. package/dist/specs/payload/xml/mockapi.js +311 -55
  58. package/dist/specs/payload/xml/mockapi.js.map +1 -1
  59. package/dist/specs/response/status-code-range/mockapi.d.ts.map +1 -1
  60. package/dist/specs/response/status-code-range/mockapi.js +5 -9
  61. package/dist/specs/response/status-code-range/mockapi.js.map +1 -1
  62. package/dist/specs/routes/mockapi.js +16 -16
  63. package/dist/specs/routes/mockapi.js.map +1 -1
  64. package/dist/specs/serialization/encoded-name/json/mockapi.js +1 -1
  65. package/dist/specs/serialization/encoded-name/json/mockapi.js.map +1 -1
  66. package/dist/specs/server/versions/not-versioned/mockapi.js +1 -1
  67. package/dist/specs/server/versions/not-versioned/mockapi.js.map +1 -1
  68. package/dist/specs/server/versions/versioned/mockapi.js +8 -12
  69. package/dist/specs/server/versions/versioned/mockapi.js.map +1 -1
  70. package/dist/specs/special-words/mockapi.d.ts.map +1 -1
  71. package/dist/specs/special-words/mockapi.js +59 -6
  72. package/dist/specs/special-words/mockapi.js.map +1 -1
  73. package/dist/specs/streaming/jsonl/mockapi.d.ts +3 -0
  74. package/dist/specs/streaming/jsonl/mockapi.d.ts.map +1 -0
  75. package/dist/specs/streaming/jsonl/mockapi.js +30 -0
  76. package/dist/specs/streaming/jsonl/mockapi.js.map +1 -0
  77. package/dist/specs/type/array/mockapi.js +1 -1
  78. package/dist/specs/type/array/mockapi.js.map +1 -1
  79. package/dist/specs/type/dictionary/mockapi.js +1 -1
  80. package/dist/specs/type/dictionary/mockapi.js.map +1 -1
  81. package/dist/specs/type/enum/extensible/mockapi.js +1 -1
  82. package/dist/specs/type/enum/extensible/mockapi.js.map +1 -1
  83. package/dist/specs/type/enum/fixed/mockapi.js +2 -2
  84. package/dist/specs/type/enum/fixed/mockapi.js.map +1 -1
  85. package/dist/specs/type/file/mockapi.d.ts +3 -0
  86. package/dist/specs/type/file/mockapi.d.ts.map +1 -0
  87. package/dist/specs/type/file/mockapi.js +187 -0
  88. package/dist/specs/type/file/mockapi.js.map +1 -0
  89. package/dist/specs/type/model/empty/mockapi.js +2 -2
  90. package/dist/specs/type/model/empty/mockapi.js.map +1 -1
  91. package/dist/specs/type/model/inheritance/enum-discriminator/mockapi.js +1 -1
  92. package/dist/specs/type/model/inheritance/enum-discriminator/mockapi.js.map +1 -1
  93. package/dist/specs/type/model/inheritance/nested-discriminator/mockapi.js +2 -2
  94. package/dist/specs/type/model/inheritance/nested-discriminator/mockapi.js.map +1 -1
  95. package/dist/specs/type/model/inheritance/not-discriminated/mockapi.js +2 -2
  96. package/dist/specs/type/model/inheritance/not-discriminated/mockapi.js.map +1 -1
  97. package/dist/specs/type/model/inheritance/recursive/mockapi.js +1 -1
  98. package/dist/specs/type/model/inheritance/recursive/mockapi.js.map +1 -1
  99. package/dist/specs/type/model/inheritance/single-discriminator/mockapi.js +2 -2
  100. package/dist/specs/type/model/inheritance/single-discriminator/mockapi.js.map +1 -1
  101. package/dist/specs/type/model/usage/mockapi.js +4 -4
  102. package/dist/specs/type/model/usage/mockapi.js.map +1 -1
  103. package/dist/specs/type/model/visibility/mockapi.js +9 -10
  104. package/dist/specs/type/model/visibility/mockapi.js.map +1 -1
  105. package/dist/specs/type/property/additional-properties/mockapi.js +9 -6
  106. package/dist/specs/type/property/additional-properties/mockapi.js.map +1 -1
  107. package/dist/specs/type/property/nullable/mockapi.js +2 -6
  108. package/dist/specs/type/property/nullable/mockapi.js.map +1 -1
  109. package/dist/specs/type/property/optionality/mockapi.js +1 -1
  110. package/dist/specs/type/property/optionality/mockapi.js.map +1 -1
  111. package/dist/specs/type/property/value-types/mockapi.js +3 -3
  112. package/dist/specs/type/property/value-types/mockapi.js.map +1 -1
  113. package/dist/specs/type/scalar/mockapi.js +9 -9
  114. package/dist/specs/type/scalar/mockapi.js.map +1 -1
  115. package/dist/specs/type/union/discriminated/mockapi.d.ts +3 -0
  116. package/dist/specs/type/union/discriminated/mockapi.d.ts.map +1 -0
  117. package/dist/specs/type/union/discriminated/mockapi.js +212 -0
  118. package/dist/specs/type/union/discriminated/mockapi.js.map +1 -0
  119. package/dist/specs/type/union/mockapi.js +2 -2
  120. package/dist/specs/type/union/mockapi.js.map +1 -1
  121. package/dist/specs/versioning/added/mockapi.js +6 -6
  122. package/dist/specs/versioning/added/mockapi.js.map +1 -1
  123. package/dist/specs/versioning/madeOptional/mockapi.js +2 -2
  124. package/dist/specs/versioning/madeOptional/mockapi.js.map +1 -1
  125. package/dist/specs/versioning/removed/mockapi.js +11 -11
  126. package/dist/specs/versioning/removed/mockapi.js.map +1 -1
  127. package/dist/specs/versioning/renamedFrom/mockapi.js +5 -5
  128. package/dist/specs/versioning/renamedFrom/mockapi.js.map +1 -1
  129. package/dist/specs/versioning/returnTypeChangedFrom/mockapi.js +1 -1
  130. package/dist/specs/versioning/returnTypeChangedFrom/mockapi.js.map +1 -1
  131. package/dist/specs/versioning/typeChangedFrom/mockapi.js +3 -3
  132. package/dist/specs/versioning/typeChangedFrom/mockapi.js.map +1 -1
  133. package/manifest.json +11545 -0
  134. package/package.json +31 -20
  135. package/smoke/petstore/main.tsp +96 -0
  136. package/smoke/todoapp/main.tsp +293 -0
  137. package/spec-summary.md +2137 -121
  138. package/specs/authentication/noauth/union/main.tsp +30 -0
  139. package/specs/authentication/noauth/union/mockapi.ts +27 -0
  140. package/specs/documentation/main.tsp +158 -0
  141. package/specs/documentation/mockapi.ts +59 -0
  142. package/specs/encode/array/main.tsp +339 -0
  143. package/specs/encode/array/mockapi.ts +83 -0
  144. package/specs/encode/bytes/main.tsp +29 -20
  145. package/specs/encode/bytes/mockapi.ts +13 -31
  146. package/specs/encode/datetime/main.tsp +2 -7
  147. package/specs/encode/datetime/mockapi.ts +2 -2
  148. package/specs/encode/duration/main.tsp +420 -7
  149. package/specs/encode/duration/mockapi.ts +221 -2
  150. package/specs/encode/numeric/mockapi.ts +2 -2
  151. package/specs/parameters/basic/mockapi.ts +3 -3
  152. package/specs/parameters/body-optionality/main.tsp +2 -0
  153. package/specs/parameters/body-optionality/mockapi.ts +24 -4
  154. package/specs/parameters/collection-format/main.tsp +5 -25
  155. package/specs/parameters/collection-format/mockapi.ts +4 -16
  156. package/specs/parameters/path/main.tsp +48 -0
  157. package/specs/parameters/path/mockapi.ts +34 -0
  158. package/specs/parameters/query/main.tsp +22 -0
  159. package/specs/parameters/query/mockapi.ts +15 -0
  160. package/specs/parameters/spread/mockapi.ts +19 -19
  161. package/specs/payload/json-merge-patch/main.tsp +2 -2
  162. package/specs/payload/json-merge-patch/mockapi.ts +4 -4
  163. package/specs/payload/media-type/mockapi.ts +2 -2
  164. package/specs/payload/multipart/main.tsp +230 -32
  165. package/specs/payload/multipart/mockapi.ts +207 -59
  166. package/specs/payload/pageable/main.tsp +648 -0
  167. package/specs/payload/pageable/mockapi.ts +691 -14
  168. package/specs/payload/xml/main.tsp +532 -132
  169. package/specs/payload/xml/mockapi.ts +402 -67
  170. package/specs/response/status-code-range/main.tsp +2 -2
  171. package/specs/response/status-code-range/mockapi.ts +5 -9
  172. package/specs/routes/main.tsp +29 -29
  173. package/specs/routes/mockapi.ts +16 -16
  174. package/specs/serialization/encoded-name/json/main.tsp +1 -1
  175. package/specs/serialization/encoded-name/json/mockapi.ts +1 -1
  176. package/specs/server/endpoint/not-defined/main.tsp +1 -3
  177. package/specs/server/path/multiple/main.tsp +3 -5
  178. package/specs/server/versions/not-versioned/mockapi.ts +1 -1
  179. package/specs/server/versions/versioned/main.tsp +1 -1
  180. package/specs/server/versions/versioned/mockapi.ts +6 -12
  181. package/specs/special-headers/conditional-request/main.tsp +1 -1
  182. package/specs/special-headers/repeatability/main.tsp +2 -2
  183. package/specs/special-words/main.tsp +124 -6
  184. package/specs/special-words/mockapi.ts +62 -6
  185. package/specs/streaming/jsonl/main.tsp +33 -0
  186. package/specs/streaming/jsonl/mockapi.ts +32 -0
  187. package/specs/type/array/mockapi.ts +1 -1
  188. package/specs/type/dictionary/mockapi.ts +1 -1
  189. package/specs/type/enum/extensible/main.tsp +18 -2
  190. package/specs/type/enum/extensible/mockapi.ts +1 -1
  191. package/specs/type/enum/fixed/main.tsp +15 -3
  192. package/specs/type/enum/fixed/mockapi.ts +2 -2
  193. package/specs/type/file/main.tsp +109 -0
  194. package/specs/type/file/mockapi.ts +200 -0
  195. package/specs/type/model/empty/mockapi.ts +2 -2
  196. package/specs/type/model/inheritance/enum-discriminator/mockapi.ts +1 -1
  197. package/specs/type/model/inheritance/nested-discriminator/mockapi.ts +2 -2
  198. package/specs/type/model/inheritance/not-discriminated/mockapi.ts +2 -2
  199. package/specs/type/model/inheritance/recursive/mockapi.ts +1 -1
  200. package/specs/type/model/inheritance/single-discriminator/mockapi.ts +2 -2
  201. package/specs/type/model/usage/mockapi.ts +4 -4
  202. package/specs/type/model/visibility/main.tsp +9 -17
  203. package/specs/type/model/visibility/mockapi.ts +9 -10
  204. package/specs/type/property/additional-properties/main.tsp +17 -17
  205. package/specs/type/property/additional-properties/mockapi.ts +10 -10
  206. package/specs/type/property/nullable/mockapi.ts +7 -8
  207. package/specs/type/property/optionality/mockapi.ts +1 -1
  208. package/specs/type/property/value-types/mockapi.ts +3 -3
  209. package/specs/type/scalar/main.tsp +58 -9
  210. package/specs/type/scalar/mockapi.ts +9 -9
  211. package/specs/type/union/discriminated/main.tsp +251 -0
  212. package/specs/type/union/discriminated/mockapi.ts +230 -0
  213. package/specs/type/union/mockapi.ts +2 -2
  214. package/specs/versioning/added/mockapi.ts +6 -6
  215. package/specs/versioning/madeOptional/mockapi.ts +2 -2
  216. package/specs/versioning/removed/main.tsp +5 -5
  217. package/specs/versioning/removed/mockapi.ts +11 -11
  218. package/specs/versioning/renamedFrom/mockapi.ts +5 -5
  219. package/specs/versioning/returnTypeChangedFrom/main.tsp +17 -2
  220. package/specs/versioning/returnTypeChangedFrom/mockapi.ts +1 -1
  221. package/specs/versioning/typeChangedFrom/mockapi.ts +3 -3
  222. package/temp/.tsbuildinfo +1 -1
  223. package/tsconfig.build.json +0 -4
  224. package/tspconfig.yaml +0 -2
@@ -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
+ }
@@ -0,0 +1,230 @@
1
+ import { json, MockRequest, passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";
2
+
3
+ export const Scenarios: Record<string, ScenarioMockApi> = {};
4
+
5
+ // Test data for discriminated union scenarios
6
+ const catData = {
7
+ name: "Whiskers",
8
+ meow: true,
9
+ };
10
+
11
+ const dogData = {
12
+ name: "Rex",
13
+ bark: false,
14
+ };
15
+
16
+ // Envelope discriminated union (default serialization)
17
+ const envelopeCatBody = {
18
+ kind: "cat",
19
+ value: catData,
20
+ };
21
+
22
+ const envelopeDogBody = {
23
+ kind: "dog",
24
+ value: dogData,
25
+ };
26
+
27
+ Scenarios.Type_Union_Discriminated_Envelope_Object_Default_get = passOnSuccess({
28
+ uri: "/type/union/discriminated/envelope/object/default",
29
+ method: "get",
30
+ request: {},
31
+ response: {
32
+ status: 200,
33
+ body: json(envelopeCatBody),
34
+ },
35
+ handler: (req: MockRequest) => {
36
+ const kind = req.query.kind as string | undefined;
37
+
38
+ // When kind is null or "cat", return response for "cat"
39
+ // When kind is "dog", return response for "dog"
40
+ if (kind === "dog") {
41
+ return {
42
+ status: 200,
43
+ body: json(envelopeDogBody),
44
+ };
45
+ } else {
46
+ // Default case: when kind is null, undefined, or "cat"
47
+ return {
48
+ status: 200,
49
+ body: json(envelopeCatBody),
50
+ };
51
+ }
52
+ },
53
+ kind: "MockApiDefinition",
54
+ });
55
+
56
+ Scenarios.Type_Union_Discriminated_Envelope_Object_Default_put = passOnSuccess({
57
+ uri: "/type/union/discriminated/envelope/object/default",
58
+ method: "put",
59
+ request: {
60
+ body: json(envelopeCatBody),
61
+ },
62
+ response: {
63
+ status: 200,
64
+ body: json(envelopeCatBody),
65
+ },
66
+ kind: "MockApiDefinition",
67
+ });
68
+
69
+ // Custom names discriminated union
70
+ const customNamesCatBody = {
71
+ petType: "cat",
72
+ petData: catData,
73
+ };
74
+
75
+ const customNamesDogBody = {
76
+ petType: "dog",
77
+ petData: dogData,
78
+ };
79
+
80
+ Scenarios.Type_Union_Discriminated_Envelope_Object_CustomProperties_get = passOnSuccess({
81
+ uri: "/type/union/discriminated/envelope/object/custom-properties",
82
+ method: "get",
83
+ request: {},
84
+ response: {
85
+ status: 200,
86
+ body: json(customNamesCatBody),
87
+ },
88
+ handler: (req: MockRequest) => {
89
+ const petType = req.query.petType as string | undefined;
90
+
91
+ // When petType is null or "cat", return response for "cat"
92
+ // When petType is "dog", return response for "dog"
93
+ if (petType === "dog") {
94
+ return {
95
+ status: 200,
96
+ body: json(customNamesDogBody),
97
+ };
98
+ } else {
99
+ // Default case: when petType is null, undefined, or "cat"
100
+ return {
101
+ status: 200,
102
+ body: json(customNamesCatBody),
103
+ };
104
+ }
105
+ },
106
+ kind: "MockApiDefinition",
107
+ });
108
+
109
+ Scenarios.Type_Union_Discriminated_Envelope_Object_CustomProperties_put = passOnSuccess({
110
+ uri: "/type/union/discriminated/envelope/object/custom-properties",
111
+ method: "put",
112
+ request: {
113
+ body: json(customNamesCatBody),
114
+ },
115
+ response: {
116
+ status: 200,
117
+ body: json(customNamesCatBody),
118
+ },
119
+ kind: "MockApiDefinition",
120
+ });
121
+
122
+ // Inline discriminated union (no envelope)
123
+ const inlineCatBody = {
124
+ kind: "cat",
125
+ name: "Whiskers",
126
+ meow: true,
127
+ };
128
+
129
+ const inlineDogBody = {
130
+ kind: "dog",
131
+ name: "Rex",
132
+ bark: false,
133
+ };
134
+
135
+ Scenarios.Type_Union_Discriminated_NoEnvelope_Default_get = passOnSuccess({
136
+ uri: "/type/union/discriminated/no-envelope/default",
137
+ method: "get",
138
+ request: {},
139
+ response: {
140
+ status: 200,
141
+ body: json(inlineCatBody),
142
+ },
143
+ handler: (req: MockRequest) => {
144
+ const kind = req.query.kind as string | undefined;
145
+
146
+ // When kind is null or "cat", return response for "cat"
147
+ // When kind is "dog", return response for "dog"
148
+ if (kind === "dog") {
149
+ return {
150
+ status: 200,
151
+ body: json(inlineDogBody),
152
+ };
153
+ } else {
154
+ // Default case: when kind is null, undefined, or "cat"
155
+ return {
156
+ status: 200,
157
+ body: json(inlineCatBody),
158
+ };
159
+ }
160
+ },
161
+ kind: "MockApiDefinition",
162
+ });
163
+
164
+ Scenarios.Type_Union_Discriminated_NoEnvelope_Default_put = passOnSuccess({
165
+ uri: "/type/union/discriminated/no-envelope/default",
166
+ method: "put",
167
+ request: {
168
+ body: json(inlineCatBody),
169
+ },
170
+ response: {
171
+ status: 200,
172
+ body: json(inlineCatBody),
173
+ },
174
+ kind: "MockApiDefinition",
175
+ });
176
+
177
+ // Inline discriminated union with custom discriminator property name
178
+ const inlineCustomCatBody = {
179
+ type: "cat",
180
+ name: "Whiskers",
181
+ meow: true,
182
+ };
183
+
184
+ const inlineCustomDogBody = {
185
+ type: "dog",
186
+ name: "Rex",
187
+ bark: false,
188
+ };
189
+
190
+ Scenarios.Type_Union_Discriminated_NoEnvelope_CustomDiscriminator_get = passOnSuccess({
191
+ uri: "/type/union/discriminated/no-envelope/custom-discriminator",
192
+ method: "get",
193
+ request: {},
194
+ response: {
195
+ status: 200,
196
+ body: json(inlineCustomCatBody),
197
+ },
198
+ handler: (req: MockRequest) => {
199
+ const type = req.query.type as string | undefined;
200
+
201
+ // When type is null or "cat", return response for "cat"
202
+ // When type is "dog", return response for "dog"
203
+ if (type === "dog") {
204
+ return {
205
+ status: 200,
206
+ body: json(inlineCustomDogBody),
207
+ };
208
+ } else {
209
+ // Default case: when type is null, undefined, or "cat"
210
+ return {
211
+ status: 200,
212
+ body: json(inlineCustomCatBody),
213
+ };
214
+ }
215
+ },
216
+ kind: "MockApiDefinition",
217
+ });
218
+
219
+ Scenarios.Type_Union_Discriminated_NoEnvelope_CustomDiscriminator_put = passOnSuccess({
220
+ uri: "/type/union/discriminated/no-envelope/custom-discriminator",
221
+ method: "put",
222
+ request: {
223
+ body: json(inlineCustomCatBody),
224
+ },
225
+ response: {
226
+ status: 200,
227
+ body: json(inlineCustomCatBody),
228
+ },
229
+ kind: "MockApiDefinition",
230
+ });
@@ -20,9 +20,9 @@ function createPostServerTests(url: string, value: unknown) {
20
20
  uri: url,
21
21
  method: `post`,
22
22
  request: {
23
- body: {
23
+ body: json({
24
24
  prop: value,
25
- },
25
+ }),
26
26
  },
27
27
  response: {
28
28
  status: 204,
@@ -6,11 +6,11 @@ Scenarios.Versioning_Added_v1 = passOnSuccess({
6
6
  uri: `/versioning/added/api-version:v2/v1`,
7
7
  method: `post`,
8
8
  request: {
9
- body: {
9
+ body: json({
10
10
  prop: "foo",
11
11
  enumProp: "enumMemberV2",
12
12
  unionProp: 10,
13
- },
13
+ }),
14
14
  headers: {
15
15
  "header-v2": "bar",
16
16
  },
@@ -26,11 +26,11 @@ Scenarios.Versioning_Added_v2 = passOnSuccess({
26
26
  uri: `/versioning/added/api-version:v2/v2`,
27
27
  method: `post`,
28
28
  request: {
29
- body: {
29
+ body: json({
30
30
  prop: "foo",
31
31
  enumProp: "enumMember",
32
32
  unionProp: "bar",
33
- },
33
+ }),
34
34
  },
35
35
  response: {
36
36
  status: 200,
@@ -43,11 +43,11 @@ Scenarios.Versioning_Added_InterfaceV2 = passOnSuccess({
43
43
  uri: `/versioning/added/api-version:v2/interface-v2/v2`,
44
44
  method: `post`,
45
45
  request: {
46
- body: {
46
+ body: json({
47
47
  prop: "foo",
48
48
  enumProp: "enumMember",
49
49
  unionProp: "bar",
50
- },
50
+ }),
51
51
  },
52
52
  response: {
53
53
  status: 200,
@@ -6,9 +6,9 @@ Scenarios.Versioning_MadeOptional_test = passOnSuccess({
6
6
  uri: `/versioning/made-optional/api-version:v2/test`,
7
7
  method: `post`,
8
8
  request: {
9
- body: {
9
+ body: json({
10
10
  prop: "foo",
11
- },
11
+ }),
12
12
  },
13
13
  response: {
14
14
  status: 200,
@@ -115,7 +115,7 @@ scalar V1Scalar extends int32;
115
115
  /**
116
116
  * This operation should not be generated with latest version's signature.
117
117
  */
118
- #suppress "@azure-tools/cadl-ranch-expect/missing-scenario" "by design"
118
+ #suppress "@typespec/spector/missing-scenario" "by design"
119
119
  @route("/v1")
120
120
  @post
121
121
  @removed(Versions.v2)
@@ -140,7 +140,7 @@ op v2(@body body: ModelV2, @removed(Versions.v2) @query param: string): ModelV2;
140
140
  @route("/interface-v1")
141
141
  @removed(Versions.v2)
142
142
  interface InterfaceV1 {
143
- #suppress "@azure-tools/cadl-ranch-expect/missing-scenario" "by design"
143
+ #suppress "@typespec/spector/missing-scenario" "by design"
144
144
  @post
145
145
  @route("/v1")
146
146
  v1InInterface(@body body: ModelV1): ModelV1;
@@ -149,7 +149,7 @@ interface InterfaceV1 {
149
149
  /** This operation will pass different paths and different request bodies based on different versions. */
150
150
  @scenario
151
151
  @scenarioDoc("""
152
- path: "/versioning/removed/api-version[:]v1/v3"
152
+ path: "/versioning/removed/api-version:v1/v3"
153
153
  Expected request body:
154
154
  ```json
155
155
  { "id": "123", "enumProp": "enumMemberV1" }
@@ -160,7 +160,7 @@ interface InterfaceV1 {
160
160
  { "id": "123", "enumProp": "enumMemberV1" }
161
161
  ```
162
162
 
163
- path: "/versioning/removed/api-version[:]v2preview/v3"
163
+ path: "/versioning/removed/api-version:v2preview/v3"
164
164
  Expected request body:
165
165
  ```json
166
166
  { "id": "123"}
@@ -171,7 +171,7 @@ interface InterfaceV1 {
171
171
  { "id": "123"}
172
172
  ```
173
173
 
174
- path: "/versioning/removed/api-version[:]v2/v3"
174
+ path: "/versioning/removed/api-version:v2/v3"
175
175
  Expected request body:
176
176
  ```json
177
177
  { "id": "123", "enumProp": "enumMemberV1" }
@@ -6,11 +6,11 @@ Scenarios.Versioning_Removed_v2 = passOnSuccess({
6
6
  uri: `/versioning/removed/api-version:v2/v2`,
7
7
  method: `post`,
8
8
  request: {
9
- body: {
9
+ body: json({
10
10
  prop: "foo",
11
11
  enumProp: "enumMemberV2",
12
12
  unionProp: "bar",
13
- },
13
+ }),
14
14
  },
15
15
  response: {
16
16
  status: 200,
@@ -20,13 +20,13 @@ Scenarios.Versioning_Removed_v2 = passOnSuccess({
20
20
  });
21
21
 
22
22
  Scenarios.Versioning_Removed_modelV3 = passOnSuccess({
23
- uri: `/versioning/removed/api-version[:]v1/v3`,
23
+ uri: `/versioning/removed/api-version\\:v1/v3`,
24
24
  method: "post",
25
25
  request: {
26
- body: {
26
+ body: json({
27
27
  id: "123",
28
28
  enumProp: "enumMemberV1",
29
- },
29
+ }),
30
30
  },
31
31
  response: {
32
32
  status: 200,
@@ -36,13 +36,13 @@ Scenarios.Versioning_Removed_modelV3 = passOnSuccess({
36
36
  });
37
37
 
38
38
  Scenarios.Versioning_Removed_modelV3_V2 = passOnSuccess({
39
- uri: `/versioning/removed/api-version[:]v2/v3`,
39
+ uri: `/versioning/removed/api-version\\:v2/v3`,
40
40
  method: "post",
41
41
  request: {
42
- body: {
42
+ body: json({
43
43
  id: "123",
44
44
  enumProp: "enumMemberV1",
45
- },
45
+ }),
46
46
  },
47
47
  response: {
48
48
  status: 200,
@@ -52,12 +52,12 @@ Scenarios.Versioning_Removed_modelV3_V2 = passOnSuccess({
52
52
  });
53
53
 
54
54
  Scenarios.Versioning_Removed_modelV3_V2preview = passOnSuccess({
55
- uri: `/versioning/removed/api-version[:]v2preview/v3`,
55
+ uri: `/versioning/removed/api-version\\:v2preview/v3`,
56
56
  method: "post",
57
57
  request: {
58
- body: {
58
+ body: json({
59
59
  id: "123",
60
- },
60
+ }),
61
61
  },
62
62
  response: {
63
63
  status: 200,
@@ -6,12 +6,12 @@ Scenarios.Versioning_RenamedFrom_newOp = passOnSuccess({
6
6
  uri: `/versioning/renamed-from/api-version:v2/test`,
7
7
  method: `post`,
8
8
  request: {
9
- body: {
9
+ body: json({
10
10
  newProp: "foo",
11
11
  enumProp: "newEnumMember",
12
12
  unionProp: 10,
13
- },
14
- params: {
13
+ }),
14
+ query: {
15
15
  newQuery: "bar",
16
16
  },
17
17
  },
@@ -26,11 +26,11 @@ Scenarios.Versioning_RenamedFrom_NewInterface = passOnSuccess({
26
26
  uri: `/versioning/renamed-from/api-version:v2/interface/test`,
27
27
  method: `post`,
28
28
  request: {
29
- body: {
29
+ body: json({
30
30
  newProp: "foo",
31
31
  enumProp: "newEnumMember",
32
32
  unionProp: 10,
33
- },
33
+ }),
34
34
  },
35
35
  response: {
36
36
  status: 200,
@@ -53,5 +53,20 @@ enum Versions {
53
53
  """)
54
54
  @route("/test")
55
55
  @post
56
- @returnTypeChangedFrom(Versions.v2, int32)
57
- op test(@body body: string): string;
56
+ @returnTypeChangedFrom(
57
+ Versions.v2,
58
+ {
59
+ @header
60
+ contentType: "application/json",
61
+
62
+ @body
63
+ body: int32,
64
+ }
65
+ )
66
+ op test(@header contentType: "application/json", @body body: string): {
67
+ @header
68
+ contentType: "application/json";
69
+
70
+ @body
71
+ body: string;
72
+ };