@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.
- package/CHANGELOG.md +69 -0
- package/LICENSE +21 -0
- package/README.md +183 -0
- package/build-helpers.ts +170 -0
- package/dist/generated-defs/helpers/header.d.ts +4 -0
- package/dist/generated-defs/helpers/header.d.ts.map +1 -0
- package/dist/generated-defs/helpers/header.js +76 -0
- package/dist/generated-defs/helpers/header.js.map +1 -0
- package/dist/generated-defs/helpers/http.d.ts +4 -0
- package/dist/generated-defs/helpers/http.d.ts.map +1 -0
- package/dist/generated-defs/helpers/http.js +134 -0
- package/dist/generated-defs/helpers/http.js.map +1 -0
- package/dist/generated-defs/helpers/index.d.ts +4 -0
- package/dist/generated-defs/helpers/index.d.ts.map +1 -0
- package/dist/generated-defs/helpers/index.js +21 -0
- package/dist/generated-defs/helpers/index.js.map +1 -0
- package/dist/generated-defs/helpers/multipart.d.ts +4 -0
- package/dist/generated-defs/helpers/multipart.d.ts.map +1 -0
- package/dist/generated-defs/helpers/multipart.js +249 -0
- package/dist/generated-defs/helpers/multipart.js.map +1 -0
- package/dist/generated-defs/helpers/router.d.ts +4 -0
- package/dist/generated-defs/helpers/router.d.ts.map +1 -0
- package/dist/generated-defs/helpers/router.js +259 -0
- package/dist/generated-defs/helpers/router.js.map +1 -0
- package/dist/src/common/declaration.d.ts +13 -0
- package/dist/src/common/declaration.d.ts.map +1 -0
- package/dist/src/common/declaration.js +45 -0
- package/dist/src/common/declaration.js.map +1 -0
- package/dist/src/common/documentation.d.ts +12 -0
- package/dist/src/common/documentation.d.ts.map +1 -0
- package/dist/src/common/documentation.js +21 -0
- package/dist/src/common/documentation.js.map +1 -0
- package/dist/src/common/enum.d.ts +10 -0
- package/dist/src/common/enum.d.ts.map +1 -0
- package/dist/src/common/enum.js +21 -0
- package/dist/src/common/enum.js.map +1 -0
- package/dist/src/common/interface.d.ts +50 -0
- package/dist/src/common/interface.d.ts.map +1 -0
- package/dist/src/common/interface.js +194 -0
- package/dist/src/common/interface.js.map +1 -0
- package/dist/src/common/model.d.ts +26 -0
- package/dist/src/common/model.d.ts.map +1 -0
- package/dist/src/common/model.js +115 -0
- package/dist/src/common/model.js.map +1 -0
- package/dist/src/common/namespace.d.ts +38 -0
- package/dist/src/common/namespace.d.ts.map +1 -0
- package/dist/src/common/namespace.js +184 -0
- package/dist/src/common/namespace.js.map +1 -0
- package/dist/src/common/reference.d.ts +46 -0
- package/dist/src/common/reference.d.ts.map +1 -0
- package/dist/src/common/reference.js +243 -0
- package/dist/src/common/reference.js.map +1 -0
- package/dist/src/common/scalar.d.ts +50 -0
- package/dist/src/common/scalar.d.ts.map +1 -0
- package/dist/src/common/scalar.js +144 -0
- package/dist/src/common/scalar.js.map +1 -0
- package/dist/src/common/serialization/index.d.ts +11 -0
- package/dist/src/common/serialization/index.d.ts.map +1 -0
- package/dist/src/common/serialization/index.js +72 -0
- package/dist/src/common/serialization/index.js.map +1 -0
- package/dist/src/common/serialization/json.d.ts +6 -0
- package/dist/src/common/serialization/json.d.ts.map +1 -0
- package/dist/src/common/serialization/json.js +341 -0
- package/dist/src/common/serialization/json.js.map +1 -0
- package/dist/src/common/union.d.ts +23 -0
- package/dist/src/common/union.d.ts.map +1 -0
- package/dist/src/common/union.js +57 -0
- package/dist/src/common/union.js.map +1 -0
- package/dist/src/ctx.d.ts +242 -0
- package/dist/src/ctx.d.ts.map +1 -0
- package/dist/src/ctx.js +211 -0
- package/dist/src/ctx.js.map +1 -0
- package/dist/src/helpers/header.d.ts +14 -0
- package/dist/src/helpers/header.d.ts.map +1 -0
- package/dist/src/helpers/header.js +38 -0
- package/dist/src/helpers/header.js.map +1 -0
- package/dist/src/helpers/http.d.ts +70 -0
- package/dist/src/helpers/http.d.ts.map +1 -0
- package/dist/src/helpers/http.js +86 -0
- package/dist/src/helpers/http.js.map +1 -0
- package/dist/src/helpers/multipart.d.ts +26 -0
- package/dist/src/helpers/multipart.d.ts.map +1 -0
- package/dist/src/helpers/multipart.js +182 -0
- package/dist/src/helpers/multipart.js.map +1 -0
- package/dist/src/helpers/router.d.ts +176 -0
- package/dist/src/helpers/router.d.ts.map +1 -0
- package/dist/src/helpers/router.js +55 -0
- package/dist/src/helpers/router.js.map +1 -0
- package/dist/src/http/index.d.ts +24 -0
- package/dist/src/http/index.d.ts.map +1 -0
- package/dist/src/http/index.js +52 -0
- package/dist/src/http/index.js.map +1 -0
- package/dist/src/http/server/index.d.ts +11 -0
- package/dist/src/http/server/index.d.ts.map +1 -0
- package/dist/src/http/server/index.js +413 -0
- package/dist/src/http/server/index.js.map +1 -0
- package/dist/src/http/server/multipart.d.ts +16 -0
- package/dist/src/http/server/multipart.d.ts.map +1 -0
- package/dist/src/http/server/multipart.js +214 -0
- package/dist/src/http/server/multipart.js.map +1 -0
- package/dist/src/http/server/router.d.ts +15 -0
- package/dist/src/http/server/router.d.ts.map +1 -0
- package/dist/src/http/server/router.js +459 -0
- package/dist/src/http/server/router.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +38 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib.d.ts +141 -0
- package/dist/src/lib.d.ts.map +1 -0
- package/dist/src/lib.js +116 -0
- package/dist/src/lib.js.map +1 -0
- package/dist/src/scripts/scaffold/bin.d.mts +14 -0
- package/dist/src/scripts/scaffold/bin.d.mts.map +1 -0
- package/dist/src/scripts/scaffold/bin.mjs +559 -0
- package/dist/src/scripts/scaffold/bin.mjs.map +1 -0
- package/dist/src/testing/index.d.ts +3 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +6 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/util/case.d.ts +81 -0
- package/dist/src/util/case.d.ts.map +1 -0
- package/dist/src/util/case.js +111 -0
- package/dist/src/util/case.js.map +1 -0
- package/dist/src/util/differentiate.d.ts +251 -0
- package/dist/src/util/differentiate.d.ts.map +1 -0
- package/dist/src/util/differentiate.js +580 -0
- package/dist/src/util/differentiate.js.map +1 -0
- package/dist/src/util/error.d.ts +13 -0
- package/dist/src/util/error.d.ts.map +1 -0
- package/dist/src/util/error.js +25 -0
- package/dist/src/util/error.js.map +1 -0
- package/dist/src/util/extends.d.ts +10 -0
- package/dist/src/util/extends.d.ts.map +1 -0
- package/dist/src/util/extends.js +31 -0
- package/dist/src/util/extends.js.map +1 -0
- package/dist/src/util/iter.d.ts +39 -0
- package/dist/src/util/iter.d.ts.map +1 -0
- package/dist/src/util/iter.js +72 -0
- package/dist/src/util/iter.js.map +1 -0
- package/dist/src/util/keywords.d.ts +10 -0
- package/dist/src/util/keywords.d.ts.map +1 -0
- package/dist/src/util/keywords.js +85 -0
- package/dist/src/util/keywords.js.map +1 -0
- package/dist/src/util/name.d.ts +12 -0
- package/dist/src/util/name.d.ts.map +1 -0
- package/dist/src/util/name.js +26 -0
- package/dist/src/util/name.js.map +1 -0
- package/dist/src/util/once-queue.d.ts +24 -0
- package/dist/src/util/once-queue.d.ts.map +1 -0
- package/dist/src/util/once-queue.js +34 -0
- package/dist/src/util/once-queue.js.map +1 -0
- package/dist/src/util/openapi3.d.ts +23 -0
- package/dist/src/util/openapi3.d.ts.map +1 -0
- package/dist/src/util/openapi3.js +40 -0
- package/dist/src/util/openapi3.js.map +1 -0
- package/dist/src/util/pluralism.d.ts +23 -0
- package/dist/src/util/pluralism.d.ts.map +1 -0
- package/dist/src/util/pluralism.js +36 -0
- package/dist/src/util/pluralism.js.map +1 -0
- package/dist/src/util/scope.d.ts +85 -0
- package/dist/src/util/scope.d.ts.map +1 -0
- package/dist/src/util/scope.js +111 -0
- package/dist/src/util/scope.js.map +1 -0
- package/dist/src/write.d.ts +23 -0
- package/dist/src/write.d.ts.map +1 -0
- package/dist/src/write.js +62 -0
- package/dist/src/write.js.map +1 -0
- package/generated-defs/helpers/header.ts +83 -0
- package/generated-defs/helpers/http.ts +141 -0
- package/generated-defs/helpers/index.ts +27 -0
- package/generated-defs/helpers/multipart.ts +256 -0
- package/generated-defs/helpers/router.ts +266 -0
- package/package.json +71 -0
- package/src/common/declaration.ts +52 -0
- package/src/common/documentation.ts +26 -0
- package/src/common/enum.ts +28 -0
- package/src/common/interface.ts +264 -0
- package/src/common/model.ts +160 -0
- package/src/common/namespace.ts +243 -0
- package/src/common/reference.ts +319 -0
- package/src/common/scalar.ts +173 -0
- package/src/common/serialization/index.ts +124 -0
- package/src/common/serialization/json.ts +444 -0
- package/src/common/union.ts +76 -0
- package/src/ctx.ts +497 -0
- package/src/helpers/header.ts +55 -0
- package/src/helpers/http.ts +113 -0
- package/src/helpers/multipart.ts +228 -0
- package/src/helpers/router.ts +238 -0
- package/src/http/index.ts +81 -0
- package/src/http/server/index.ts +548 -0
- package/src/http/server/multipart.ts +272 -0
- package/src/http/server/router.ts +686 -0
- package/src/index.ts +56 -0
- package/src/lib.ts +130 -0
- package/src/scripts/scaffold/bin.mts +781 -0
- package/src/testing/index.ts +10 -0
- package/src/util/case.ts +182 -0
- package/src/util/differentiate.ts +957 -0
- package/src/util/error.ts +28 -0
- package/src/util/extends.ts +43 -0
- package/src/util/iter.ts +85 -0
- package/src/util/keywords.ts +90 -0
- package/src/util/name.ts +33 -0
- package/src/util/once-queue.ts +55 -0
- package/src/util/openapi3.ts +53 -0
- package/src/util/pluralism.ts +37 -0
- package/src/util/scope.ts +211 -0
- package/src/write.ts +88 -0
- package/temp/tsconfig.tsbuildinfo +1 -0
- package/test/header.test.ts +26 -0
- package/test/multipart.test.ts +169 -0
- package/tsconfig.json +10 -0
- package/vitest.config.ts +4 -0
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation
|
|
2
|
+
// Licensed under the MIT license.
|
|
3
|
+
import { getHttpOperation, } from "@typespec/http";
|
|
4
|
+
import { createOrGetModuleForNamespace, emitNamespaceInterfaceReference, } from "../../common/namespace.js";
|
|
5
|
+
import { emitTypeReference } from "../../common/reference.js";
|
|
6
|
+
import { createModule } from "../../ctx.js";
|
|
7
|
+
import { parseCase } from "../../util/case.js";
|
|
8
|
+
import { bifilter, indent } from "../../util/iter.js";
|
|
9
|
+
import { keywordSafe } from "../../util/keywords.js";
|
|
10
|
+
import { module as headerHelpers } from "../../../generated-defs/helpers/header.js";
|
|
11
|
+
import { module as routerHelper } from "../../../generated-defs/helpers/router.js";
|
|
12
|
+
import { parseHeaderValueParameters } from "../../helpers/header.js";
|
|
13
|
+
import { reportDiagnostic } from "../../lib.js";
|
|
14
|
+
import { UnimplementedError } from "../../util/error.js";
|
|
15
|
+
/**
|
|
16
|
+
* Emit a router for the HTTP operations defined in a given service.
|
|
17
|
+
*
|
|
18
|
+
* The generated router will use optimal prefix matching to dispatch requests to the appropriate underlying
|
|
19
|
+
* implementation using the raw server.
|
|
20
|
+
*
|
|
21
|
+
* @param ctx - The emitter context.
|
|
22
|
+
* @param service - The HTTP service to emit a router for.
|
|
23
|
+
* @param serverRawModule - The module that contains the raw server implementation.
|
|
24
|
+
*/
|
|
25
|
+
export function emitRouter(ctx, service, serverRawModule) {
|
|
26
|
+
const routerModule = createModule("router", ctx.httpModule);
|
|
27
|
+
const routeTree = createRouteTree(ctx, service);
|
|
28
|
+
routerModule.imports.push({
|
|
29
|
+
binder: "* as http",
|
|
30
|
+
from: "node:http",
|
|
31
|
+
});
|
|
32
|
+
routerModule.imports.push({
|
|
33
|
+
binder: "* as serverRaw",
|
|
34
|
+
from: serverRawModule,
|
|
35
|
+
});
|
|
36
|
+
routerModule.imports.push({
|
|
37
|
+
binder: ["parseHeaderValueParameters"],
|
|
38
|
+
from: headerHelpers,
|
|
39
|
+
});
|
|
40
|
+
routerModule.declarations.push([...emitRouterDefinition(ctx, service, routeTree, routerModule)]);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Writes the code for a router of a given service.
|
|
44
|
+
*
|
|
45
|
+
* @param ctx - The emitter context.
|
|
46
|
+
* @param service - The HTTP service to emit a router for.
|
|
47
|
+
* @param routeTree - The service's route tree.
|
|
48
|
+
* @param module - The module we're writing to.
|
|
49
|
+
*/
|
|
50
|
+
function* emitRouterDefinition(ctx, service, routeTree, module) {
|
|
51
|
+
const routerName = parseCase(service.namespace.name).pascalCase + "Router";
|
|
52
|
+
const uniqueContainers = new Set(service.operations.map((operation) => operation.container));
|
|
53
|
+
const backends = new Map();
|
|
54
|
+
for (const container of uniqueContainers) {
|
|
55
|
+
const param = parseCase(container.name);
|
|
56
|
+
const traitConstraint = container.kind === "Namespace"
|
|
57
|
+
? emitNamespaceInterfaceReference(ctx, container, module)
|
|
58
|
+
: emitTypeReference(ctx, container, container, module);
|
|
59
|
+
module.imports.push({
|
|
60
|
+
binder: [param.pascalCase],
|
|
61
|
+
from: createOrGetModuleForNamespace(ctx, container.namespace),
|
|
62
|
+
});
|
|
63
|
+
backends.set(container, [param, traitConstraint]);
|
|
64
|
+
}
|
|
65
|
+
module.imports.push({
|
|
66
|
+
binder: ["RouterOptions", "createPolicyChain", "createPolicyChainForRoute", "HttpContext"],
|
|
67
|
+
from: routerHelper,
|
|
68
|
+
});
|
|
69
|
+
yield `export interface ${routerName} {`;
|
|
70
|
+
yield ` /**`;
|
|
71
|
+
yield ` * Dispatches the request to the appropriate service based on the request path.`;
|
|
72
|
+
yield ` *`;
|
|
73
|
+
yield ` * This member function may be used directly as a handler for a Node HTTP server.`;
|
|
74
|
+
yield ` *`;
|
|
75
|
+
yield ` * @param request - The incoming HTTP request.`;
|
|
76
|
+
yield ` * @param response - The outgoing HTTP response.`;
|
|
77
|
+
yield ` */`;
|
|
78
|
+
yield ` dispatch(request: http.IncomingMessage, response: http.ServerResponse): void;`;
|
|
79
|
+
if (ctx.options.express) {
|
|
80
|
+
yield "";
|
|
81
|
+
yield ` /**`;
|
|
82
|
+
yield ` * An Express middleware function that dispatches the request to the appropriate service based on the request path.`;
|
|
83
|
+
yield ` *`;
|
|
84
|
+
yield ` * This member function may be used directly as an application-level middleware function in an Express app.`;
|
|
85
|
+
yield ` *`;
|
|
86
|
+
yield ` * If the router does not match a route, it will call the \`next\` middleware registered with the application,`;
|
|
87
|
+
yield ` * so it is sensible to insert this middleware at the beginning of the middleware stack.`;
|
|
88
|
+
yield ` *`;
|
|
89
|
+
yield ` * @param req - The incoming HTTP request.`;
|
|
90
|
+
yield ` * @param res - The outgoing HTTP response.`;
|
|
91
|
+
yield ` * @param next - The next middleware function in the stack.`;
|
|
92
|
+
yield ` */`;
|
|
93
|
+
yield ` expressMiddleware(req: http.IncomingMessage, res: http.ServerResponse, next: () => void): void;`;
|
|
94
|
+
}
|
|
95
|
+
yield "}";
|
|
96
|
+
yield "";
|
|
97
|
+
yield `export function create${routerName}(`;
|
|
98
|
+
for (const [param] of backends.values()) {
|
|
99
|
+
yield ` ${param.camelCase}: ${param.pascalCase},`;
|
|
100
|
+
}
|
|
101
|
+
yield ` options: RouterOptions<{`;
|
|
102
|
+
for (const [param] of backends.values()) {
|
|
103
|
+
yield ` ${param.camelCase}: ${param.pascalCase}<HttpContext>,`;
|
|
104
|
+
}
|
|
105
|
+
yield ` }> = {}`;
|
|
106
|
+
yield `): ${routerName} {`;
|
|
107
|
+
const [onRequestNotFound, onInvalidRequest, onInternalError] = [
|
|
108
|
+
"onRequestNotFound",
|
|
109
|
+
"onInvalidRequest",
|
|
110
|
+
"onInternalError",
|
|
111
|
+
].map(ctx.gensym);
|
|
112
|
+
// Router error case handlers
|
|
113
|
+
yield ` const ${onRequestNotFound} = options.onRequestNotFound ?? ((ctx) => {`;
|
|
114
|
+
yield ` ctx.response.statusCode = 404;`;
|
|
115
|
+
yield ` ctx.response.setHeader("Content-Type", "text/plain");`;
|
|
116
|
+
yield ` ctx.response.end("Not Found");`;
|
|
117
|
+
yield ` });`;
|
|
118
|
+
yield "";
|
|
119
|
+
yield ` const ${onInvalidRequest} = options.onInvalidRequest ?? ((ctx, route, error) => {`;
|
|
120
|
+
yield ` ctx.response.statusCode = 400;`;
|
|
121
|
+
yield ` ctx.response.setHeader("Content-Type", "application/json");`;
|
|
122
|
+
yield ` ctx.response.end(JSON.stringify({ error }));`;
|
|
123
|
+
yield ` });`;
|
|
124
|
+
yield "";
|
|
125
|
+
yield ` const ${onInternalError} = options.onInternalError ?? ((ctx, error) => {`;
|
|
126
|
+
yield ` ctx.response.statusCode = 500;`;
|
|
127
|
+
yield ` ctx.response.setHeader("Content-Type", "text/plain");`;
|
|
128
|
+
yield ` ctx.response.end("Internal server error.");`;
|
|
129
|
+
yield ` });`;
|
|
130
|
+
yield "";
|
|
131
|
+
const routePolicies = ctx.gensym("routePolicies");
|
|
132
|
+
const routeHandlers = ctx.gensym("routeHandlers");
|
|
133
|
+
yield ` const ${routePolicies} = options.routePolicies ?? {};`;
|
|
134
|
+
yield "";
|
|
135
|
+
yield ` const ${routeHandlers} = {`;
|
|
136
|
+
// Policy chains for each operation
|
|
137
|
+
for (const operation of service.operations) {
|
|
138
|
+
const operationName = parseCase(operation.operation.name);
|
|
139
|
+
const containerName = parseCase(operation.container.name);
|
|
140
|
+
yield ` ${containerName.snakeCase}_${operationName.snakeCase}: createPolicyChainForRoute(`;
|
|
141
|
+
yield ` "${containerName.camelCase + operationName.pascalCase + "Dispatch"}",`;
|
|
142
|
+
yield ` ${routePolicies},`;
|
|
143
|
+
yield ` "${containerName.camelCase}",`;
|
|
144
|
+
yield ` "${operationName.camelCase}",`;
|
|
145
|
+
yield ` serverRaw.${containerName.snakeCase}_${operationName.snakeCase},`;
|
|
146
|
+
yield ` ),`;
|
|
147
|
+
}
|
|
148
|
+
yield ` } as const;`;
|
|
149
|
+
yield "";
|
|
150
|
+
// Core routing function definition
|
|
151
|
+
yield ` const dispatch = createPolicyChain("${routerName}Dispatch", options.policies ?? [], async function(ctx, request, response) {`;
|
|
152
|
+
yield ` const url = new URL(request.url!, \`http://\${request.headers.host}\`);`;
|
|
153
|
+
yield ` let path = url.pathname;`;
|
|
154
|
+
yield "";
|
|
155
|
+
yield* indent(indent(emitRouteHandler(ctx, routeHandlers, routeTree, backends, module)));
|
|
156
|
+
yield "";
|
|
157
|
+
yield ` return ctx.errorHandlers.onRequestNotFound(ctx);`;
|
|
158
|
+
yield ` });`;
|
|
159
|
+
yield "";
|
|
160
|
+
const errorHandlers = ctx.gensym("errorHandlers");
|
|
161
|
+
yield ` const ${errorHandlers} = {`;
|
|
162
|
+
yield ` onRequestNotFound: ${onRequestNotFound},`;
|
|
163
|
+
yield ` onInvalidRequest: ${onInvalidRequest},`;
|
|
164
|
+
yield ` onInternalError: ${onInternalError},`;
|
|
165
|
+
yield ` };`;
|
|
166
|
+
yield ` return {`;
|
|
167
|
+
yield ` dispatch(request, response) {`;
|
|
168
|
+
yield ` const ctx = { request, response, errorHandlers: ${errorHandlers} };`;
|
|
169
|
+
yield ` return dispatch(ctx, request, response).catch((e) => ${onInternalError}(ctx, e));`;
|
|
170
|
+
yield ` },`;
|
|
171
|
+
if (ctx.options.express) {
|
|
172
|
+
yield ` expressMiddleware: function (request, response, next) {`;
|
|
173
|
+
yield ` const ctx = { request, response, errorHandlers: ${errorHandlers} };`;
|
|
174
|
+
yield ` void dispatch(`;
|
|
175
|
+
yield ` { request, response, errorHandlers: {`;
|
|
176
|
+
yield ` ...${errorHandlers},`;
|
|
177
|
+
yield ` onRequestNotFound: function () { next() }`;
|
|
178
|
+
yield ` }},`;
|
|
179
|
+
yield ` request,`;
|
|
180
|
+
yield ` response`;
|
|
181
|
+
yield ` ).catch((e) => ${onInternalError}(ctx, e));`;
|
|
182
|
+
yield ` },`;
|
|
183
|
+
}
|
|
184
|
+
yield " }";
|
|
185
|
+
yield "}";
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Writes handling code for a single route tree node.
|
|
189
|
+
*
|
|
190
|
+
* @param ctx - The emitter context.
|
|
191
|
+
* @param routeTree - The route tree node to write handling code for.
|
|
192
|
+
* @param backends - The map of backends for operations.
|
|
193
|
+
* @param module - The module we're writing to.
|
|
194
|
+
*/
|
|
195
|
+
function* emitRouteHandler(ctx, routeHandlers, routeTree, backends, module) {
|
|
196
|
+
const mustTerminate = routeTree.edges.length === 0 && !routeTree.bind;
|
|
197
|
+
const onRouteNotFound = "ctx.errorHandlers.onRequestNotFound";
|
|
198
|
+
yield `if (path.length === 0) {`;
|
|
199
|
+
if (routeTree.operations.size > 0) {
|
|
200
|
+
yield* indent(emitRouteOperationDispatch(ctx, routeHandlers, routeTree.operations, backends));
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
// Not found
|
|
204
|
+
yield ` return ${onRouteNotFound}(ctx);`;
|
|
205
|
+
}
|
|
206
|
+
yield `}`;
|
|
207
|
+
if (mustTerminate) {
|
|
208
|
+
// Not found
|
|
209
|
+
yield "else {";
|
|
210
|
+
yield ` return ${onRouteNotFound}(ctx);`;
|
|
211
|
+
yield `}`;
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
for (const [edge, nextTree] of routeTree.edges) {
|
|
215
|
+
const edgePattern = edge.length === 1 ? `'${edge}'` : JSON.stringify(edge);
|
|
216
|
+
yield `else if (path.startsWith(${edgePattern})) {`;
|
|
217
|
+
yield ` path = path.slice(${edge.length});`;
|
|
218
|
+
yield* indent(emitRouteHandler(ctx, routeHandlers, nextTree, backends, module));
|
|
219
|
+
yield "}";
|
|
220
|
+
}
|
|
221
|
+
if (routeTree.bind) {
|
|
222
|
+
const [parameterSet, nextTree] = routeTree.bind;
|
|
223
|
+
const parameters = [...parameterSet];
|
|
224
|
+
yield `else {`;
|
|
225
|
+
const paramName = parameters.length === 1 ? parameters[0] : "param";
|
|
226
|
+
const idxName = `__${parseCase(paramName).snakeCase}_idx`;
|
|
227
|
+
yield ` let ${idxName} = path.indexOf("/");`;
|
|
228
|
+
yield ` ${idxName} = ${idxName} === -1 ? path.length : ${idxName};`;
|
|
229
|
+
yield ` const ${paramName} = path.slice(0, ${idxName});`;
|
|
230
|
+
yield ` path = path.slice(${idxName});`;
|
|
231
|
+
if (parameters.length !== 1) {
|
|
232
|
+
for (const p of parameters) {
|
|
233
|
+
yield ` const ${parseCase(p).camelCase} = param;`;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
yield* indent(emitRouteHandler(ctx, routeHandlers, nextTree, backends, module));
|
|
237
|
+
yield `}`;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Writes the dispatch code for a specific set of operations mapped to the same route.
|
|
242
|
+
*
|
|
243
|
+
* @param ctx - The emitter context.
|
|
244
|
+
* @param operations - The operations mapped to the route.
|
|
245
|
+
* @param backends - The map of backends for operations.
|
|
246
|
+
*/
|
|
247
|
+
function* emitRouteOperationDispatch(ctx, routeHandlers, operations, backends) {
|
|
248
|
+
yield `switch (request.method) {`;
|
|
249
|
+
for (const [verb, operationList] of operations.entries()) {
|
|
250
|
+
if (operationList.length === 1) {
|
|
251
|
+
const operation = operationList[0];
|
|
252
|
+
const [backend] = backends.get(operation.container);
|
|
253
|
+
const operationName = keywordSafe(backend.snakeCase + "_" + parseCase(operation.operation.name).snakeCase);
|
|
254
|
+
const backendMemberName = backend.camelCase;
|
|
255
|
+
const parameters = operation.parameters.length > 0
|
|
256
|
+
? ", " + operation.parameters.map((param) => parseCase(param.name).camelCase).join(", ")
|
|
257
|
+
: "";
|
|
258
|
+
yield ` case ${JSON.stringify(verb.toUpperCase())}:`;
|
|
259
|
+
yield ` return ${routeHandlers}.${operationName}(ctx, ${backendMemberName}${parameters});`;
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
// Shared route
|
|
263
|
+
const route = getHttpOperation(ctx.program, operationList[0].operation)[0].path;
|
|
264
|
+
yield ` case ${JSON.stringify(verb.toUpperCase())}:`;
|
|
265
|
+
yield* indent(indent(emitRouteOperationDispatchMultiple(ctx, routeHandlers, operationList, route, backends)));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
yield ` default:`;
|
|
269
|
+
yield ` return ctx.errorHandlers.onRequestNotFound(ctx);`;
|
|
270
|
+
yield "}";
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Writes the dispatch code for a specific set of operations mapped to the same route.
|
|
274
|
+
*
|
|
275
|
+
* @param ctx - The emitter context.
|
|
276
|
+
* @param operations - The operations mapped to the route.
|
|
277
|
+
* @param backends - The map of backends for operations.
|
|
278
|
+
*/
|
|
279
|
+
function* emitRouteOperationDispatchMultiple(ctx, routeHandlers, operations, route, backends) {
|
|
280
|
+
const usedContentTypes = new Set();
|
|
281
|
+
const contentTypeMap = new Map();
|
|
282
|
+
for (const operation of operations) {
|
|
283
|
+
const [httpOperation] = getHttpOperation(ctx.program, operation.operation);
|
|
284
|
+
const operationContentType = httpOperation.parameters.parameters.find((param) => param.type === "header" && param.name.toLowerCase() === "content-type")?.param.type;
|
|
285
|
+
if (!operationContentType || operationContentType.kind !== "String") {
|
|
286
|
+
throw new UnimplementedError("Only string content-types are supported for route differentiation.");
|
|
287
|
+
}
|
|
288
|
+
if (usedContentTypes.has(operationContentType.value)) {
|
|
289
|
+
reportDiagnostic(ctx.program, {
|
|
290
|
+
code: "undifferentiable-route",
|
|
291
|
+
target: httpOperation.operation,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
usedContentTypes.add(operationContentType.value);
|
|
295
|
+
contentTypeMap.set(operation, operationContentType.value);
|
|
296
|
+
}
|
|
297
|
+
const contentTypeName = ctx.gensym("contentType");
|
|
298
|
+
yield `const ${contentTypeName} = parseHeaderValueParameters(request.headers["content-type"])?.value;`;
|
|
299
|
+
yield `switch (${contentTypeName}) {`;
|
|
300
|
+
for (const [operation, contentType] of contentTypeMap.entries()) {
|
|
301
|
+
const [backend] = backends.get(operation.container);
|
|
302
|
+
const operationName = keywordSafe(backend.snakeCase + "_" + parseCase(operation.operation.name).snakeCase);
|
|
303
|
+
const backendMemberName = backend.camelCase;
|
|
304
|
+
const parameters = operation.parameters.length > 0
|
|
305
|
+
? ", " + operation.parameters.map((param) => parseCase(param.name).camelCase).join(", ")
|
|
306
|
+
: "";
|
|
307
|
+
const contentTypeValue = parseHeaderValueParameters(contentType).value;
|
|
308
|
+
yield ` case ${JSON.stringify(contentTypeValue)}:`;
|
|
309
|
+
yield ` return ${routeHandlers}.${operationName}(ctx, ${backendMemberName}${parameters});`;
|
|
310
|
+
}
|
|
311
|
+
yield ` default:`;
|
|
312
|
+
yield ` return ctx.errorHandlers.onInvalidRequest(ctx, ${JSON.stringify(route)}, \`No operation in route '${route}' matched content-type "\${${contentTypeName}}"\`);`;
|
|
313
|
+
yield "}";
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Create a route tree for a given service.
|
|
317
|
+
*/
|
|
318
|
+
function createRouteTree(ctx, service) {
|
|
319
|
+
// First get the Route for each operation in the service.
|
|
320
|
+
const routes = service.operations.map(function (operation) {
|
|
321
|
+
const segments = getRouteSegments(ctx, operation);
|
|
322
|
+
return {
|
|
323
|
+
operation: operation.operation,
|
|
324
|
+
container: operation.container,
|
|
325
|
+
verb: operation.verb,
|
|
326
|
+
parameters: segments.filter((segment) => typeof segment !== "string"),
|
|
327
|
+
segments,
|
|
328
|
+
};
|
|
329
|
+
});
|
|
330
|
+
// Build the tree by iteratively removing common prefixes from the text segments.
|
|
331
|
+
const tree = intoRouteTree(routes);
|
|
332
|
+
return tree;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Build a route tree from a list of routes.
|
|
336
|
+
*
|
|
337
|
+
* This iteratively removes common segments from the routes and then for all routes matching a given common prefix,
|
|
338
|
+
* builds a nested tree from their subsequent segments.
|
|
339
|
+
*
|
|
340
|
+
* @param routes - the routes to build the tree from
|
|
341
|
+
*/
|
|
342
|
+
function intoRouteTree(routes) {
|
|
343
|
+
const [operations, rest] = bifilter(routes, (route) => route.segments.length === 0);
|
|
344
|
+
const [literal, parameterized] = bifilter(rest, (route) => typeof route.segments[0] === "string");
|
|
345
|
+
const edgeMap = new Map();
|
|
346
|
+
// Group the routes by common prefix
|
|
347
|
+
outer: for (const literalRoute of literal) {
|
|
348
|
+
const segment = literalRoute.segments[0];
|
|
349
|
+
for (const edge of [...edgeMap.keys()]) {
|
|
350
|
+
const prefix = commonPrefix(segment, edge);
|
|
351
|
+
if (prefix.length > 0) {
|
|
352
|
+
const existing = edgeMap.get(edge);
|
|
353
|
+
edgeMap.delete(edge);
|
|
354
|
+
edgeMap.set(prefix, [...existing, literalRoute]);
|
|
355
|
+
continue outer;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
edgeMap.set(segment, [literalRoute]);
|
|
359
|
+
}
|
|
360
|
+
const edges = [...edgeMap.entries()].map(([edge, routes]) => [
|
|
361
|
+
edge,
|
|
362
|
+
intoRouteTree(routes.map(function removePrefix(route) {
|
|
363
|
+
const [prefix, ...rest] = route.segments;
|
|
364
|
+
if (prefix === edge) {
|
|
365
|
+
return { ...route, segments: rest };
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
return {
|
|
369
|
+
...route,
|
|
370
|
+
segments: [prefix.substring(edge.length), ...rest],
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
})),
|
|
374
|
+
]);
|
|
375
|
+
let bind;
|
|
376
|
+
if (parameterized.length > 0) {
|
|
377
|
+
const parameters = new Set();
|
|
378
|
+
const nextRoutes = [];
|
|
379
|
+
for (const parameterizedRoute of parameterized) {
|
|
380
|
+
const [{ name }, ...rest] = parameterizedRoute.segments;
|
|
381
|
+
parameters.add(name);
|
|
382
|
+
nextRoutes.push({ ...parameterizedRoute, segments: rest });
|
|
383
|
+
}
|
|
384
|
+
bind = [parameters, intoRouteTree(nextRoutes)];
|
|
385
|
+
}
|
|
386
|
+
const operationMap = new Map();
|
|
387
|
+
for (const operation of operations) {
|
|
388
|
+
let operations = operationMap.get(operation.verb);
|
|
389
|
+
if (!operations) {
|
|
390
|
+
operations = [];
|
|
391
|
+
operationMap.set(operation.verb, operations);
|
|
392
|
+
}
|
|
393
|
+
operations.push(operation);
|
|
394
|
+
}
|
|
395
|
+
return {
|
|
396
|
+
operations: operationMap,
|
|
397
|
+
bind,
|
|
398
|
+
edges,
|
|
399
|
+
};
|
|
400
|
+
function commonPrefix(a, b) {
|
|
401
|
+
let i = 0;
|
|
402
|
+
while (i < a.length && i < b.length && a[i] === b[i]) {
|
|
403
|
+
i++;
|
|
404
|
+
}
|
|
405
|
+
return a.substring(0, i);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
function getRouteSegments(ctx, operation) {
|
|
409
|
+
// Parse the route template into segments of "prefixes" (i.e. literal strings)
|
|
410
|
+
// and parameters (names enclosed in curly braces). The "/" character does not
|
|
411
|
+
// actually matter for this. We just want to know what the segments of the route
|
|
412
|
+
// are.
|
|
413
|
+
//
|
|
414
|
+
// Examples:
|
|
415
|
+
// "" => []
|
|
416
|
+
// "/users" => ["/users"]
|
|
417
|
+
// "/users/{userId}" => ["/users/", {name: "userId"}]
|
|
418
|
+
// "/users/{userId}/posts/{postId}" => ["/users/", {name: "userId"}, "/posts/", {name: "postId"}]
|
|
419
|
+
const segments = [];
|
|
420
|
+
const parameterTypeMap = new Map([...operation.parameters.parameters.values()].map((p) => [
|
|
421
|
+
p.param.name,
|
|
422
|
+
p.param.type.kind === "ModelProperty" ? p.param.type.type : p.param.type,
|
|
423
|
+
]));
|
|
424
|
+
let remainingTemplate = operation.path;
|
|
425
|
+
while (remainingTemplate.length > 0) {
|
|
426
|
+
// Scan for next `{` character
|
|
427
|
+
const openBraceIndex = remainingTemplate.indexOf("{");
|
|
428
|
+
if (openBraceIndex === -1) {
|
|
429
|
+
// No more parameters, just add the remaining string as a segment
|
|
430
|
+
segments.push(remainingTemplate);
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
// Add the prefix before the parameter, if there is one
|
|
434
|
+
if (openBraceIndex > 0) {
|
|
435
|
+
segments.push(remainingTemplate.substring(0, openBraceIndex));
|
|
436
|
+
}
|
|
437
|
+
// Scan for next `}` character
|
|
438
|
+
const closeBraceIndex = remainingTemplate.indexOf("}", openBraceIndex);
|
|
439
|
+
if (closeBraceIndex === -1) {
|
|
440
|
+
// This is an error in the HTTP layer, so we'll just treat it as if the parameter ends here
|
|
441
|
+
// and captures the rest of the string as its name.
|
|
442
|
+
segments.push({
|
|
443
|
+
name: remainingTemplate.substring(openBraceIndex + 1),
|
|
444
|
+
type: undefined,
|
|
445
|
+
});
|
|
446
|
+
break;
|
|
447
|
+
}
|
|
448
|
+
// Extract the parameter name
|
|
449
|
+
const parameterName = remainingTemplate.substring(openBraceIndex + 1, closeBraceIndex);
|
|
450
|
+
segments.push({
|
|
451
|
+
name: parameterName,
|
|
452
|
+
type: parameterTypeMap.get(parameterName),
|
|
453
|
+
});
|
|
454
|
+
// Move to the next segment
|
|
455
|
+
remainingTemplate = remainingTemplate.substring(closeBraceIndex + 1);
|
|
456
|
+
}
|
|
457
|
+
return segments;
|
|
458
|
+
}
|
|
459
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../src/http/server/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAW5C,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,gBAAgB,CAAC,iBAoCnE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation
|
|
2
|
+
// Licensed under the MIT license.
|
|
3
|
+
import { visitAllTypes } from "./common/namespace.js";
|
|
4
|
+
import { createInitialContext } from "./ctx.js";
|
|
5
|
+
import { writeModuleTree } from "./write.js";
|
|
6
|
+
// #region features
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { emitSerialization } from "./common/serialization/index.js";
|
|
9
|
+
import { emitHttp } from "./http/index.js";
|
|
10
|
+
// #endregion
|
|
11
|
+
export { $lib } from "./lib.js";
|
|
12
|
+
export async function $onEmit(context) {
|
|
13
|
+
const jsCtx = await createInitialContext(context.program, context.options);
|
|
14
|
+
if (!jsCtx)
|
|
15
|
+
return;
|
|
16
|
+
await emitHttp(jsCtx);
|
|
17
|
+
if (!context.options["omit-unreachable-types"]) {
|
|
18
|
+
// Visit everything in the service namespace to ensure we emit a full `models` module and not just the subparts that
|
|
19
|
+
// are reachable from the service impl.
|
|
20
|
+
visitAllTypes(jsCtx, jsCtx.service.type);
|
|
21
|
+
}
|
|
22
|
+
// Emit serialization code for all required types.
|
|
23
|
+
emitSerialization(jsCtx);
|
|
24
|
+
const srcGeneratedPath = path.join(context.emitterOutputDir, "src", "generated");
|
|
25
|
+
if (!context.program.compilerOptions.noEmit) {
|
|
26
|
+
try {
|
|
27
|
+
const stat = await context.program.host.stat(srcGeneratedPath);
|
|
28
|
+
if (stat.isDirectory()) {
|
|
29
|
+
await context.program.host.rm(srcGeneratedPath, {
|
|
30
|
+
recursive: true,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch { }
|
|
35
|
+
await writeModuleTree(jsCtx, context.emitterOutputDir, jsCtx.rootModule, !context.options["no-format"]);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,kCAAkC;AAGlC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,mBAAmB;AAEnB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,aAAa;AAEb,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAsC;IAClE,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3E,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,EAAE,CAAC;QAC/C,oHAAoH;QACpH,uCAAuC;QAEvC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,kDAAkD;IAClD,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAEzB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAEjF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/D,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE;oBAC9C,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,MAAM,eAAe,CACnB,KAAK,EACL,OAAO,CAAC,gBAAgB,EACxB,KAAK,CAAC,UAAU,EAChB,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAC9B,CAAC;IACJ,CAAC;AACH,CAAC"}
|