@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
@@ -56,7 +56,7 @@ interface Operations {
56
56
  @opNameScenario("and") and(): void;
57
57
  @opNameScenario("as") as(): void;
58
58
  @opNameScenario("assert") assert(): void;
59
- @opNameScenario("async") async(): void;
59
+ @opNameScenario("async") `async`(): void;
60
60
  @opNameScenario("await") await(): void;
61
61
  @opNameScenario("break") break(): void;
62
62
  @opNameScenario("class") class(): void;
@@ -84,7 +84,7 @@ interface Operations {
84
84
  @opNameScenario("return") `return`(): void;
85
85
  @opNameScenario("try") try(): void;
86
86
  @opNameScenario("while") while(): void;
87
- @opNameScenario("with") with(): void;
87
+ @opNameScenario("with") `with`(): void;
88
88
  @opNameScenario("yield") yield(): void;
89
89
  }
90
90
 
@@ -144,7 +144,7 @@ namespace Models {
144
144
  model and is Base;
145
145
  model as is Base;
146
146
  model assert is Base;
147
- model async is Base;
147
+ model `async` is Base;
148
148
  model await is Base;
149
149
  model break is Base;
150
150
  model class is Base;
@@ -172,13 +172,13 @@ namespace Models {
172
172
  model `return` is Base;
173
173
  model try is Base;
174
174
  model while is Base;
175
- model with is Base;
175
+ model `with` is Base;
176
176
  model yield is Base;
177
177
 
178
178
  @modelNameScenario("and") op withAnd(@body body: and): void;
179
179
  @modelNameScenario("as") op withAs(@body body: as): void;
180
180
  @modelNameScenario("assert") op withAssert(@body body: assert): void;
181
- @modelNameScenario("async") op withAsync(@body body: async): void;
181
+ @modelNameScenario("async") op withAsync(@body body: `async`): void;
182
182
  @modelNameScenario("await") op withAwait(@body body: await): void;
183
183
  @modelNameScenario("break") op withBreak(@body body: break): void;
184
184
  @modelNameScenario("class") op withClass(@body body: class): void;
@@ -206,7 +206,7 @@ namespace Models {
206
206
  @modelNameScenario("return") op withReturn(@body body: `return`): void;
207
207
  @modelNameScenario("try") op withTry(@body body: try): void;
208
208
  @modelNameScenario("while") op withWhile(@body body: while): void;
209
- @modelNameScenario("with") op withWith(@body body: with): void;
209
+ @modelNameScenario("with") op withWith(@body body: `with`): void;
210
210
  @modelNameScenario("yield") op withYield(@body body: yield): void;
211
211
  }
212
212
 
@@ -231,4 +231,42 @@ namespace ModelProperties {
231
231
  """)
232
232
  @route("same-as-model")
233
233
  op sameAsModel(@body body: SameAsModel): void;
234
+
235
+ // Python dict method names that could conflict
236
+ model DictMethods {
237
+ keys: string;
238
+ items: string;
239
+ values: string;
240
+ popitem: string;
241
+ clear: string;
242
+ update: string;
243
+ setdefault: string;
244
+ pop: string;
245
+ get: string;
246
+ copy: string;
247
+ }
248
+
249
+ @scenario
250
+ @scenarioDoc("""
251
+ Verify that model properties can use names that are Python dict methods. These names (keys, items, values, etc.) may conflict with Python's dict class methods.
252
+
253
+ Send
254
+
255
+ ```json
256
+ {
257
+ "keys": "ok",
258
+ "items": "ok",
259
+ "values": "ok",
260
+ "popitem": "ok",
261
+ "clear": "ok",
262
+ "update": "ok",
263
+ "setdefault": "ok",
264
+ "pop": "ok",
265
+ "get": "ok",
266
+ "copy": "ok"
267
+ }
268
+ ```
269
+ """)
270
+ @route("dict-methods")
271
+ op dictMethods(@body body: DictMethods): void;
234
272
  }
@@ -1,4 +1,4 @@
1
- import { passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";
1
+ import { json, passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";
2
2
 
3
3
  export const Scenarios: Record<string, ScenarioMockApi> = {};
4
4
 
@@ -6,9 +6,32 @@ Scenarios.SpecialWords_ModelProperties_sameAsModel = passOnSuccess({
6
6
  uri: "/special-words/model-properties/same-as-model",
7
7
  method: "post",
8
8
  request: {
9
- body: {
9
+ body: json({
10
10
  SameAsModel: "ok",
11
- },
11
+ }),
12
+ },
13
+ response: {
14
+ status: 204,
15
+ },
16
+ kind: "MockApiDefinition",
17
+ });
18
+
19
+ Scenarios.SpecialWords_ModelProperties_dictMethods = passOnSuccess({
20
+ uri: "/special-words/model-properties/dict-methods",
21
+ method: "post",
22
+ request: {
23
+ body: json({
24
+ keys: "ok",
25
+ items: "ok",
26
+ values: "ok",
27
+ popitem: "ok",
28
+ clear: "ok",
29
+ update: "ok",
30
+ setdefault: "ok",
31
+ pop: "ok",
32
+ get: "ok",
33
+ copy: "ok",
34
+ }),
12
35
  },
13
36
  response: {
14
37
  status: 204,
@@ -21,9 +44,9 @@ function createModelsTests(uri: string) {
21
44
  uri,
22
45
  method: "post",
23
46
  request: {
24
- body: {
47
+ body: json({
25
48
  name: "ok",
26
- },
49
+ }),
27
50
  },
28
51
  response: {
29
52
  status: 204,
@@ -134,7 +157,7 @@ function createParametersTests(uri: string, data: any, paramName: string) {
134
157
  uri,
135
158
  method: "get",
136
159
  request: {
137
- params: data,
160
+ query: data,
138
161
  },
139
162
  response: {
140
163
  status: 204,
@@ -0,0 +1,33 @@
1
+ import "@typespec/http";
2
+ import "@typespec/http/streams";
3
+ import "@typespec/spector";
4
+
5
+ using Http;
6
+ using Http.Streams;
7
+ using Spector;
8
+
9
+ @doc("Test of jsonl streaming.")
10
+ @scenarioService("/streaming/jsonl")
11
+ namespace Streaming.Jsonl;
12
+
13
+ @route("basic")
14
+ namespace Basic {
15
+ @scenario
16
+ @scenarioDoc("""
17
+ Basic jsonl streaming for request.
18
+ """)
19
+ @route("send")
20
+ @post
21
+ op send(stream: JsonlStream<Info>): NoContentResponse;
22
+
23
+ @scenario
24
+ @scenarioDoc("""
25
+ Basic jsonl streaming for response.
26
+ """)
27
+ @route("receive")
28
+ op receive(): JsonlStream<Info>;
29
+
30
+ model Info {
31
+ desc: string;
32
+ }
33
+ }
@@ -0,0 +1,32 @@
1
+ import { passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";
2
+
3
+ export const Scenarios: Record<string, ScenarioMockApi> = {};
4
+
5
+ Scenarios.Streaming_Jsonl_Basic_send = passOnSuccess({
6
+ uri: "/streaming/jsonl/basic/send",
7
+ method: "post",
8
+ request: {
9
+ body: {
10
+ rawContent: Buffer.from('{"desc": "one"}\n{"desc": "two"}\n{"desc": "three"}'),
11
+ contentType: "application/jsonl",
12
+ },
13
+ },
14
+ response: {
15
+ status: 204,
16
+ },
17
+ kind: "MockApiDefinition",
18
+ });
19
+
20
+ Scenarios.Streaming_Jsonl_Basic_receive = passOnSuccess({
21
+ uri: "/streaming/jsonl/basic/receive",
22
+ method: "get",
23
+ request: {},
24
+ response: {
25
+ status: 200,
26
+ body: {
27
+ rawContent: Buffer.from('{"desc": "one"}\n{"desc": "two"}\n{"desc": "three"}'),
28
+ contentType: "application/jsonl",
29
+ },
30
+ },
31
+ kind: "MockApiDefinition",
32
+ });
@@ -18,7 +18,7 @@ function createServerTests(uri: string, data: any) {
18
18
  uri,
19
19
  method: "put",
20
20
  request: {
21
- body: data,
21
+ body: json(data),
22
22
  },
23
23
  response: {
24
24
  status: 204,
@@ -18,7 +18,7 @@ function createServerTests(uri: string, data: any) {
18
18
  uri,
19
19
  method: "put",
20
20
  request: {
21
- body: data,
21
+ body: json(data),
22
22
  },
23
23
  response: {
24
24
  status: 204,
@@ -40,6 +40,9 @@ interface String {
40
40
  @get
41
41
  @route("/known-value")
42
42
  getKnownValue(): {
43
+ @header
44
+ contentType: "application/json";
45
+
43
46
  @body body: DaysOfWeekExtensibleEnum;
44
47
  };
45
48
 
@@ -48,6 +51,9 @@ interface String {
48
51
  @get
49
52
  @route("/unknown-value")
50
53
  getUnknownValue(): {
54
+ @header
55
+ contentType: "application/json";
56
+
51
57
  @body body: DaysOfWeekExtensibleEnum;
52
58
  };
53
59
 
@@ -55,11 +61,21 @@ interface String {
55
61
  @scenarioDoc("Expect to send a known value. Mock api expect to receive 'Monday'")
56
62
  @put
57
63
  @route("/known-value")
58
- putKnownValue(@body body: DaysOfWeekExtensibleEnum): void;
64
+ putKnownValue(
65
+ @header
66
+ contentType: "application/json",
67
+
68
+ @body body: DaysOfWeekExtensibleEnum,
69
+ ): void;
59
70
 
60
71
  @scenario
61
72
  @scenarioDoc("Expect to handle an unknown value. Mock api expect to receive 'Weekend'")
62
73
  @put
63
74
  @route("/unknown-value")
64
- putUnknownValue(@body body: DaysOfWeekExtensibleEnum): void;
75
+ putUnknownValue(
76
+ @header
77
+ contentType: "application/json",
78
+
79
+ @body body: DaysOfWeekExtensibleEnum,
80
+ ): void;
65
81
  }
@@ -18,7 +18,7 @@ function createMockServerTests(uri: string, data: any) {
18
18
  uri,
19
19
  method: "put",
20
20
  request: {
21
- body: data,
21
+ body: json(data),
22
22
  headers: {
23
23
  "Content-Type": "text/plain",
24
24
  },
@@ -40,7 +40,13 @@ interface String {
40
40
  @get
41
41
  @route("/known-value")
42
42
  @doc("getKnownValue")
43
- getKnownValue(): DaysOfWeekEnum;
43
+ getKnownValue(): {
44
+ @header
45
+ contentType: "application/json";
46
+
47
+ @body
48
+ body: DaysOfWeekEnum;
49
+ };
44
50
 
45
51
  #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "For testing"
46
52
  @scenario
@@ -48,7 +54,10 @@ interface String {
48
54
  @put
49
55
  @route("/known-value")
50
56
  @doc("putKnownValue")
51
- putKnownValue(@body @doc("_") body: DaysOfWeekEnum): void;
57
+ putKnownValue(
58
+ @header contentType: "application/json",
59
+ @body @doc("_") body: DaysOfWeekEnum,
60
+ ): void;
52
61
 
53
62
  #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "For testing"
54
63
  @scenario
@@ -56,5 +65,8 @@ interface String {
56
65
  @put
57
66
  @route("/unknown-value")
58
67
  @doc("putUnknownValue")
59
- putUnknownValue(@body @doc("_") body: DaysOfWeekEnum): void;
68
+ putUnknownValue(
69
+ @header contentType: "application/json",
70
+ @body @doc("_") body: DaysOfWeekEnum,
71
+ ): void;
60
72
  }
@@ -16,7 +16,7 @@ Scenarios.Type_Enum_Fixed_String_putKnownValue = passOnSuccess({
16
16
  uri: "/type/enum/fixed/string/known-value",
17
17
  method: "put",
18
18
  request: {
19
- body: "Monday",
19
+ body: json("Monday"),
20
20
  headers: {
21
21
  "Content-Type": "application/json",
22
22
  },
@@ -31,7 +31,7 @@ Scenarios.Type_Enum_Fixed_String_putUnknownValue = passOnCode(500, {
31
31
  uri: "/type/enum/fixed/string/unknown-value",
32
32
  method: "put",
33
33
  request: {
34
- body: "Weekend",
34
+ body: json("Weekend"),
35
35
  headers: {
36
36
  "Content-Type": "application/json",
37
37
  },
@@ -8,7 +8,7 @@ Scenarios.Type_Model_Empty_putEmpty = passOnSuccess({
8
8
  uri: "/type/model/empty/alone",
9
9
  method: "put",
10
10
  request: {
11
- body: body,
11
+ body: json(body),
12
12
  },
13
13
  response: {
14
14
  status: 204,
@@ -30,7 +30,7 @@ Scenarios.Type_Model_Empty_postRoundTripEmpty = passOnSuccess({
30
30
  uri: "/type/model/empty/round-trip",
31
31
  method: "post",
32
32
  request: {
33
- body: body,
33
+ body: json(body),
34
34
  },
35
35
  response: {
36
36
  status: 200,
@@ -39,7 +39,7 @@ function createGetPutServerTests(uri: string, data: any) {
39
39
  uri: uri,
40
40
  method: "put",
41
41
  request: {
42
- body: data,
42
+ body: json(data),
43
43
  },
44
44
  response: {
45
45
  status: 204,
@@ -78,7 +78,7 @@ Scenarios.Type_Model_Inheritance_NestedDiscriminator_putModel = passOnSuccess({
78
78
  uri: "/type/model/inheritance/nested-discriminator/model",
79
79
  method: "put",
80
80
  request: {
81
- body: validPolymorphicBody,
81
+ body: json(validPolymorphicBody),
82
82
  },
83
83
  response: {
84
84
  status: 204,
@@ -100,7 +100,7 @@ Scenarios.Type_Model_Inheritance_NestedDiscriminator_putRecursiveModel = passOnS
100
100
  uri: "/type/model/inheritance/nested-discriminator/recursivemodel",
101
101
  method: "put",
102
102
  request: {
103
- body: validRecursiveBody,
103
+ body: json(validRecursiveBody),
104
104
  },
105
105
  response: {
106
106
  status: 204,
@@ -8,7 +8,7 @@ Scenarios.Type_Model_Inheritance_NotDiscriminated_postValid = passOnSuccess({
8
8
  uri: "/type/model/inheritance/not-discriminated/valid",
9
9
  method: "post",
10
10
  request: {
11
- body: inheritanceValidBody,
11
+ body: json(inheritanceValidBody),
12
12
  },
13
13
  response: {
14
14
  status: 204,
@@ -29,7 +29,7 @@ Scenarios.Type_Model_Inheritance_NotDiscriminated_putValid = passOnSuccess({
29
29
  uri: "/type/model/inheritance/not-discriminated/valid",
30
30
  method: "put",
31
31
  request: {
32
- body: inheritanceValidBody,
32
+ body: json(inheritanceValidBody),
33
33
  },
34
34
  response: {
35
35
  status: 200,
@@ -22,7 +22,7 @@ Scenarios.Type_Model_Inheritance_Recursive_put = passOnSuccess({
22
22
  uri: "/type/model/inheritance/recursive",
23
23
  method: "put",
24
24
  request: {
25
- body: body,
25
+ body: json(body),
26
26
  },
27
27
  response: {
28
28
  status: 204,
@@ -40,7 +40,7 @@ Scenarios.Type_Model_Inheritance_SingleDiscriminator_putModel = passOnSuccess({
40
40
  uri: "/type/model/inheritance/single-discriminator/model",
41
41
  method: "put",
42
42
  request: {
43
- body: validPolymorphicBody,
43
+ body: json(validPolymorphicBody),
44
44
  },
45
45
  response: {
46
46
  status: 204,
@@ -62,7 +62,7 @@ Scenarios.Type_Model_Inheritance_SingleDiscriminator_putRecursiveModel = passOnS
62
62
  uri: "/type/model/inheritance/single-discriminator/recursivemodel",
63
63
  method: "put",
64
64
  request: {
65
- body: validRecursiveBody,
65
+ body: json(validRecursiveBody),
66
66
  },
67
67
  response: {
68
68
  status: 204,
@@ -8,9 +8,9 @@ Scenarios.Type_Model_Usage_input = passOnSuccess({
8
8
  uri: "/type/model/usage/input",
9
9
  method: "post",
10
10
  request: {
11
- body: {
11
+ body: json({
12
12
  requiredProp: "example-value",
13
- },
13
+ }),
14
14
  },
15
15
  response: {
16
16
  status: 204,
@@ -33,9 +33,9 @@ Scenarios.Type_Model_Usage_inputAndOutput = passOnSuccess({
33
33
  uri: "/type/model/usage/input-output",
34
34
  method: "post",
35
35
  request: {
36
- body: {
36
+ body: json({
37
37
  requiredProp: "example-value",
38
- },
38
+ }),
39
39
  },
40
40
  response: {
41
41
  status: 200,
@@ -11,50 +11,47 @@ namespace Type.Model.Visibility;
11
11
  @doc("Output model with visibility properties.")
12
12
  model VisibilityModel {
13
13
  @doc("Required string, illustrating a readonly property.")
14
- @visibility("read")
14
+ @visibility(Lifecycle.Read)
15
15
  readProp: string;
16
16
 
17
+ #suppress "@typespec/http/metadata-ignored" "For test"
17
18
  @doc("Required int32, illustrating a query property.")
18
- @visibility("query")
19
+ @visibility(Lifecycle.Query)
20
+ @query
19
21
  queryProp: int32;
20
22
 
21
23
  @doc("Required string[], illustrating a create property.")
22
- @visibility("create")
24
+ @visibility(Lifecycle.Create)
23
25
  createProp: string[];
24
26
 
25
27
  @doc("Required int32[], illustrating a update property.")
26
- @visibility("update")
28
+ @visibility(Lifecycle.Update)
27
29
  updateProp: int32[];
28
30
 
29
31
  @doc("Required bool, illustrating a delete property.")
30
- @visibility("delete")
32
+ @visibility(Lifecycle.Delete)
31
33
  deleteProp: boolean;
32
34
 
33
35
  @doc("Property that does not exist in any payload.")
34
- @visibility("none")
36
+ @invisible(Lifecycle)
35
37
  noneProp: "none";
36
38
  }
37
39
 
38
40
  /** RoundTrip model with readonly optional properties. */
39
41
  model ReadOnlyModel {
40
42
  /** Optional readonly nullable int list. */
41
- @visibility("read")
43
+ @visibility(Lifecycle.Read)
42
44
  optionalNullableIntList?: int32[] | null;
43
45
 
44
46
  /** Optional readonly string dictionary. */
45
- @visibility("read")
47
+ @visibility(Lifecycle.Read)
46
48
  optionalStringRecord?: Record<string>;
47
49
  }
48
50
 
49
51
  @scenario
50
52
  @scenarioDoc("""
51
53
  Generate and receive output model with readonly properties.
52
- Expected input body:
53
- ```json
54
- {
55
- queryProp: 123,
56
- }
57
- ```
54
+ Expected no body with `?queryProp=123`.
58
55
 
59
56
  Expected response body:
60
57
  ```json
@@ -64,7 +61,7 @@ model ReadOnlyModel {
64
61
  ```
65
62
  """)
66
63
  @get
67
- op getModel(@body input: VisibilityModel): {
64
+ op getModel(@bodyRoot input: VisibilityModel): {
68
65
  @body
69
66
  output: VisibilityModel;
70
67
  };
@@ -72,15 +69,10 @@ op getModel(@body input: VisibilityModel): {
72
69
  @scenario
73
70
  @scenarioDoc("""
74
71
  Generate abd send put model with write/create properties.
75
- Expected input body:
76
- ```json
77
- {
78
- queryProp: 123,
79
- }
80
- ```
72
+ Expected no body with `?queryProp=123`.
81
73
  """)
82
74
  @head
83
- op headModel(@body input: VisibilityModel): OkResponse;
75
+ op headModel(@bodyRoot input: VisibilityModel): OkResponse;
84
76
 
85
77
  @scenario
86
78
  @scenarioDoc("""
@@ -106,7 +98,7 @@ op putModel(@body input: VisibilityModel): void;
106
98
  }
107
99
  ```
108
100
  """)
109
- @patch
101
+ @patch(#{ implicitOptionality: true })
110
102
  op patchModel(@body input: VisibilityModel): void;
111
103
 
112
104
  @scenario
@@ -6,7 +6,6 @@ function genData(keys: string[]): Record<string, any> {
6
6
  const ret: Record<string, any> = {};
7
7
  const fullData: Record<string, any> = {
8
8
  readProp: "abc",
9
- queryProp: 123,
10
9
  createProp: ["foo", "bar"],
11
10
  updateProp: [1, 2],
12
11
  deleteProp: true,
@@ -36,7 +35,7 @@ Scenarios.Type_Model_Visibility_headModel = passOnSuccess({
36
35
  uri: "/type/model/visibility",
37
36
  method: "head",
38
37
  request: {
39
- body: { queryProp: 123 },
38
+ query: { queryProp: 123 },
40
39
  },
41
40
  response: {
42
41
  status: 200,
@@ -47,7 +46,7 @@ Scenarios.Type_Model_Visibility_getModel = passOnSuccess({
47
46
  uri: "/type/model/visibility",
48
47
  method: "get",
49
48
  request: {
50
- body: { queryProp: 123 },
49
+ query: { queryProp: 123 },
51
50
  },
52
51
  response: {
53
52
  status: 200,
@@ -59,10 +58,10 @@ Scenarios.Type_Model_Visibility_putModel = passOnSuccess({
59
58
  uri: "/type/model/visibility",
60
59
  method: "put",
61
60
  request: {
62
- body: {
61
+ body: json({
63
62
  createProp: ["foo", "bar"],
64
63
  updateProp: [1, 2],
65
- },
64
+ }),
66
65
  },
67
66
  response: {
68
67
  status: 204,
@@ -73,9 +72,9 @@ Scenarios.Type_Model_Visibility_patchModel = passOnSuccess({
73
72
  uri: "/type/model/visibility",
74
73
  method: "patch",
75
74
  request: {
76
- body: {
75
+ body: json({
77
76
  updateProp: [1, 2],
78
- },
77
+ }),
79
78
  },
80
79
  response: {
81
80
  status: 204,
@@ -86,9 +85,9 @@ Scenarios.Type_Model_Visibility_postModel = passOnSuccess({
86
85
  uri: "/type/model/visibility",
87
86
  method: "post",
88
87
  request: {
89
- body: {
88
+ body: json({
90
89
  createProp: ["foo", "bar"],
91
- },
90
+ }),
92
91
  },
93
92
  response: {
94
93
  status: 204,
@@ -99,7 +98,7 @@ Scenarios.Type_Model_Visibility_deleteModel = passOnSuccess({
99
98
  uri: "/type/model/visibility",
100
99
  method: "delete",
101
100
  request: {
102
- body: { deleteProp: true },
101
+ body: json({ deleteProp: true }),
103
102
  },
104
103
  response: {
105
104
  status: 204,