@typespec/http-server-js 0.58.0-alpha.10-dev.3

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 (215) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/LICENSE +21 -0
  3. package/README.md +183 -0
  4. package/build-helpers.ts +170 -0
  5. package/dist/generated-defs/helpers/header.d.ts +4 -0
  6. package/dist/generated-defs/helpers/header.d.ts.map +1 -0
  7. package/dist/generated-defs/helpers/header.js +76 -0
  8. package/dist/generated-defs/helpers/header.js.map +1 -0
  9. package/dist/generated-defs/helpers/http.d.ts +4 -0
  10. package/dist/generated-defs/helpers/http.d.ts.map +1 -0
  11. package/dist/generated-defs/helpers/http.js +134 -0
  12. package/dist/generated-defs/helpers/http.js.map +1 -0
  13. package/dist/generated-defs/helpers/index.d.ts +4 -0
  14. package/dist/generated-defs/helpers/index.d.ts.map +1 -0
  15. package/dist/generated-defs/helpers/index.js +21 -0
  16. package/dist/generated-defs/helpers/index.js.map +1 -0
  17. package/dist/generated-defs/helpers/multipart.d.ts +4 -0
  18. package/dist/generated-defs/helpers/multipart.d.ts.map +1 -0
  19. package/dist/generated-defs/helpers/multipart.js +249 -0
  20. package/dist/generated-defs/helpers/multipart.js.map +1 -0
  21. package/dist/generated-defs/helpers/router.d.ts +4 -0
  22. package/dist/generated-defs/helpers/router.d.ts.map +1 -0
  23. package/dist/generated-defs/helpers/router.js +259 -0
  24. package/dist/generated-defs/helpers/router.js.map +1 -0
  25. package/dist/src/common/declaration.d.ts +13 -0
  26. package/dist/src/common/declaration.d.ts.map +1 -0
  27. package/dist/src/common/declaration.js +45 -0
  28. package/dist/src/common/declaration.js.map +1 -0
  29. package/dist/src/common/documentation.d.ts +12 -0
  30. package/dist/src/common/documentation.d.ts.map +1 -0
  31. package/dist/src/common/documentation.js +21 -0
  32. package/dist/src/common/documentation.js.map +1 -0
  33. package/dist/src/common/enum.d.ts +10 -0
  34. package/dist/src/common/enum.d.ts.map +1 -0
  35. package/dist/src/common/enum.js +21 -0
  36. package/dist/src/common/enum.js.map +1 -0
  37. package/dist/src/common/interface.d.ts +50 -0
  38. package/dist/src/common/interface.d.ts.map +1 -0
  39. package/dist/src/common/interface.js +194 -0
  40. package/dist/src/common/interface.js.map +1 -0
  41. package/dist/src/common/model.d.ts +26 -0
  42. package/dist/src/common/model.d.ts.map +1 -0
  43. package/dist/src/common/model.js +115 -0
  44. package/dist/src/common/model.js.map +1 -0
  45. package/dist/src/common/namespace.d.ts +38 -0
  46. package/dist/src/common/namespace.d.ts.map +1 -0
  47. package/dist/src/common/namespace.js +184 -0
  48. package/dist/src/common/namespace.js.map +1 -0
  49. package/dist/src/common/reference.d.ts +46 -0
  50. package/dist/src/common/reference.d.ts.map +1 -0
  51. package/dist/src/common/reference.js +243 -0
  52. package/dist/src/common/reference.js.map +1 -0
  53. package/dist/src/common/scalar.d.ts +50 -0
  54. package/dist/src/common/scalar.d.ts.map +1 -0
  55. package/dist/src/common/scalar.js +144 -0
  56. package/dist/src/common/scalar.js.map +1 -0
  57. package/dist/src/common/serialization/index.d.ts +11 -0
  58. package/dist/src/common/serialization/index.d.ts.map +1 -0
  59. package/dist/src/common/serialization/index.js +72 -0
  60. package/dist/src/common/serialization/index.js.map +1 -0
  61. package/dist/src/common/serialization/json.d.ts +6 -0
  62. package/dist/src/common/serialization/json.d.ts.map +1 -0
  63. package/dist/src/common/serialization/json.js +341 -0
  64. package/dist/src/common/serialization/json.js.map +1 -0
  65. package/dist/src/common/union.d.ts +23 -0
  66. package/dist/src/common/union.d.ts.map +1 -0
  67. package/dist/src/common/union.js +57 -0
  68. package/dist/src/common/union.js.map +1 -0
  69. package/dist/src/ctx.d.ts +242 -0
  70. package/dist/src/ctx.d.ts.map +1 -0
  71. package/dist/src/ctx.js +211 -0
  72. package/dist/src/ctx.js.map +1 -0
  73. package/dist/src/helpers/header.d.ts +14 -0
  74. package/dist/src/helpers/header.d.ts.map +1 -0
  75. package/dist/src/helpers/header.js +38 -0
  76. package/dist/src/helpers/header.js.map +1 -0
  77. package/dist/src/helpers/http.d.ts +70 -0
  78. package/dist/src/helpers/http.d.ts.map +1 -0
  79. package/dist/src/helpers/http.js +86 -0
  80. package/dist/src/helpers/http.js.map +1 -0
  81. package/dist/src/helpers/multipart.d.ts +26 -0
  82. package/dist/src/helpers/multipart.d.ts.map +1 -0
  83. package/dist/src/helpers/multipart.js +182 -0
  84. package/dist/src/helpers/multipart.js.map +1 -0
  85. package/dist/src/helpers/router.d.ts +176 -0
  86. package/dist/src/helpers/router.d.ts.map +1 -0
  87. package/dist/src/helpers/router.js +55 -0
  88. package/dist/src/helpers/router.js.map +1 -0
  89. package/dist/src/http/index.d.ts +24 -0
  90. package/dist/src/http/index.d.ts.map +1 -0
  91. package/dist/src/http/index.js +52 -0
  92. package/dist/src/http/index.js.map +1 -0
  93. package/dist/src/http/server/index.d.ts +11 -0
  94. package/dist/src/http/server/index.d.ts.map +1 -0
  95. package/dist/src/http/server/index.js +413 -0
  96. package/dist/src/http/server/index.js.map +1 -0
  97. package/dist/src/http/server/multipart.d.ts +16 -0
  98. package/dist/src/http/server/multipart.d.ts.map +1 -0
  99. package/dist/src/http/server/multipart.js +214 -0
  100. package/dist/src/http/server/multipart.js.map +1 -0
  101. package/dist/src/http/server/router.d.ts +15 -0
  102. package/dist/src/http/server/router.d.ts.map +1 -0
  103. package/dist/src/http/server/router.js +459 -0
  104. package/dist/src/http/server/router.js.map +1 -0
  105. package/dist/src/index.d.ts +5 -0
  106. package/dist/src/index.d.ts.map +1 -0
  107. package/dist/src/index.js +38 -0
  108. package/dist/src/index.js.map +1 -0
  109. package/dist/src/lib.d.ts +141 -0
  110. package/dist/src/lib.d.ts.map +1 -0
  111. package/dist/src/lib.js +116 -0
  112. package/dist/src/lib.js.map +1 -0
  113. package/dist/src/scripts/scaffold/bin.d.mts +14 -0
  114. package/dist/src/scripts/scaffold/bin.d.mts.map +1 -0
  115. package/dist/src/scripts/scaffold/bin.mjs +559 -0
  116. package/dist/src/scripts/scaffold/bin.mjs.map +1 -0
  117. package/dist/src/testing/index.d.ts +3 -0
  118. package/dist/src/testing/index.d.ts.map +1 -0
  119. package/dist/src/testing/index.js +6 -0
  120. package/dist/src/testing/index.js.map +1 -0
  121. package/dist/src/util/case.d.ts +81 -0
  122. package/dist/src/util/case.d.ts.map +1 -0
  123. package/dist/src/util/case.js +111 -0
  124. package/dist/src/util/case.js.map +1 -0
  125. package/dist/src/util/differentiate.d.ts +251 -0
  126. package/dist/src/util/differentiate.d.ts.map +1 -0
  127. package/dist/src/util/differentiate.js +580 -0
  128. package/dist/src/util/differentiate.js.map +1 -0
  129. package/dist/src/util/error.d.ts +13 -0
  130. package/dist/src/util/error.d.ts.map +1 -0
  131. package/dist/src/util/error.js +25 -0
  132. package/dist/src/util/error.js.map +1 -0
  133. package/dist/src/util/extends.d.ts +10 -0
  134. package/dist/src/util/extends.d.ts.map +1 -0
  135. package/dist/src/util/extends.js +31 -0
  136. package/dist/src/util/extends.js.map +1 -0
  137. package/dist/src/util/iter.d.ts +39 -0
  138. package/dist/src/util/iter.d.ts.map +1 -0
  139. package/dist/src/util/iter.js +72 -0
  140. package/dist/src/util/iter.js.map +1 -0
  141. package/dist/src/util/keywords.d.ts +10 -0
  142. package/dist/src/util/keywords.d.ts.map +1 -0
  143. package/dist/src/util/keywords.js +85 -0
  144. package/dist/src/util/keywords.js.map +1 -0
  145. package/dist/src/util/name.d.ts +12 -0
  146. package/dist/src/util/name.d.ts.map +1 -0
  147. package/dist/src/util/name.js +26 -0
  148. package/dist/src/util/name.js.map +1 -0
  149. package/dist/src/util/once-queue.d.ts +24 -0
  150. package/dist/src/util/once-queue.d.ts.map +1 -0
  151. package/dist/src/util/once-queue.js +34 -0
  152. package/dist/src/util/once-queue.js.map +1 -0
  153. package/dist/src/util/openapi3.d.ts +23 -0
  154. package/dist/src/util/openapi3.d.ts.map +1 -0
  155. package/dist/src/util/openapi3.js +40 -0
  156. package/dist/src/util/openapi3.js.map +1 -0
  157. package/dist/src/util/pluralism.d.ts +23 -0
  158. package/dist/src/util/pluralism.d.ts.map +1 -0
  159. package/dist/src/util/pluralism.js +36 -0
  160. package/dist/src/util/pluralism.js.map +1 -0
  161. package/dist/src/util/scope.d.ts +85 -0
  162. package/dist/src/util/scope.d.ts.map +1 -0
  163. package/dist/src/util/scope.js +111 -0
  164. package/dist/src/util/scope.js.map +1 -0
  165. package/dist/src/write.d.ts +23 -0
  166. package/dist/src/write.d.ts.map +1 -0
  167. package/dist/src/write.js +62 -0
  168. package/dist/src/write.js.map +1 -0
  169. package/generated-defs/helpers/header.ts +83 -0
  170. package/generated-defs/helpers/http.ts +141 -0
  171. package/generated-defs/helpers/index.ts +27 -0
  172. package/generated-defs/helpers/multipart.ts +256 -0
  173. package/generated-defs/helpers/router.ts +266 -0
  174. package/package.json +71 -0
  175. package/src/common/declaration.ts +52 -0
  176. package/src/common/documentation.ts +26 -0
  177. package/src/common/enum.ts +28 -0
  178. package/src/common/interface.ts +264 -0
  179. package/src/common/model.ts +160 -0
  180. package/src/common/namespace.ts +243 -0
  181. package/src/common/reference.ts +319 -0
  182. package/src/common/scalar.ts +173 -0
  183. package/src/common/serialization/index.ts +124 -0
  184. package/src/common/serialization/json.ts +444 -0
  185. package/src/common/union.ts +76 -0
  186. package/src/ctx.ts +497 -0
  187. package/src/helpers/header.ts +55 -0
  188. package/src/helpers/http.ts +113 -0
  189. package/src/helpers/multipart.ts +228 -0
  190. package/src/helpers/router.ts +238 -0
  191. package/src/http/index.ts +81 -0
  192. package/src/http/server/index.ts +548 -0
  193. package/src/http/server/multipart.ts +272 -0
  194. package/src/http/server/router.ts +686 -0
  195. package/src/index.ts +56 -0
  196. package/src/lib.ts +130 -0
  197. package/src/scripts/scaffold/bin.mts +781 -0
  198. package/src/testing/index.ts +10 -0
  199. package/src/util/case.ts +182 -0
  200. package/src/util/differentiate.ts +957 -0
  201. package/src/util/error.ts +28 -0
  202. package/src/util/extends.ts +43 -0
  203. package/src/util/iter.ts +85 -0
  204. package/src/util/keywords.ts +90 -0
  205. package/src/util/name.ts +33 -0
  206. package/src/util/once-queue.ts +55 -0
  207. package/src/util/openapi3.ts +53 -0
  208. package/src/util/pluralism.ts +37 -0
  209. package/src/util/scope.ts +211 -0
  210. package/src/write.ts +88 -0
  211. package/temp/tsconfig.tsbuildinfo +1 -0
  212. package/test/header.test.ts +26 -0
  213. package/test/multipart.test.ts +169 -0
  214. package/tsconfig.json +10 -0
  215. package/vitest.config.ts +4 -0
@@ -0,0 +1,413 @@
1
+ // Copyright (c) Microsoft Corporation
2
+ // Licensed under the MIT license.
3
+ import { NoTarget, compilerAssert } from "@typespec/compiler";
4
+ import { getHeaderFieldName, isBody, isHeader, isStatusCode, } from "@typespec/http";
5
+ import { createOrGetModuleForNamespace } from "../../common/namespace.js";
6
+ import { emitTypeReference, isValueLiteralType } from "../../common/reference.js";
7
+ import { parseTemplateForScalar } from "../../common/scalar.js";
8
+ import { isSerializationRequired, requireSerialization, } from "../../common/serialization/index.js";
9
+ import { completePendingDeclarations, createModule } from "../../ctx.js";
10
+ import { isUnspeakable, parseCase } from "../../util/case.js";
11
+ import { UnimplementedError } from "../../util/error.js";
12
+ import { getAllProperties } from "../../util/extends.js";
13
+ import { bifilter, indent } from "../../util/iter.js";
14
+ import { keywordSafe } from "../../util/keywords.js";
15
+ import { module as routerHelpers } from "../../../generated-defs/helpers/router.js";
16
+ import { reportDiagnostic } from "../../lib.js";
17
+ import { differentiateUnion, writeCodeTree } from "../../util/differentiate.js";
18
+ import { emitMultipart, emitMultipartLegacy } from "./multipart.js";
19
+ import { module as headerHelpers } from "../../../generated-defs/helpers/header.js";
20
+ import { module as httpHelpers } from "../../../generated-defs/helpers/http.js";
21
+ import { requiresJsonSerialization } from "../../common/serialization/json.js";
22
+ const DEFAULT_CONTENT_TYPE = "application/json";
23
+ /**
24
+ * Emits raw operations for handling incoming server requests.
25
+ *
26
+ * @param ctx - The HTTP emitter context.
27
+ * @param operationsModule - The module to emit the operations into.
28
+ * @returns the module containing the raw server operations.
29
+ */
30
+ export function emitRawServer(ctx, operationsModule) {
31
+ const serverRawModule = createModule("server-raw", operationsModule);
32
+ serverRawModule.imports.push({
33
+ binder: ["HttpContext"],
34
+ from: routerHelpers,
35
+ });
36
+ const isHttpResponder = ctx.gensym("isHttpResponder");
37
+ const httpResponderSym = ctx.gensym("httpResponderSymbol");
38
+ serverRawModule.imports.push({
39
+ binder: [`isHttpResponder as ${isHttpResponder}`, `HTTP_RESPONDER as ${httpResponderSym}`],
40
+ from: httpHelpers,
41
+ });
42
+ for (const operation of ctx.httpService.operations) {
43
+ serverRawModule.declarations.push([
44
+ ...emitRawServerOperation(ctx, operation, serverRawModule, {
45
+ isHttpResponder,
46
+ httpResponderSym,
47
+ }),
48
+ ]);
49
+ }
50
+ return serverRawModule;
51
+ }
52
+ /**
53
+ * Emit a raw operation handler for a specific operation.
54
+ * @param ctx - The HTTP emitter context.
55
+ * @param operation - The operation to create a handler for.
56
+ * @param module - The module that the handler will be written to.
57
+ */
58
+ function* emitRawServerOperation(ctx, operation, module, responderNames) {
59
+ const op = operation.operation;
60
+ const operationNameCase = parseCase(op.name);
61
+ const container = op.interface ?? op.namespace;
62
+ const containerNameCase = parseCase(container.name);
63
+ module.imports.push({
64
+ binder: [containerNameCase.pascalCase],
65
+ from: createOrGetModuleForNamespace(ctx, container.namespace),
66
+ });
67
+ completePendingDeclarations(ctx);
68
+ const pathParameters = operation.parameters.parameters.filter(function isPathParameter(param) {
69
+ return param.type === "path";
70
+ });
71
+ const functionName = keywordSafe(containerNameCase.snakeCase + "_" + operationNameCase.snakeCase);
72
+ const names = {
73
+ ctx: ctx.gensym("ctx"),
74
+ result: ctx.gensym("result"),
75
+ operations: ctx.gensym("operations"),
76
+ queryParams: ctx.gensym("queryParams"),
77
+ ...responderNames,
78
+ };
79
+ yield `export async function ${functionName}(`;
80
+ yield ` ${names.ctx}: HttpContext,`;
81
+ yield ` ${names.operations}: ${containerNameCase.pascalCase},`;
82
+ for (const pathParam of pathParameters) {
83
+ yield ` ${parseCase(pathParam.param.name).camelCase}: string,`;
84
+ }
85
+ yield "): Promise<void> {";
86
+ const [_, parameters] = bifilter(op.parameters.properties.values(), (param) => isValueLiteralType(param.type));
87
+ const queryParams = [];
88
+ const parsedParams = new Set();
89
+ for (const parameter of operation.parameters.parameters) {
90
+ const resolvedParameter = parameter.param.type.kind === "ModelProperty" ? parameter.param.type : parameter.param;
91
+ switch (parameter.type) {
92
+ case "header":
93
+ yield* indent(emitHeaderParamBinding(ctx, operation, names, parameter));
94
+ break;
95
+ case "cookie":
96
+ throw new UnimplementedError("cookie parameters");
97
+ case "query":
98
+ queryParams.push(parameter);
99
+ parsedParams.add(resolvedParameter);
100
+ break;
101
+ case "path":
102
+ // Already handled above.
103
+ parsedParams.add(resolvedParameter);
104
+ break;
105
+ default:
106
+ throw new Error(`UNREACHABLE: parameter type ${parameter.type}`);
107
+ }
108
+ }
109
+ if (queryParams.length > 0) {
110
+ yield ` const ${names.queryParams} = new URLSearchParams(${names.ctx}.request.url!.split("?", 2)[1] ?? "");`;
111
+ yield "";
112
+ }
113
+ for (const qp of queryParams) {
114
+ yield* indent(emitQueryParamBinding(ctx, operation, names, qp));
115
+ }
116
+ const bodyFields = new Map(operation.parameters.body && operation.parameters.body.type.kind === "Model"
117
+ ? getAllProperties(operation.parameters.body.type).map((p) => [p.name, p.type])
118
+ : []);
119
+ let bodyName = undefined;
120
+ if (operation.parameters.body) {
121
+ const body = operation.parameters.body;
122
+ if (body.contentTypes.length > 1) {
123
+ reportDiagnostic(ctx.program, {
124
+ code: "dynamic-request-content-type",
125
+ target: operation.operation,
126
+ });
127
+ }
128
+ const contentType = body.contentTypes[0] ?? DEFAULT_CONTENT_TYPE;
129
+ const defaultBodyTypeName = operationNameCase.pascalCase + "RequestBody";
130
+ const bodyNameCase = parseCase(body.property?.name ?? defaultBodyTypeName);
131
+ const bodyTypeName = emitTypeReference(ctx, body.type, body.property?.type ?? operation.operation.node, module, { altName: defaultBodyTypeName });
132
+ bodyName = ctx.gensym(bodyNameCase.camelCase);
133
+ module.imports.push({ binder: ["parseHeaderValueParameters"], from: headerHelpers });
134
+ const contentTypeHeader = ctx.gensym("contentType");
135
+ yield ` const ${contentTypeHeader} = parseHeaderValueParameters(${names.ctx}.request.headers["content-type"] as string | undefined);`;
136
+ yield ` if (${contentTypeHeader}?.value !== ${JSON.stringify(contentType)}) {`;
137
+ yield ` return ${names.ctx}.errorHandlers.onInvalidRequest(`;
138
+ yield ` ${names.ctx},`;
139
+ yield ` ${JSON.stringify(operation.path)},`;
140
+ yield ` \`unexpected "content-type": '\${${contentTypeHeader}?.value}', expected '${JSON.stringify(contentType)}'\``;
141
+ yield ` );`;
142
+ yield " }";
143
+ yield "";
144
+ switch (contentType) {
145
+ case "application/merge-patch+json":
146
+ case "application/json": {
147
+ requireSerialization(ctx, body.type, "application/json");
148
+ yield ` const ${bodyName} = await new Promise(function parse${bodyNameCase.pascalCase}(resolve, reject) {`;
149
+ yield ` const chunks: Array<Buffer> = [];`;
150
+ yield ` ${names.ctx}.request.on("data", function appendChunk(chunk) { chunks.push(chunk); });`;
151
+ yield ` ${names.ctx}.request.on("end", function finalize() {`;
152
+ yield ` try {`;
153
+ yield ` const body = Buffer.concat(chunks).toString();`;
154
+ let value;
155
+ if (requiresJsonSerialization(ctx, body.type)) {
156
+ value = `${bodyTypeName}.fromJsonObject(JSON.parse(body))`;
157
+ }
158
+ else {
159
+ value = `JSON.parse(body)`;
160
+ }
161
+ yield ` resolve(${value});`;
162
+ yield ` } catch {`;
163
+ yield ` ${names.ctx}.errorHandlers.onInvalidRequest(`;
164
+ yield ` ${names.ctx},`;
165
+ yield ` ${JSON.stringify(operation.path)},`;
166
+ yield ` "invalid JSON in request body",`;
167
+ yield ` );`;
168
+ yield ` reject();`;
169
+ yield ` }`;
170
+ yield ` });`;
171
+ yield ` ${names.ctx}.request.on("error", reject);`;
172
+ yield ` }) as ${bodyTypeName};`;
173
+ yield "";
174
+ break;
175
+ }
176
+ case "multipart/form-data":
177
+ if (body.bodyKind === "multipart") {
178
+ yield* indent(emitMultipart(ctx, module, operation, body, names.ctx, bodyName, bodyTypeName));
179
+ }
180
+ else {
181
+ yield* indent(emitMultipartLegacy(names.ctx, bodyName, bodyTypeName));
182
+ }
183
+ break;
184
+ default:
185
+ throw new UnimplementedError(`request deserialization for content-type: '${contentType}'`);
186
+ }
187
+ yield "";
188
+ }
189
+ let hasOptions = false;
190
+ const optionalParams = new Map();
191
+ const requiredParams = [];
192
+ for (const param of parameters) {
193
+ let paramBaseExpression;
194
+ const paramNameCase = parseCase(param.name);
195
+ const isBodyField = bodyFields.has(param.name) && bodyFields.get(param.name) === param.type;
196
+ const isBodyExact = operation.parameters.body?.property === param;
197
+ if (isBodyField) {
198
+ paramBaseExpression = `${bodyName}.${paramNameCase.camelCase}`;
199
+ }
200
+ else if (isBodyExact) {
201
+ paramBaseExpression = bodyName;
202
+ }
203
+ else {
204
+ const resolvedParameter = param.type.kind === "ModelProperty" ? param.type : param;
205
+ paramBaseExpression =
206
+ resolvedParameter.type.kind === "Scalar" && parsedParams.has(resolvedParameter)
207
+ ? parseTemplateForScalar(ctx, resolvedParameter.type).replace("{}", paramNameCase.camelCase)
208
+ : paramNameCase.camelCase;
209
+ }
210
+ if (param.optional) {
211
+ hasOptions = true;
212
+ optionalParams.set(paramNameCase.camelCase, paramBaseExpression);
213
+ }
214
+ else {
215
+ requiredParams.push(paramBaseExpression);
216
+ }
217
+ }
218
+ const paramLines = requiredParams.map((p) => `${p},`);
219
+ if (hasOptions) {
220
+ paramLines.push(`{ ${[...optionalParams.entries()].map(([name, expr]) => (name === expr ? name : `${name}: ${expr}`)).join(", ")} }`);
221
+ }
222
+ const returnType = emitTypeReference(ctx, op.returnType, NoTarget, module, {
223
+ altName: operationNameCase.pascalCase + "Result",
224
+ });
225
+ yield ` let ${names.result}: ${returnType};`;
226
+ yield "";
227
+ yield ` try {`;
228
+ yield ` ${names.result} = await ${names.operations}.${operationNameCase.camelCase}(${names.ctx}, `;
229
+ yield* indent(indent(indent(paramLines)));
230
+ yield ` );`;
231
+ yield " } catch(e) {";
232
+ yield ` if (${names.isHttpResponder}(e)) {`;
233
+ yield ` return e[${names.httpResponderSym}](${names.ctx});`;
234
+ yield ` } else throw e;`;
235
+ yield ` }`;
236
+ yield "";
237
+ yield* indent(emitResultProcessing(ctx, names, op.returnType, module));
238
+ yield "}";
239
+ yield "";
240
+ }
241
+ /**
242
+ * Emit the result-processing code for an operation.
243
+ *
244
+ * This code handles writing the result of calling the business logic layer to the HTTP response object.
245
+ *
246
+ * @param ctx - The HTTP emitter context.
247
+ * @param t - The return type of the operation.
248
+ * @param module - The module that the result processing code will be written to.
249
+ */
250
+ function* emitResultProcessing(ctx, names, t, module) {
251
+ if (t.kind !== "Union") {
252
+ // Single target type
253
+ yield* emitResultProcessingForType(ctx, names, t, module);
254
+ }
255
+ else {
256
+ const codeTree = differentiateUnion(ctx, t);
257
+ yield* writeCodeTree(ctx, codeTree, {
258
+ subject: names.result,
259
+ referenceModelProperty(p) {
260
+ return names.result + "." + parseCase(p.name).camelCase;
261
+ },
262
+ // We mapped the output directly in the code tree input, so we can just return it.
263
+ renderResult: (t) => emitResultProcessingForType(ctx, names, t, module),
264
+ });
265
+ }
266
+ }
267
+ /**
268
+ * Emit the result-processing code for a single response type.
269
+ *
270
+ * @param ctx - The HTTP emitter context.
271
+ * @param target - The target type to emit processing code for.
272
+ * @param module - The module that the result processing code will be written to.
273
+ */
274
+ function* emitResultProcessingForType(ctx, names, target, module) {
275
+ if (target.kind === "Intrinsic") {
276
+ switch (target.name) {
277
+ case "void":
278
+ yield `${names.ctx}.response.statusCode = 204;`;
279
+ yield `${names.ctx}.response.end();`;
280
+ return;
281
+ case "null":
282
+ yield `${names.ctx}.response.statusCode = 200;`;
283
+ yield `${names.ctx}.response.setHeader("content-type", "application/json");`;
284
+ yield `${names.ctx}.response.end("null");`;
285
+ return;
286
+ case "unknown":
287
+ yield `${names.ctx}.response.statusCode = 200;`;
288
+ yield `${names.ctx}.response.setHeader("content-type", "application/json");`;
289
+ yield `${names.ctx}.response.end(JSON.stringify(${names.result}));`;
290
+ return;
291
+ case "never":
292
+ yield `return ${names.ctx}.errorHandlers.onInternalError(${names.ctx}, "Internal server error.");`;
293
+ return;
294
+ default:
295
+ throw new UnimplementedError(`result processing for intrinsic type '${target.name}'`);
296
+ }
297
+ }
298
+ if (target.kind !== "Model") {
299
+ throw new UnimplementedError(`result processing for type kind '${target.kind}'`);
300
+ }
301
+ const body = [...target.properties.values()].find((p) => isBody(ctx.program, p));
302
+ for (const property of target.properties.values()) {
303
+ if (isHeader(ctx.program, property)) {
304
+ const headerName = getHeaderFieldName(ctx.program, property);
305
+ yield `${names.ctx}.response.setHeader(${JSON.stringify(headerName.toLowerCase())}, ${names.result}.${parseCase(property.name).camelCase});`;
306
+ if (!body)
307
+ yield `delete (${names.result} as any).${parseCase(property.name).camelCase};`;
308
+ }
309
+ else if (isStatusCode(ctx.program, property)) {
310
+ if (isUnspeakable(property.name)) {
311
+ if (!isValueLiteralType(property.type)) {
312
+ reportDiagnostic(ctx.program, {
313
+ code: "unspeakable-status-code",
314
+ target: property,
315
+ format: {
316
+ name: property.name,
317
+ },
318
+ });
319
+ continue;
320
+ }
321
+ compilerAssert(property.type.kind === "Number", "Status code must be a number.");
322
+ yield `${names.ctx}.response.statusCode = ${property.type.valueAsString};`;
323
+ }
324
+ else {
325
+ yield `${names.ctx}.response.statusCode = ${names.result}.${parseCase(property.name).camelCase};`;
326
+ if (!body)
327
+ yield `delete (${names.result} as any).${parseCase(property.name).camelCase};`;
328
+ }
329
+ }
330
+ }
331
+ const allMetadataIsRemoved = !body &&
332
+ [...target.properties.values()].every((p) => {
333
+ return isHeader(ctx.program, p) || isStatusCode(ctx.program, p);
334
+ });
335
+ if (body) {
336
+ const bodyCase = parseCase(body.name);
337
+ const serializationRequired = isSerializationRequired(ctx, body.type, "application/json");
338
+ requireSerialization(ctx, body.type, "application/json");
339
+ yield `${names.ctx}.response.setHeader("content-type", "application/json");`;
340
+ if (serializationRequired) {
341
+ const typeReference = emitTypeReference(ctx, body.type, body, module, {
342
+ requireDeclaration: true,
343
+ });
344
+ yield `${names.ctx}.response.end(JSON.stringify(${typeReference}.toJsonObject(${names.result}.${bodyCase.camelCase})))`;
345
+ }
346
+ else {
347
+ yield `${names.ctx}.response.end(JSON.stringify(${names.result}.${bodyCase.camelCase}));`;
348
+ }
349
+ }
350
+ else {
351
+ if (allMetadataIsRemoved) {
352
+ yield `${names.ctx}.response.end();`;
353
+ }
354
+ else {
355
+ const serializationRequired = isSerializationRequired(ctx, target, "application/json");
356
+ requireSerialization(ctx, target, "application/json");
357
+ yield `${names.ctx}.response.setHeader("content-type", "application/json");`;
358
+ if (serializationRequired) {
359
+ const typeReference = emitTypeReference(ctx, target, target, module, {
360
+ requireDeclaration: true,
361
+ });
362
+ yield `${names.ctx}.response.end(JSON.stringify(${typeReference}.toJsonObject(${names.result} as ${typeReference})));`;
363
+ }
364
+ else {
365
+ yield `${names.ctx}.response.end(JSON.stringify(${names.result}));`;
366
+ }
367
+ }
368
+ }
369
+ }
370
+ /**
371
+ * Emit code that binds a given header parameter to a variable.
372
+ *
373
+ * If the parameter is not optional, this will also emit a test to ensure that the parameter is present.
374
+ *
375
+ * @param ctx - The HTTP emitter context.
376
+ * @param parameter - The header parameter to bind.
377
+ */
378
+ function* emitHeaderParamBinding(ctx, operation, names, parameter) {
379
+ const nameCase = parseCase(parameter.param.name);
380
+ const headerName = parameter.name.toLowerCase();
381
+ // See https://nodejs.org/api/http.html#messageheaders
382
+ // Apparently, only set-cookie can be an array.
383
+ const canBeArrayType = parameter.name === "set-cookie";
384
+ const assertion = canBeArrayType ? "" : " as string | undefined";
385
+ yield `const ${nameCase.camelCase} = ${names.ctx}.request.headers[${JSON.stringify(headerName)}]${assertion};`;
386
+ if (!parameter.param.optional) {
387
+ yield `if (${nameCase.camelCase} === undefined) {`;
388
+ // prettier-ignore
389
+ yield ` return ${names.ctx}.errorHandlers.onInvalidRequest(${names.ctx}, ${JSON.stringify(operation.path)}, "missing required header '${headerName}'");`;
390
+ yield "}";
391
+ yield "";
392
+ }
393
+ }
394
+ /**
395
+ * Emit code that binds a given query parameter to a variable.
396
+ *
397
+ * If the parameter is not optional, this will also emit a test to ensure that the parameter is present.
398
+ *
399
+ * @param ctx - The HTTP emitter context
400
+ * @param parameter - The query parameter to bind
401
+ */
402
+ function* emitQueryParamBinding(ctx, operation, names, parameter) {
403
+ const nameCase = parseCase(parameter.param.name);
404
+ // UrlSearchParams annoyingly returns null for missing parameters instead of undefined.
405
+ yield `const ${nameCase.camelCase} = ${names.queryParams}.get(${JSON.stringify(parameter.name)}) ?? undefined;`;
406
+ if (!parameter.param.optional) {
407
+ yield `if (!${nameCase.camelCase}) {`;
408
+ yield ` return ${names.ctx}.errorHandlers.onInvalidRequest(${names.ctx}, ${JSON.stringify(operation.path)}, "missing required query parameter '${parameter.name}'");`;
409
+ yield "}";
410
+ yield "";
411
+ }
412
+ }
413
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/http/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { HttpOperation, HttpOperationMultipartBody } from "@typespec/http";
2
+ import { Module } from "../../ctx.js";
3
+ import { HttpContext } from "../index.js";
4
+ /**
5
+ * Parse a multipart request body according to the given body spec.
6
+ *
7
+ * @param ctx - The emitter context.
8
+ * @param module - The module that this parser is written into.
9
+ * @param operation - The HTTP operation this body is being parsed for.
10
+ * @param body - The multipart body spec
11
+ * @param bodyName - The name of the variable to store the parsed body in.
12
+ * @param bodyTypeName - The name of the type of the parsed body.
13
+ */
14
+ export declare function emitMultipart(ctx: HttpContext, module: Module, operation: HttpOperation, body: HttpOperationMultipartBody, ctxName: string, bodyName: string, bodyTypeName: string): Iterable<string>;
15
+ export declare function emitMultipartLegacy(ctxName: string, bodyName: string, bodyTypeName: string): Iterable<string>;
16
+ //# sourceMappingURL=multipart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multipart.d.ts","sourceRoot":"","sources":["../../../../src/http/server/multipart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAc,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAU1C;;;;;;;;;GASG;AACH,wBAAiB,aAAa,CAC5B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,aAAa,EACxB,IAAI,EAAE,0BAA0B,EAChC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,QAAQ,CAAC,MAAM,CAAC,CAoMlB;AAID,wBAAiB,mBAAmB,CAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,QAAQ,CAAC,MAAM,CAAC,CAqClB"}