@typespec/http-specs 0.1.0-alpha.9 → 0.1.0-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 (224) hide show
  1. package/CHANGELOG.md +241 -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 +110 -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 +189 -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 +594 -14
  54. package/dist/specs/payload/pageable/mockapi.js.map +1 -1
  55. package/dist/specs/payload/xml/mockapi.d.ts +3 -0
  56. package/dist/specs/payload/xml/mockapi.d.ts.map +1 -1
  57. package/dist/specs/payload/xml/mockapi.js +35 -5
  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 +11200 -0
  134. package/package.json +30 -19
  135. package/smoke/petstore/main.tsp +96 -0
  136. package/smoke/todoapp/main.tsp +293 -0
  137. package/spec-summary.md +1745 -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 +216 -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 +200 -59
  166. package/specs/payload/pageable/main.tsp +601 -0
  167. package/specs/payload/pageable/mockapi.ts +656 -14
  168. package/specs/payload/xml/main.tsp +89 -0
  169. package/specs/payload/xml/mockapi.ts +44 -5
  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 +118 -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,200 @@
1
+ import { MockRequest, passOnSuccess, ScenarioMockApi, ValidationError } from "@typespec/spec-api";
2
+ import { pngFile } from "../../helper.js";
3
+
4
+ export const Scenarios: Record<string, ScenarioMockApi> = {};
5
+
6
+ // Helper function to check file content
7
+ function checkFileContent(req: MockRequest, expectedFile: Buffer) {
8
+ req.expect.rawBodyEquals(expectedFile);
9
+ }
10
+
11
+ // Body tests - Request with specific content type
12
+ Scenarios.Type_File_Body_uploadFileSpecificContentType = passOnSuccess({
13
+ uri: "/type/file/body/request/specific-content-type",
14
+ method: "post",
15
+ request: {
16
+ body: {
17
+ contentType: "image/png",
18
+ rawContent: pngFile,
19
+ },
20
+ },
21
+ response: {
22
+ status: 204,
23
+ },
24
+ handler(req: MockRequest) {
25
+ req.expect.containsHeader("content-type", "image/png");
26
+ checkFileContent(req, pngFile);
27
+ return { status: 204 };
28
+ },
29
+ kind: "MockApiDefinition",
30
+ });
31
+
32
+ // Body tests - Request with JSON content type
33
+ Scenarios.Type_File_Body_uploadFileJsonContentType = passOnSuccess({
34
+ uri: "/type/file/body/request/json-content-type",
35
+ method: "post",
36
+ request: {
37
+ body: {
38
+ contentType: "application/json",
39
+ rawContent: JSON.stringify({ message: "test file content" }),
40
+ },
41
+ },
42
+ response: {
43
+ status: 204,
44
+ },
45
+ handler(req: MockRequest) {
46
+ req.expect.containsHeader("content-type", "application/json");
47
+ req.expect.rawBodyEquals(JSON.stringify({ message: "test file content" }));
48
+ return { status: 204 };
49
+ },
50
+ kind: "MockApiDefinition",
51
+ });
52
+
53
+ // Body tests - Response with JSON content type
54
+ Scenarios.Type_File_Body_downloadFileJsonContentType = passOnSuccess({
55
+ uri: "/type/file/body/response/json-content-type",
56
+ method: "get",
57
+ request: {},
58
+ response: {
59
+ status: 200,
60
+ body: {
61
+ contentType: "application/json",
62
+ rawContent: JSON.stringify({ message: "test file content" }),
63
+ },
64
+ },
65
+ handler(req: MockRequest) {
66
+ return {
67
+ status: 200,
68
+ body: {
69
+ contentType: "application/json",
70
+ rawContent: JSON.stringify({ message: "test file content" }),
71
+ },
72
+ };
73
+ },
74
+ kind: "MockApiDefinition",
75
+ });
76
+
77
+ // Body tests - Response with specific content type
78
+ Scenarios.Type_File_Body_downloadFileSpecificContentType = passOnSuccess({
79
+ uri: "/type/file/body/response/specific-content-type",
80
+ method: "get",
81
+ request: {},
82
+ response: {
83
+ status: 200,
84
+ body: {
85
+ contentType: "image/png",
86
+ rawContent: pngFile,
87
+ },
88
+ },
89
+ handler(req: MockRequest) {
90
+ return {
91
+ status: 200,
92
+ body: {
93
+ contentType: "image/png",
94
+ rawContent: pngFile,
95
+ },
96
+ };
97
+ },
98
+ kind: "MockApiDefinition",
99
+ });
100
+
101
+ // Body tests - Request with multiple content types
102
+ Scenarios.Type_File_Body_uploadFileMultipleContentTypes = passOnSuccess({
103
+ uri: "/type/file/body/request/multiple-content-types",
104
+ method: "post",
105
+ request: {
106
+ body: {
107
+ contentType: "image/png",
108
+ rawContent: pngFile,
109
+ },
110
+ },
111
+ response: {
112
+ status: 204,
113
+ },
114
+ handler(req: MockRequest) {
115
+ // Client should send image/png (one of the allowed types)
116
+ const contentType = req.headers["content-type"];
117
+ if (contentType !== "image/png" && contentType !== "image/jpeg") {
118
+ throw new ValidationError(
119
+ "Expected content-type to be image/png or image/jpeg",
120
+ "image/png or image/jpeg",
121
+ contentType,
122
+ );
123
+ }
124
+ checkFileContent(req, pngFile);
125
+ return { status: 204 };
126
+ },
127
+ kind: "MockApiDefinition",
128
+ });
129
+
130
+ // Body tests - Response with multiple content types
131
+ Scenarios.Type_File_Body_downloadFileMultipleContentTypes = passOnSuccess({
132
+ uri: "/type/file/body/response/multiple-content-types",
133
+ method: "get",
134
+ request: {},
135
+ response: {
136
+ status: 200,
137
+ body: {
138
+ contentType: "image/png",
139
+ rawContent: pngFile,
140
+ },
141
+ },
142
+ handler(req: MockRequest) {
143
+ // Server returns image/png (one of the allowed types)
144
+ return {
145
+ status: 200,
146
+ body: {
147
+ contentType: "image/png",
148
+ rawContent: pngFile,
149
+ },
150
+ };
151
+ },
152
+ kind: "MockApiDefinition",
153
+ });
154
+
155
+ // Body tests - Request with default content type
156
+ Scenarios.Type_File_Body_uploadFileDefaultContentType = passOnSuccess({
157
+ uri: "/type/file/body/request/default-content-type",
158
+ method: "post",
159
+ request: {
160
+ body: {
161
+ contentType: "image/png",
162
+ rawContent: pngFile,
163
+ },
164
+ },
165
+ response: {
166
+ status: 204,
167
+ },
168
+ handler(req: MockRequest) {
169
+ // File type accepts any content type, but for testing we expect image/png
170
+ req.expect.containsHeader("content-type", "image/png");
171
+ checkFileContent(req, pngFile);
172
+ return { status: 204 };
173
+ },
174
+ kind: "MockApiDefinition",
175
+ });
176
+
177
+ // Body tests - Response with default content type
178
+ Scenarios.Type_File_Body_downloadFileDefaultContentType = passOnSuccess({
179
+ uri: "/type/file/body/response/default-content-type",
180
+ method: "get",
181
+ request: {},
182
+ response: {
183
+ status: 200,
184
+ body: {
185
+ contentType: "image/png",
186
+ rawContent: pngFile,
187
+ },
188
+ },
189
+ handler(req: MockRequest) {
190
+ // File type accepts any content type, but for testing we return image/png
191
+ return {
192
+ status: 200,
193
+ body: {
194
+ contentType: "image/png",
195
+ rawContent: pngFile,
196
+ },
197
+ };
198
+ },
199
+ kind: "MockApiDefinition",
200
+ });
@@ -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,
@@ -14,8 +14,10 @@ model VisibilityModel {
14
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
19
  @visibility(Lifecycle.Query)
20
+ @query
19
21
  queryProp: int32;
20
22
 
21
23
  @doc("Required string[], illustrating a create property.")
@@ -38,23 +40,18 @@ model VisibilityModel {
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,
@@ -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,