@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
@@ -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,9 @@ Scenarios.Parameters_Spread_Model_spreadAsRequestBody = passOnSuccess({
6
6
  uri: `/parameters/spread/model/request-body`,
7
7
  method: "put",
8
8
  request: {
9
- body: {
9
+ body: json({
10
10
  name: "foo",
11
- },
11
+ }),
12
12
  },
13
13
  response: {
14
14
  status: 204,
@@ -20,9 +20,9 @@ Scenarios.Parameters_Spread_Model_spreadCompositeRequestOnlyWithBody = passOnSuc
20
20
  uri: `/parameters/spread/model/composite-request-only-with-body`,
21
21
  method: "put",
22
22
  request: {
23
- body: {
23
+ body: json({
24
24
  name: "foo",
25
- },
25
+ }),
26
26
  },
27
27
  response: {
28
28
  status: 204,
@@ -48,9 +48,9 @@ Scenarios.Parameters_Spread_Model_spreadCompositeRequest = passOnSuccess({
48
48
  uri: `/parameters/spread/model/composite-request/foo`,
49
49
  method: "put",
50
50
  request: {
51
- body: {
51
+ body: json({
52
52
  name: "foo",
53
- },
53
+ }),
54
54
  headers: {
55
55
  "test-header": "bar",
56
56
  },
@@ -65,9 +65,9 @@ Scenarios.Parameters_Spread_Model_spreadCompositeRequestMix = passOnSuccess({
65
65
  uri: `/parameters/spread/model/composite-request-mix/foo`,
66
66
  method: "put",
67
67
  request: {
68
- body: {
68
+ body: json({
69
69
  prop: "foo",
70
- },
70
+ }),
71
71
  headers: {
72
72
  "test-header": "bar",
73
73
  },
@@ -82,9 +82,9 @@ Scenarios.Parameters_Spread_Alias_spreadAsRequestBody = passOnSuccess({
82
82
  uri: `/parameters/spread/alias/request-body`,
83
83
  method: "put",
84
84
  request: {
85
- body: {
85
+ body: json({
86
86
  name: "foo",
87
- },
87
+ }),
88
88
  },
89
89
  response: {
90
90
  status: 204,
@@ -96,9 +96,9 @@ Scenarios.Parameters_Spread_Alias_spreadAsRequestParameter = passOnSuccess({
96
96
  uri: `/parameters/spread/alias/request-parameter/1`,
97
97
  method: "put",
98
98
  request: {
99
- body: {
99
+ body: json({
100
100
  name: "foo",
101
- },
101
+ }),
102
102
  headers: {
103
103
  "x-ms-test-header": "bar",
104
104
  },
@@ -113,12 +113,12 @@ Scenarios.Parameters_Spread_Alias_spreadWithMultipleParameters = passOnSuccess({
113
113
  uri: `/parameters/spread/alias/multiple-parameters/1`,
114
114
  method: "put",
115
115
  request: {
116
- body: {
116
+ body: json({
117
117
  requiredString: "foo",
118
118
  optionalInt: 1,
119
119
  requiredIntList: [1, 2],
120
120
  optionalStringList: ["foo", "bar"],
121
- },
121
+ }),
122
122
  headers: {
123
123
  "x-ms-test-header": "bar",
124
124
  },
@@ -133,9 +133,9 @@ Scenarios.Parameters_Spread_Alias_spreadParameterWithInnerModel = passOnSuccess(
133
133
  uri: `/parameters/spread/alias/inner-model-parameter/1`,
134
134
  method: "post",
135
135
  request: {
136
- body: {
136
+ body: json({
137
137
  name: "foo",
138
- },
138
+ }),
139
139
  headers: {
140
140
  "x-ms-test-header": "bar",
141
141
  },
@@ -150,10 +150,10 @@ Scenarios.Parameters_Spread_Alias_spreadParameterWithInnerAlias = passOnSuccess(
150
150
  uri: `/parameters/spread/alias/inner-alias-parameter/1`,
151
151
  method: "post",
152
152
  request: {
153
- body: {
153
+ body: json({
154
154
  name: "foo",
155
155
  age: 1,
156
- },
156
+ }),
157
157
  headers: {
158
158
  "x-ms-test-header": "bar",
159
159
  },
@@ -58,7 +58,7 @@ model InnerModel {
58
58
  }
59
59
  ],
60
60
  "intValue": 1,
61
- "floatValue": 1.1,
61
+ "floatValue": 1.25,
62
62
  "innerModel": {
63
63
  "name": "InnerMadge",
64
64
  "description": "innerDesc"
@@ -85,7 +85,7 @@ model InnerModel {
85
85
  }
86
86
  ],
87
87
  "intValue": 1,
88
- "floatValue": 1.1,
88
+ "floatValue": 1.25,
89
89
  "innerModel": {
90
90
  "name": "InnerMadge",
91
91
  "description": "innerDesc"
@@ -18,7 +18,7 @@ export const expectedCreateBody = {
18
18
  },
19
19
  ],
20
20
  intValue: 1,
21
- floatValue: 1.1,
21
+ floatValue: 1.25,
22
22
  innerModel: {
23
23
  name: "InnerMadge",
24
24
  description: "innerDesc",
@@ -45,7 +45,7 @@ Scenarios.Payload_JsonMergePatch_createResource = passOnSuccess({
45
45
  uri: "/json-merge-patch/create/resource",
46
46
  method: "put",
47
47
  request: {
48
- body: expectedCreateBody,
48
+ body: json(expectedCreateBody),
49
49
  },
50
50
  response: {
51
51
  status: 200,
@@ -58,7 +58,7 @@ Scenarios.Payload_JsonMergePatch_updateResource = passOnSuccess({
58
58
  uri: "/json-merge-patch/update/resource",
59
59
  method: "patch",
60
60
  request: {
61
- body: expectedUpdateBody,
61
+ body: json(expectedUpdateBody),
62
62
  },
63
63
  response: {
64
64
  status: 200,
@@ -78,7 +78,7 @@ Scenarios.Payload_JsonMergePatch_updateOptionalResource = passOnSuccess({
78
78
  uri: "/json-merge-patch/update/resource/optional",
79
79
  method: "patch",
80
80
  request: {
81
- body: expectedUpdateBody,
81
+ body: json(expectedUpdateBody),
82
82
  },
83
83
  response: {
84
84
  status: 200,
@@ -6,7 +6,7 @@ Scenarios.Payload_MediaType_StringBody_sendAsText = passOnSuccess({
6
6
  uri: "/payload/media-type/string-body/sendAsText",
7
7
  method: "post",
8
8
  request: {
9
- body: "{cat}",
9
+ body: json("{cat}"),
10
10
  headers: {
11
11
  "Content-Type": "text/plain",
12
12
  },
@@ -36,7 +36,7 @@ Scenarios.Payload_MediaType_StringBody_sendAsJson = passOnSuccess({
36
36
  uri: "/payload/media-type/string-body/sendAsJson",
37
37
  method: "post",
38
38
  request: {
39
- body: "foo",
39
+ body: json("foo"),
40
40
  headers: {
41
41
  "Content-Type": "application/json",
42
42
  },
@@ -9,8 +9,18 @@ using Spector;
9
9
  namespace Payload.MultiPart;
10
10
 
11
11
  model MultiPartRequest {
12
- id: string;
13
- profileImage: bytes;
12
+ id: HttpPart<string>;
13
+ profileImage: HttpPart<bytes>;
14
+ }
15
+
16
+ model MultiPartRequestWithWireName {
17
+ identifier: HttpPart<string, #{ name: "id" }>;
18
+ image: HttpPart<bytes, #{ name: "profileImage" }>;
19
+ }
20
+
21
+ model MultiPartOptionalRequest {
22
+ id?: HttpPart<string>;
23
+ profileImage?: HttpPart<bytes>;
14
24
  }
15
25
 
16
26
  model Address {
@@ -52,25 +62,25 @@ model ComplexHttpPartsModelRequest {
52
62
  }
53
63
 
54
64
  model ComplexPartsRequest {
55
- id: string;
56
- address: Address;
57
- profileImage: bytes;
58
- pictures: bytes[];
65
+ id: HttpPart<string>;
66
+ address: HttpPart<Address>;
67
+ profileImage: HttpPart<bytes>;
68
+ pictures: HttpPart<bytes>[];
59
69
  }
60
70
 
61
71
  model JsonPartRequest {
62
- address: Address;
63
- profileImage: bytes;
72
+ address: HttpPart<Address>;
73
+ profileImage: HttpPart<bytes>;
64
74
  }
65
75
 
66
76
  model BinaryArrayPartsRequest {
67
- id: string;
68
- pictures: bytes[];
77
+ id: HttpPart<string>;
78
+ pictures: HttpPart<bytes>[];
69
79
  }
70
80
 
71
81
  model MultiBinaryPartsRequest {
72
- profileImage: bytes;
73
- picture?: bytes;
82
+ profileImage: HttpPart<bytes>;
83
+ picture?: HttpPart<bytes>;
74
84
  }
75
85
 
76
86
  @route("/form-data")
@@ -79,9 +89,9 @@ namespace FormData {
79
89
  @scenarioDoc("""
80
90
  Expect request (
81
91
  - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
82
- appropriate media type, cadl-ranch will check it; content-type of other parts is optional, cadl-ranch will ignore it.
92
+ appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
83
93
  - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
84
- If there are duplicated filename in same fieldName, cadl-ranch can't parse them all.
94
+ If there are duplicated filename in same fieldName, server can't parse them all.
85
95
  ):
86
96
  ```
87
97
  POST /upload HTTP/1.1
@@ -106,16 +116,115 @@ namespace FormData {
106
116
  @route("/mixed-parts")
107
117
  op basic(
108
118
  @header contentType: "multipart/form-data",
109
- @body body: MultiPartRequest,
119
+ @multipartBody body: MultiPartRequest,
120
+ ): NoContentResponse;
121
+
122
+ @scenario
123
+ @scenarioDoc("""
124
+ Expect request with wire names (
125
+ - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
126
+ appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
127
+ - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
128
+ If there are duplicated filename in same fieldName, server can't parse them all.
129
+ ):
130
+ ```
131
+ POST /upload HTTP/1.1
132
+ Content-Length: 428
133
+ Content-Type: multipart/form-data; boundary=abcde12345
134
+
135
+ --abcde12345
136
+ Content-Disposition: form-data; name="id"
137
+ Content-Type: text/plain
138
+
139
+ 123
140
+ --abcde12345
141
+ Content-Disposition: form-data; name="profileImage"; filename="<any-or-no-name-is-ok>"
142
+ Content-Type: application/octet-stream;
143
+
144
+ {…file content of .jpg file…}
145
+ --abcde12345--
146
+ ```
147
+ """)
148
+ @doc("Test content-type: multipart/form-data with wire names")
149
+ @post
150
+ @route("/mixed-parts-with-wire-name")
151
+ op withWireName(
152
+ @header contentType: "multipart/form-data",
153
+ @multipartBody body: MultiPartRequestWithWireName,
154
+ ): NoContentResponse;
155
+
156
+ @scenario
157
+ @scenarioDoc("""
158
+ Please send request three times:
159
+ - First time with only id
160
+ - Second time with only profileImage
161
+ - Third time with both id and profileImage
162
+
163
+ Expect requests (
164
+ - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
165
+ appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
166
+ - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
167
+ If there are duplicated filename in same fieldName, server can't parse them all.
168
+ ):
169
+ ```
170
+ POST /upload HTTP/1.1
171
+ Content-Length: 428
172
+ Content-Type: multipart/form-data; boundary=abcde12345
173
+
174
+ --abcde12345
175
+ Content-Disposition: form-data; name="id"
176
+ Content-Type: text/plain
177
+
178
+ 123
179
+ --abcde12345--
180
+ ```
181
+
182
+ ```
183
+ POST /upload HTTP/1.1
184
+ Content-Length: 428
185
+ Content-Type: multipart/form-data; boundary=abcde12345
186
+
187
+ --abcde12345
188
+ Content-Disposition: form-data; name="profileImage"; filename="<any-or-no-name-is-ok>"
189
+ Content-Type: application/octet-stream
190
+
191
+ {…file content of .jpg file…}
192
+ --abcde12345--
193
+ ```
194
+
195
+ ```
196
+ POST /upload HTTP/1.1
197
+ Content-Length: 428
198
+ Content-Type: multipart/form-data; boundary=abcde12345
199
+
200
+ --abcde12345
201
+ Content-Disposition: form-data; name="id"
202
+ Content-Type: text/plain
203
+
204
+ 123
205
+ --abcde12345
206
+ Content-Disposition: form-data; name="profileImage"; filename="<any-or-no-name-is-ok>"
207
+ Content-Type: application/octet-stream
208
+
209
+ {…file content of .jpg file…}
210
+ --abcde12345--
211
+ ```
212
+ """)
213
+ @doc("Test content-type: multipart/form-data with optional parts")
214
+ @post
215
+ @route("/optional-parts")
216
+ op optionalParts(
217
+ @header contentType: "multipart/form-data",
218
+ @multipartBody body: MultiPartOptionalRequest,
110
219
  ): NoContentResponse;
111
220
 
112
221
  @scenario
113
222
  @scenarioDoc("""
114
223
  Expect request (
115
224
  - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
116
- appropriate media type, cadl-ranch will check it; content-type of other parts is optional, cadl-ranch will ignore it.
225
+ appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
117
226
  - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
118
- If there are duplicated filename in same fieldName, cadl-ranch can't parse them all.
227
+ If there are duplicated filename in same fieldName, server can't parse them all.
119
228
  ):
120
229
  ```
121
230
  POST /upload HTTP/1.1
@@ -166,16 +275,16 @@ namespace FormData {
166
275
  @route("/complex-parts")
167
276
  op fileArrayAndBasic(
168
277
  @header contentType: "multipart/form-data",
169
- @body body: ComplexPartsRequest,
278
+ @multipartBody body: ComplexPartsRequest,
170
279
  ): NoContentResponse;
171
280
 
172
281
  @scenario
173
282
  @scenarioDoc("""
174
283
  Expect request (
175
284
  - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
176
- appropriate media type, cadl-ranch will check it; content-type of other parts is optional, cadl-ranch will ignore it.
285
+ appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
177
286
  - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
178
- If there are duplicated filename in same fieldName, cadl-ranch can't parse them all.
287
+ If there are duplicated filename in same fieldName, server can't parse them all.
179
288
  ):
180
289
  ```
181
290
  POST /upload HTTP/1.1
@@ -202,16 +311,16 @@ namespace FormData {
202
311
  @route("/json-part")
203
312
  op jsonPart(
204
313
  @header contentType: "multipart/form-data",
205
- @body body: JsonPartRequest,
314
+ @multipartBody body: JsonPartRequest,
206
315
  ): NoContentResponse;
207
316
 
208
317
  @scenario
209
318
  @scenarioDoc("""
210
319
  Expect request (
211
320
  - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
212
- appropriate media type, cadl-ranch will check it; content-type of other parts is optional, cadl-ranch will ignore it.
321
+ appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
213
322
  - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
214
- If there are duplicated filename in same fieldName, cadl-ranch can't parse them all.
323
+ If there are duplicated filename in same fieldName, server can't parse them all.
215
324
  ):
216
325
  ```
217
326
  POST /upload HTTP/1.1
@@ -241,16 +350,16 @@ namespace FormData {
241
350
  @route("/binary-array-parts")
242
351
  op binaryArrayParts(
243
352
  @header contentType: "multipart/form-data",
244
- @body body: BinaryArrayPartsRequest,
353
+ @multipartBody body: BinaryArrayPartsRequest,
245
354
  ): NoContentResponse;
246
355
 
247
356
  @scenario
248
357
  @scenarioDoc("""
249
358
  Please send request twice, first time with only profileImage, second time with both profileImage and picture(
250
359
  - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
251
- appropriate media type, cadl-ranch will check it; content-type of other parts is optional, cadl-ranch will ignore it.
360
+ appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
252
361
  - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
253
- If there are duplicated filename in same fieldName, cadl-ranch can't parse them all.
362
+ If there are duplicated filename in same fieldName, server can't parse them all.
254
363
  ):
255
364
  ```
256
365
  POST /upload HTTP/1.1
@@ -275,7 +384,7 @@ namespace FormData {
275
384
  @route("/multi-binary-parts")
276
385
  op multiBinaryParts(
277
386
  @header contentType: "multipart/form-data",
278
- @body body: MultiBinaryPartsRequest,
387
+ @multipartBody body: MultiBinaryPartsRequest,
279
388
  ): NoContentResponse;
280
389
 
281
390
  @scenario
@@ -304,16 +413,16 @@ namespace FormData {
304
413
  @route("/check-filename-and-content-type")
305
414
  op checkFileNameAndContentType(
306
415
  @header contentType: "multipart/form-data",
307
- @body body: MultiPartRequest,
416
+ @multipartBody body: MultiPartRequest,
308
417
  ): NoContentResponse;
309
418
 
310
419
  @scenario
311
420
  @scenarioDoc("""
312
421
  Expect request (
313
422
  - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
314
- appropriate media type, cadl-ranch will check it; content-type of other parts is optional, cadl-ranch will ignore it.
423
+ appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
315
424
  - according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
316
- If there are duplicated filename in same filedName, cadl-ranch can't parse them all.
425
+ If there are duplicated filename in same filedName, server can't parse them all.
317
426
  ):
318
427
  ```
319
428
  POST /multipart/form-data/anonymous-model HTTP/1.1
@@ -333,7 +442,9 @@ namespace FormData {
333
442
  @route("/anonymous-model")
334
443
  op anonymousModel(
335
444
  @header contentType: "multipart/form-data",
336
- profileImage: MultiPartRequest.profileImage,
445
+ @multipartBody body: {
446
+ profileImage: HttpPart<bytes>;
447
+ },
337
448
  ): NoContentResponse;
338
449
 
339
450
  namespace HttpParts {
@@ -412,7 +523,7 @@ namespace FormData {
412
523
  }
413
524
  @scenario
414
525
  @scenarioDoc("""
415
- For File part, filename will not be checked but it is necessary otherwise cadl-ranch can't parse it;
526
+ For File part, filename will not be checked but it is necessary otherwise server can't parse it;
416
527
  content-type will be checked with value "application/octet-stream". Expect request:
417
528
  ```
418
529
  POST /upload HTTP/1.1
@@ -497,4 +608,91 @@ namespace FormData {
497
608
  ): NoContentResponse;
498
609
  }
499
610
  }
611
+
612
+ @route("/file")
613
+ namespace File {
614
+ model FileWithRequiredFilename extends TypeSpec.Http.File<"image/png"> {
615
+ filename: string;
616
+ }
617
+
618
+ @scenario
619
+ @scenarioDoc("""
620
+ Test File type in multipart form data with specific content type.
621
+ Expected request:
622
+ ```
623
+ POST /multipart/form-data/file/specific-content-type HTTP/1.1
624
+ Content-Type: multipart/form-data; boundary=abcde12345
625
+
626
+ --abcde12345
627
+ Content-Disposition: form-data; name="file"; filename="image.png"
628
+ Content-Type: image/png
629
+
630
+ {…file content of image.png…}
631
+ --abcde12345--
632
+ ```
633
+ """)
634
+ @post
635
+ @route("/specific-content-type")
636
+ op uploadFileSpecificContentType(
637
+ @header contentType: "multipart/form-data",
638
+ @multipartBody body: {
639
+ file: HttpPart<TypeSpec.Http.File<"image/png">>;
640
+ },
641
+ ): NoContentResponse;
642
+
643
+ @scenario
644
+ @scenarioDoc("""
645
+ Test File type in multipart form data with required filename.
646
+ Expected request:
647
+ ```
648
+ POST /multipart/form-data/file/required-filename HTTP/1.1
649
+ Content-Type: multipart/form-data; boundary=abcde12345
650
+
651
+ --abcde12345
652
+ Content-Disposition: form-data; name="file"; filename="image.png"
653
+ Content-Type: image/png
654
+
655
+ {…file content of image.png…}
656
+ --abcde12345--
657
+ ```
658
+ """)
659
+ @post
660
+ @route("/required-filename")
661
+ op uploadFileRequiredFilename(
662
+ @header contentType: "multipart/form-data",
663
+ @multipartBody body: {
664
+ file: HttpPart<FileWithRequiredFilename>;
665
+ },
666
+ ): NoContentResponse;
667
+
668
+ @scenario
669
+ @scenarioDoc("""
670
+ Test multiple File instances in multipart form data.
671
+ Expected request:
672
+ ```
673
+ POST /multipart/form-data/file/file-array HTTP/1.1
674
+ Content-Type: multipart/form-data; boundary=abcde12345
675
+
676
+ --abcde12345
677
+ Content-Disposition: form-data; name="files"; filename="image1.png"
678
+ Content-Type: image/png
679
+
680
+ {…file content of image.png…}
681
+ --abcde12345
682
+ Content-Disposition: form-data; name="files"; filename="image2.png"
683
+ Content-Type: image/png
684
+
685
+ {…file content of image.png…}
686
+ --abcde12345--
687
+ ```
688
+ """)
689
+ @post
690
+ @route("/file-array")
691
+ op uploadFileArray(
692
+ @header contentType: "multipart/form-data",
693
+ @multipartBody body: {
694
+ files: HttpPart<TypeSpec.Http.File<"image/png">>[];
695
+ },
696
+ ): NoContentResponse;
697
+ }
500
698
  }