typespec-fastify 0.1.0 → 0.3.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 (56) hide show
  1. package/LICENSE +21 -0
  2. package/dist/src/components/ModelsDirectory.js +8 -2
  3. package/dist/src/components/ModelsDirectory.js.map +1 -1
  4. package/dist/src/components/ModelsDirectory.jsx +4 -0
  5. package/dist/src/components/ModelsDirectory.jsx.map +1 -1
  6. package/dist/src/components/OperationInterface.js +45 -30
  7. package/dist/src/components/OperationInterface.js.map +1 -1
  8. package/dist/src/components/OperationInterface.jsx +30 -23
  9. package/dist/src/components/OperationInterface.jsx.map +1 -1
  10. package/dist/src/components/OperationsDirectory.js +12 -4
  11. package/dist/src/components/OperationsDirectory.js.map +1 -1
  12. package/dist/src/components/OperationsDirectory.jsx +14 -1
  13. package/dist/src/components/OperationsDirectory.jsx.map +1 -1
  14. package/dist/src/components/ResponseTypes.d.ts +4 -0
  15. package/dist/src/components/ResponseTypes.js +21 -0
  16. package/dist/src/components/ResponseTypes.js.map +1 -0
  17. package/dist/src/components/ResponseTypes.jsx +27 -0
  18. package/dist/src/components/ResponseTypes.jsx.map +1 -0
  19. package/dist/src/components/RouteRegistration.d.ts +2 -2
  20. package/dist/src/components/RouteRegistration.js +142 -71
  21. package/dist/src/components/RouteRegistration.js.map +1 -1
  22. package/dist/src/components/RouteRegistration.jsx +148 -49
  23. package/dist/src/components/RouteRegistration.jsx.map +1 -1
  24. package/dist/src/components/RouterFile.js +19 -15
  25. package/dist/src/components/RouterFile.js.map +1 -1
  26. package/dist/src/components/RouterFile.jsx +11 -9
  27. package/dist/src/components/RouterFile.jsx.map +1 -1
  28. package/dist/src/components/RoutesDirectory.js +27 -26
  29. package/dist/src/components/RoutesDirectory.js.map +1 -1
  30. package/dist/src/components/RoutesDirectory.jsx +12 -15
  31. package/dist/src/components/RoutesDirectory.jsx.map +1 -1
  32. package/dist/src/components/ZodSchemasDirectory.d.ts +9 -0
  33. package/dist/src/components/ZodSchemasDirectory.js +37 -0
  34. package/dist/src/components/ZodSchemasDirectory.js.map +1 -0
  35. package/dist/src/components/ZodSchemasDirectory.jsx +25 -0
  36. package/dist/src/components/ZodSchemasDirectory.jsx.map +1 -0
  37. package/dist/src/emitter.js +13 -1
  38. package/dist/src/emitter.js.map +1 -1
  39. package/dist/src/emitter.jsx +6 -1
  40. package/dist/src/emitter.jsx.map +1 -1
  41. package/dist/src/external-packages/fastify-type-provider-zod.d.ts +5 -0
  42. package/dist/src/external-packages/fastify-type-provider-zod.js +11 -0
  43. package/dist/src/external-packages/fastify-type-provider-zod.js.map +1 -0
  44. package/dist/src/lib.d.ts +8 -1
  45. package/dist/src/lib.js +8 -1
  46. package/dist/src/lib.js.map +1 -1
  47. package/dist/src/utils/http-helpers.d.ts +0 -13
  48. package/dist/src/utils/http-helpers.js +0 -22
  49. package/dist/src/utils/http-helpers.js.map +1 -1
  50. package/package.json +55 -24
  51. package/dist/test/hello.test.d.ts +0 -1
  52. package/dist/test/hello.test.js +0 -187
  53. package/dist/test/hello.test.js.map +0 -1
  54. package/dist/test/test-host.d.ts +0 -5
  55. package/dist/test/test-host.js +0 -52
  56. package/dist/test/test-host.js.map +0 -1
@@ -1,9 +1,13 @@
1
- import { createComponent as _$createComponent, memo as _$memo } from "@alloy-js/core/jsx-runtime";
2
- import { For, List, refkey } from "@alloy-js/core";
1
+ import { memo as _$memo, createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
2
+ import { code, For, List, refkey } from "@alloy-js/core";
3
3
  import * as ts from "@alloy-js/typescript";
4
- import { toCamelCase, toPascalCase, getHttpVerb } from "../utils/http-helpers.js";
4
+ import { useTSNamePolicy } from "@alloy-js/typescript";
5
+ import { isVoidType } from "@typespec/compiler";
6
+ import { getHttpVerb } from "../utils/http-helpers.js";
5
7
  import { fastifyLib } from "../external-packages/fastify.js";
8
+ import { fastifyTypeProviderZod } from "../external-packages/fastify-type-provider-zod.js";
6
9
  import { getOperationInterfaceRef } from "./OperationInterface.js";
10
+ import { ZodSchema, zod } from "typespec-zod";
7
11
  /**
8
12
  * Creates a refkey for a route registration function.
9
13
  * This allows the loadRoutes function to reference it with automatic imports.
@@ -13,15 +17,16 @@ export function getRouteRegistrationRef(containerName) {
13
17
  }
14
18
 
15
19
  /**
16
- * Generates Fastify route registration functions.
17
- * This creates a function that registers all routes for a resource.
20
+ * Generates Fastify route registration functions with Zod schema validation.
21
+ * Uses fastify-type-provider-zod for automatic type inference and runtime validation.
18
22
  */
19
23
  export function RouteRegistration(props) {
20
24
  const {
21
25
  containerName,
22
26
  operations
23
27
  } = props;
24
- const functionName = `register${toPascalCase(containerName)}Routes`;
28
+ const namePolicy = useTSNamePolicy();
29
+ const functionName = namePolicy.getName(`register_${containerName}_routes`, "function");
25
30
  const interfaceRef = getOperationInterfaceRef(containerName);
26
31
  const routeRegRef = getRouteRegistrationRef(containerName);
27
32
  return _$createComponent(ts.FunctionDeclaration, {
@@ -42,71 +47,165 @@ export function RouteRegistration(props) {
42
47
  get children() {
43
48
  return _$createComponent(List, {
44
49
  get children() {
45
- return _$createComponent(For, {
50
+ return [_$createComponent(ts.VarDeclaration, {
51
+ name: "server",
52
+ "const": true,
53
+ get children() {
54
+ return ["fastify.withTypeProvider", "<", _$memo(() => fastifyTypeProviderZod.ZodTypeProvider), ">", "()"];
55
+ }
56
+ }), _$createComponent(For, {
46
57
  each: operations,
47
58
  hardline: true,
48
- children: function renderRoute(operation) {
59
+ children: operation => {
49
60
  const verb = getHttpVerb(operation);
50
- const path = operation.path;
51
- const opName = toCamelCase(operation.operation.name);
52
- return [_$createComponent(ts.FunctionCallExpression, {
53
- get target() {
54
- return ["fastify.", verb];
55
- },
56
- get args() {
57
- return [["'", path, "'"], generateRouteHandler(operation, opName)];
61
+ const rawPath = operation.uriTemplate || operation.path;
62
+ const optionalParams = new Set();
63
+ for (const param of operation.parameters.parameters) {
64
+ if (param.type === "path" && param.param.optional) {
65
+ optionalParams.add(param.param.name);
58
66
  }
59
- }), ";"];
67
+ }
68
+ const path = rawPath.replace(/\{([^}]+)\}/g, function (_match, p1) {
69
+ const paramName = p1.startsWith("/") ? p1.slice(1) : p1;
70
+ const prefix = p1.startsWith("/") ? "/:" : ":";
71
+ const suffix = optionalParams.has(paramName) ? "?" : "";
72
+ return prefix + paramName + suffix;
73
+ });
74
+ const opName = namePolicy.getName(operation.operation.name, "function");
75
+ const routeSchema = generateZodRouteSchema(operation);
76
+ return [_$memo(() => code`server.${verb}('${path}', ${routeSchema}, ${generateRouteHandler(operation, opName, namePolicy)});`)];
60
77
  }
61
- });
78
+ })];
62
79
  }
63
80
  });
64
81
  }
65
82
  });
66
83
  }
67
- function generateRouteHandler(operation, opName) {
84
+ function generateZodRouteSchema(operation) {
85
+ const schemaProps = [];
86
+ const pathParams = operation.parameters.parameters.filter(function (p) {
87
+ return p.type === "path";
88
+ });
89
+ if (pathParams.length > 0) {
90
+ const pathProperties = [];
91
+ for (let i = 0; i < pathParams.length; i++) {
92
+ const param = pathParams[i];
93
+ const paramName = param.param.name;
94
+ const isOptional = param.param.optional;
95
+ if (i > 0) pathProperties.push([", "]);
96
+ if (isOptional) {
97
+ pathProperties.push([paramName, ": ", _$createComponent(ZodSchema, {
98
+ get type() {
99
+ return param.param.type;
100
+ }
101
+ }), ".optional()"]);
102
+ } else {
103
+ pathProperties.push([paramName, ": ", _$createComponent(ZodSchema, {
104
+ get type() {
105
+ return param.param.type;
106
+ }
107
+ })]);
108
+ }
109
+ }
110
+ schemaProps.push(["params: ", _$memo(() => zod.z), ".object(", "{", pathProperties, "}", ")"]);
111
+ }
112
+ const queryParams = operation.parameters.parameters.filter(function (p) {
113
+ return p.type === "query";
114
+ });
115
+ if (queryParams.length > 0) {
116
+ if (schemaProps.length > 0) schemaProps.push([", "]);
117
+ const queryProperties = [];
118
+ for (let i = 0; i < queryParams.length; i++) {
119
+ const param = queryParams[i];
120
+ const paramName = param.param.name;
121
+ const isOptional = param.param.optional;
122
+ if (i > 0) queryProperties.push([", "]);
123
+ if (isOptional) {
124
+ queryProperties.push([paramName, ": ", _$createComponent(ZodSchema, {
125
+ get type() {
126
+ return param.param.type;
127
+ }
128
+ }), ".optional()"]);
129
+ } else {
130
+ queryProperties.push([paramName, ": ", _$createComponent(ZodSchema, {
131
+ get type() {
132
+ return param.param.type;
133
+ }
134
+ })]);
135
+ }
136
+ }
137
+ schemaProps.push(["querystring: ", _$memo(() => zod.z), ".object(", "{", queryProperties, "}", ")"]);
138
+ }
139
+ if (operation.parameters.body) {
140
+ const bodyParam = operation.parameters.body;
141
+ const isOptional = bodyParam.property?.optional ?? false;
142
+ if (!isOptional) {
143
+ if (schemaProps.length > 0) schemaProps.push([", "]);
144
+ schemaProps.push(["body: ", _$createComponent(ZodSchema, {
145
+ get type() {
146
+ return bodyParam.type;
147
+ }
148
+ })]);
149
+ }
150
+ }
151
+ if (schemaProps.length === 0) {
152
+ return _$createComponent(ts.ObjectExpression, {});
153
+ }
154
+ return _$createComponent(ts.ObjectExpression, {
155
+ get children() {
156
+ return ["schema: ", "{", schemaProps, "}"];
157
+ }
158
+ });
159
+ }
160
+ function generateRouteHandler(operation, opName, namePolicy) {
68
161
  const callArgs = [];
69
162
  for (const param of operation.parameters.parameters) {
70
163
  if (param.type === "path") {
71
- const paramName = toCamelCase(param.param.name);
72
- callArgs.push(["(request.params as any).", paramName]);
164
+ const paramName = namePolicy.getName(param.param.name, "parameter");
165
+ callArgs.push(["request.params.", paramName]);
73
166
  }
74
167
  }
75
168
  if (operation.parameters.body) {
76
- callArgs.push(["request.body as any"]);
169
+ const bodyParam = operation.parameters.body;
170
+ const isOptional = bodyParam.property?.optional ?? false;
171
+ if (isOptional) {
172
+ callArgs.push(["request.body as any"]);
173
+ } else {
174
+ callArgs.push(["request.body"]);
175
+ }
77
176
  }
78
177
  for (const param of operation.parameters.parameters) {
79
178
  if (param.type === "header") {
80
179
  const headerKey = param.name.toLowerCase();
81
180
  const headerAccess = ["request.headers['", headerKey, "']"];
82
- callArgs.push(["Array.isArray(", headerAccess, ") ? ", headerAccess, "[0] : ", headerAccess]);
181
+ callArgs.push(["(Array.isArray(", headerAccess, ") ? ", headerAccess, "[0] : ", headerAccess, ") as string"]);
83
182
  }
84
183
  }
85
- const queryParams = operation.parameters.parameters.filter(function isQuery(p) {
86
- return p.type === "query";
87
- });
184
+ const queryParams = operation.parameters.parameters.filter(p => p.type === "query");
88
185
  if (queryParams.length > 0) {
89
186
  const optionsObj = _$createComponent(ts.ObjectExpression, {
90
187
  get children() {
91
- return queryParams.map(function renderQueryProp(param, index) {
92
- const paramName = toCamelCase(param.param.name);
93
- return [index > 0 && ", ", paramName, ": (request.query as any).", paramName];
94
- });
188
+ return queryParams.map(function (param, index) {
189
+ const paramName = namePolicy.getName(param.param.name, "object-member-data");
190
+ const separator = index > 0 ? ", " : "";
191
+ return `${separator}${paramName}: request.query.${paramName}`;
192
+ }).join("");
95
193
  }
96
194
  });
97
195
  callArgs.push(optionsObj);
98
196
  }
197
+ const isVoid = isVoidType(operation.operation.returnType);
198
+ const is204Response = operation.responses.some(function (r) {
199
+ return r.statusCodes === 204;
200
+ });
201
+ const isNoContent = isVoid || is204Response;
99
202
  return _$createComponent(ts.FunctionExpression, {
100
203
  async: true,
101
- get parameters() {
102
- return [{
103
- name: "request",
104
- type: fastifyLib.FastifyRequest
105
- }, {
106
- name: "reply",
107
- type: fastifyLib.FastifyReply
108
- }];
109
- },
204
+ parameters: [{
205
+ name: "request"
206
+ }, {
207
+ name: "reply"
208
+ }],
110
209
  get children() {
111
210
  return _$createComponent(List, {
112
211
  get children() {
@@ -122,41 +221,13 @@ function generateRouteHandler(operation, opName) {
122
221
  args: callArgs
123
222
  })];
124
223
  }
125
- }), [_$createComponent(ts.FunctionCallExpression, {
126
- get target() {
127
- return ["reply.code"];
128
- },
129
- get args() {
130
- return [["200"]];
131
- }
132
- }), ".", _$createComponent(ts.FunctionCallExpression, {
133
- get target() {
134
- return ["send"];
135
- },
136
- get args() {
137
- return [["result"]];
138
- }
139
- }), ";"]];
224
+ }), _$memo(() => isNoContent ? ["reply.code(result.statusCode).send();"] : ["reply.code(result.statusCode).send(result.body);"])];
140
225
  }
141
- }), "}", " catch (error) ", "{", _$createComponent(List, {
226
+ }), ["}", " catch (error) ", "{"], _$createComponent(List, {
142
227
  get children() {
143
- return [_$createComponent(ts.FunctionCallExpression, {
144
- get target() {
145
- return ["reply.code"];
146
- },
147
- get args() {
148
- return [["500"]];
149
- }
150
- }), ".", _$createComponent(ts.FunctionCallExpression, {
151
- get target() {
152
- return ["send"];
153
- },
154
- get args() {
155
- return [["{", " error: error instanceof Error ? error.message : 'Internal server error' ", "}"]];
156
- }
157
- }), ";"];
228
+ return ["reply.code(500).send(", "{", " error: error instanceof Error ? error.message : 'Internal server error' ", "}", ");"];
158
229
  }
159
- }), "}"];
230
+ }), ["}"]];
160
231
  }
161
232
  });
162
233
  }
@@ -1 +1 @@
1
- {"version":3,"names":["For","List","refkey","ts","toCamelCase","toPascalCase","getHttpVerb","fastifyLib","getOperationInterfaceRef","getRouteRegistrationRef","containerName","RouteRegistration","props","operations","functionName","interfaceRef","routeRegRef","_$createComponent","FunctionDeclaration","name","async","parameters","type","FastifyInstance","returnType","children","each","hardline","renderRoute","operation","verb","path","opName","FunctionCallExpression","target","args","generateRouteHandler","callArgs","param","paramName","push","body","headerKey","toLowerCase","headerAccess","queryParams","filter","isQuery","p","length","optionsObj","ObjectExpression","map","renderQueryProp","index","FunctionExpression","FastifyRequest","FastifyReply","VarDeclaration"],"sources":["../../../src/components/RouteRegistration.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["code","For","List","refkey","ts","useTSNamePolicy","isVoidType","getHttpVerb","fastifyLib","fastifyTypeProviderZod","getOperationInterfaceRef","ZodSchema","zod","getRouteRegistrationRef","containerName","RouteRegistration","props","operations","namePolicy","functionName","getName","interfaceRef","routeRegRef","_$createComponent","FunctionDeclaration","name","async","parameters","type","FastifyInstance","returnType","children","VarDeclaration","_$memo","ZodTypeProvider","each","hardline","operation","verb","rawPath","uriTemplate","path","optionalParams","Set","param","optional","add","replace","_match","p1","paramName","startsWith","slice","prefix","suffix","has","opName","routeSchema","generateZodRouteSchema","generateRouteHandler","schemaProps","pathParams","filter","p","length","pathProperties","i","isOptional","push","z","queryParams","queryProperties","body","bodyParam","property","ObjectExpression","callArgs","headerKey","toLowerCase","headerAccess","optionsObj","map","index","separator","join","isVoid","is204Response","responses","some","r","statusCodes","isNoContent","FunctionExpression","FunctionCallExpression","target","args"],"sources":["../../../src/components/RouteRegistration.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -1,8 +1,12 @@
1
- import { For, List, refkey } from "@alloy-js/core";
1
+ import { code, For, List, refkey, } from "@alloy-js/core";
2
2
  import * as ts from "@alloy-js/typescript";
3
- import { toCamelCase, toPascalCase, getHttpVerb, } from "../utils/http-helpers.js";
3
+ import { useTSNamePolicy } from "@alloy-js/typescript";
4
+ import { isVoidType } from "@typespec/compiler";
5
+ import { getHttpVerb } from "../utils/http-helpers.js";
4
6
  import { fastifyLib } from "../external-packages/fastify.js";
7
+ import { fastifyTypeProviderZod } from "../external-packages/fastify-type-provider-zod.js";
5
8
  import { getOperationInterfaceRef } from "./OperationInterface.js";
9
+ import { ZodSchema, zod } from "typespec-zod";
6
10
  /**
7
11
  * Creates a refkey for a route registration function.
8
12
  * This allows the loadRoutes function to reference it with automatic imports.
@@ -11,12 +15,13 @@ export function getRouteRegistrationRef(containerName) {
11
15
  return refkey(containerName, "route-registration");
12
16
  }
13
17
  /**
14
- * Generates Fastify route registration functions.
15
- * This creates a function that registers all routes for a resource.
18
+ * Generates Fastify route registration functions with Zod schema validation.
19
+ * Uses fastify-type-provider-zod for automatic type inference and runtime validation.
16
20
  */
17
21
  export function RouteRegistration(props) {
18
22
  const { containerName, operations } = props;
19
- const functionName = `register${toPascalCase(containerName)}Routes`;
23
+ const namePolicy = useTSNamePolicy();
24
+ const functionName = namePolicy.getName(`register_${containerName}_routes`, "function");
20
25
  const interfaceRef = getOperationInterfaceRef(containerName);
21
26
  const routeRegRef = getRouteRegistrationRef(containerName);
22
27
  return (<ts.FunctionDeclaration name={functionName} export refkey={routeRegRef} async parameters={[
@@ -24,62 +29,166 @@ export function RouteRegistration(props) {
24
29
  { name: "operations", type: interfaceRef },
25
30
  ]} returnType="void">
26
31
  <List>
32
+ <ts.VarDeclaration name="server" const>
33
+ fastify.withTypeProvider{"<"}
34
+ {fastifyTypeProviderZod.ZodTypeProvider}
35
+ {">"}()
36
+ </ts.VarDeclaration>
27
37
  <For each={operations} hardline>
28
- {function renderRoute(operation) {
38
+ {(operation) => {
29
39
  const verb = getHttpVerb(operation);
30
- const path = operation.path;
31
- const opName = toCamelCase(operation.operation.name);
40
+ const rawPath = operation.uriTemplate || operation.path;
41
+ const optionalParams = new Set();
42
+ for (const param of operation.parameters.parameters) {
43
+ if (param.type === "path" && param.param.optional) {
44
+ optionalParams.add(param.param.name);
45
+ }
46
+ }
47
+ const path = rawPath.replace(/\{([^}]+)\}/g, function (_match, p1) {
48
+ const paramName = p1.startsWith("/") ? p1.slice(1) : p1;
49
+ const prefix = p1.startsWith("/") ? "/:" : ":";
50
+ const suffix = optionalParams.has(paramName) ? "?" : "";
51
+ return prefix + paramName + suffix;
52
+ });
53
+ const opName = namePolicy.getName(operation.operation.name, "function");
54
+ const routeSchema = generateZodRouteSchema(operation);
32
55
  return (<>
33
- <ts.FunctionCallExpression target={<>fastify.{verb}</>} args={[
34
- <>'{path}'</>,
35
- generateRouteHandler(operation, opName),
36
- ]}/>
37
- {";"}
56
+ {code `server.${verb}('${path}', ${routeSchema}, ${generateRouteHandler(operation, opName, namePolicy)});`}
38
57
  </>);
39
58
  }}
40
59
  </For>
41
60
  </List>
42
61
  </ts.FunctionDeclaration>);
43
62
  }
44
- function generateRouteHandler(operation, opName) {
63
+ function generateZodRouteSchema(operation) {
64
+ const schemaProps = [];
65
+ const pathParams = operation.parameters.parameters.filter(function (p) {
66
+ return p.type === "path";
67
+ });
68
+ if (pathParams.length > 0) {
69
+ const pathProperties = [];
70
+ for (let i = 0; i < pathParams.length; i++) {
71
+ const param = pathParams[i];
72
+ const paramName = param.param.name;
73
+ const isOptional = param.param.optional;
74
+ if (i > 0)
75
+ pathProperties.push(<>, </>);
76
+ if (isOptional) {
77
+ pathProperties.push(<>
78
+ {paramName}: <ZodSchema type={param.param.type}/>
79
+ .optional()
80
+ </>);
81
+ }
82
+ else {
83
+ pathProperties.push(<>
84
+ {paramName}: <ZodSchema type={param.param.type}/>
85
+ </>);
86
+ }
87
+ }
88
+ schemaProps.push(<>
89
+ params: {zod.z}.object({"{"}
90
+ {pathProperties}
91
+ {"}"})
92
+ </>);
93
+ }
94
+ const queryParams = operation.parameters.parameters.filter(function (p) {
95
+ return p.type === "query";
96
+ });
97
+ if (queryParams.length > 0) {
98
+ if (schemaProps.length > 0)
99
+ schemaProps.push(<>, </>);
100
+ const queryProperties = [];
101
+ for (let i = 0; i < queryParams.length; i++) {
102
+ const param = queryParams[i];
103
+ const paramName = param.param.name;
104
+ const isOptional = param.param.optional;
105
+ if (i > 0)
106
+ queryProperties.push(<>, </>);
107
+ if (isOptional) {
108
+ queryProperties.push(<>
109
+ {paramName}: <ZodSchema type={param.param.type}/>
110
+ .optional()
111
+ </>);
112
+ }
113
+ else {
114
+ queryProperties.push(<>
115
+ {paramName}: <ZodSchema type={param.param.type}/>
116
+ </>);
117
+ }
118
+ }
119
+ schemaProps.push(<>
120
+ querystring: {zod.z}.object({"{"}
121
+ {queryProperties}
122
+ {"}"})
123
+ </>);
124
+ }
125
+ if (operation.parameters.body) {
126
+ const bodyParam = operation.parameters.body;
127
+ const isOptional = bodyParam.property?.optional ?? false;
128
+ if (!isOptional) {
129
+ if (schemaProps.length > 0)
130
+ schemaProps.push(<>, </>);
131
+ schemaProps.push(<>
132
+ body: <ZodSchema type={bodyParam.type}/>
133
+ </>);
134
+ }
135
+ }
136
+ if (schemaProps.length === 0) {
137
+ return <ts.ObjectExpression />;
138
+ }
139
+ return (<ts.ObjectExpression>
140
+ schema: {"{"}
141
+ {schemaProps}
142
+ {"}"}
143
+ </ts.ObjectExpression>);
144
+ }
145
+ function generateRouteHandler(operation, opName, namePolicy) {
45
146
  const callArgs = [];
46
147
  for (const param of operation.parameters.parameters) {
47
148
  if (param.type === "path") {
48
- const paramName = toCamelCase(param.param.name);
49
- callArgs.push(<>(request.params as any).{paramName}</>);
149
+ const paramName = namePolicy.getName(param.param.name, "parameter");
150
+ callArgs.push(<>request.params.{paramName}</>);
50
151
  }
51
152
  }
52
153
  if (operation.parameters.body) {
53
- callArgs.push(<>request.body as any</>);
154
+ const bodyParam = operation.parameters.body;
155
+ const isOptional = bodyParam.property?.optional ?? false;
156
+ if (isOptional) {
157
+ callArgs.push(<>request.body as any</>);
158
+ }
159
+ else {
160
+ callArgs.push(<>request.body</>);
161
+ }
54
162
  }
55
163
  for (const param of operation.parameters.parameters) {
56
164
  if (param.type === "header") {
57
165
  const headerKey = param.name.toLowerCase();
58
166
  const headerAccess = <>request.headers['{headerKey}']</>;
59
167
  callArgs.push(<>
60
- Array.isArray({headerAccess}) ? {headerAccess}[0] : {headerAccess}
168
+ (Array.isArray({headerAccess}) ? {headerAccess}[0] : {headerAccess})
169
+ as string
61
170
  </>);
62
171
  }
63
172
  }
64
- const queryParams = operation.parameters.parameters.filter(function isQuery(p) {
65
- return p.type === "query";
66
- });
173
+ const queryParams = operation.parameters.parameters.filter((p) => p.type === "query");
67
174
  if (queryParams.length > 0) {
68
175
  const optionsObj = (<ts.ObjectExpression>
69
- {queryParams.map(function renderQueryProp(param, index) {
70
- const paramName = toCamelCase(param.param.name);
71
- return (<>
72
- {index > 0 && ", "}
73
- {paramName}: (request.query as any).{paramName}
74
- </>);
75
- })}
176
+ {queryParams
177
+ .map(function (param, index) {
178
+ const paramName = namePolicy.getName(param.param.name, "object-member-data");
179
+ const separator = index > 0 ? ", " : "";
180
+ return `${separator}${paramName}: request.query.${paramName}`;
181
+ })
182
+ .join("")}
76
183
  </ts.ObjectExpression>);
77
184
  callArgs.push(optionsObj);
78
185
  }
79
- return (<ts.FunctionExpression async parameters={[
80
- { name: "request", type: fastifyLib.FastifyRequest },
81
- { name: "reply", type: fastifyLib.FastifyReply },
82
- ]}>
186
+ const isVoid = isVoidType(operation.operation.returnType);
187
+ const is204Response = operation.responses.some(function (r) {
188
+ return r.statusCodes === 204;
189
+ });
190
+ const isNoContent = isVoid || is204Response;
191
+ return (<ts.FunctionExpression async parameters={[{ name: "request" }, { name: "reply" }]}>
83
192
  <List>
84
193
  <>try {"{"}</>
85
194
  <List>
@@ -87,28 +196,18 @@ function generateRouteHandler(operation, opName) {
87
196
  await{" "}
88
197
  <ts.FunctionCallExpression target={<>operations.{opName}</>} args={callArgs}/>
89
198
  </ts.VarDeclaration>
90
- <>
91
- <ts.FunctionCallExpression target={<>reply.code</>} args={[<>200</>]}/>
92
- .
93
- <ts.FunctionCallExpression target={<>send</>} args={[<>result</>]}/>
94
- {";"}
95
- </>
199
+ {isNoContent ? (<>reply.code(result.statusCode).send();</>) : (<>reply.code(result.statusCode).send(result.body);</>)}
96
200
  </List>
97
- {"}"} catch (error) {"{"}
201
+ <>
202
+ {"}"} catch (error) {"{"}
203
+ </>
98
204
  <List>
99
205
  <>
100
- <ts.FunctionCallExpression target={<>reply.code</>} args={[<>500</>]}/>
101
- .
102
- <ts.FunctionCallExpression target={<>send</>} args={[
103
- <>
104
- {"{"} error: error instanceof Error ? error.message :
105
- 'Internal server error' {"}"}
106
- </>,
107
- ]}/>
108
- {";"}
206
+ reply.code(500).send({"{"} error: error instanceof Error ?
207
+ error.message : 'Internal server error' {"}"});
109
208
  </>
110
209
  </List>
111
- {"}"}
210
+ <>{"}"}</>
112
211
  </List>
113
212
  </ts.FunctionExpression>);
114
213
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RouteRegistration.jsx","sourceRoot":"","sources":["../../../src/components/RouteRegistration.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RouteRegistration.jsx","sourceRoot":"","sources":["../../../src/components/RouteRegistration.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,GAAG,EACH,IAAI,EACJ,MAAM,GAGP,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mDAAmD,CAAC;AAC3F,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAO9C;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,aAAqB;IAC3D,OAAO,MAAM,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAA6B;IAC7D,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAC5C,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CACrC,YAAY,aAAa,SAAS,EAClC,UAAU,CACX,CAAC;IACF,MAAM,YAAY,GAAG,wBAAwB,CAAC,aAAa,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,uBAAuB,CAAC,aAAa,CAAC,CAAC;IAE3D,OAAO,CACL,CAAC,EAAE,CAAC,mBAAmB,CACrB,IAAI,CAAC,CAAC,YAAY,CAAC,CACnB,MAAM,CACN,MAAM,CAAC,CAAC,WAAW,CAAC,CACpB,KAAK,CACL,UAAU,CAAC,CAAC;YACV,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,eAAe,EAAE;YACrD,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE;SAC3C,CAAC,CACF,UAAU,CAAC,MAAM,CAEjB;MAAA,CAAC,IAAI,CACH;QAAA,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CACpC;kCAAwB,CAAC,GAAG,CAC5B;UAAA,CAAC,sBAAsB,CAAC,eAAe,CACvC;UAAA,CAAC,GAAG,CAAC;QACP,EAAE,EAAE,CAAC,cAAc,CACnB;QAAA,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ,CAC7B;UAAA,CAAC,CAAC,SAAS,EAAE,EAAE;YACb,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,IAAI,CAAC;YAExD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;YACjC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;gBACpD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAClD,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,MAAM,EAAE,EAAE;gBAC/D,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,OAAO,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;YACrC,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAC/B,SAAS,CAAC,SAAS,CAAC,IAAI,EACxB,UAAU,CACX,CAAC;YAEF,MAAM,WAAW,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;YAEtD,OAAO,CACL,EACE;gBAAA,CAAC,IAAI,CAAA,UAAU,IAAI,KAAK,IAAI,MAAM,WAAW,KAAK,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,IAAI,CAC3G;cAAA,GAAG,CACJ,CAAC;QACJ,CAAC,CACH;QAAA,EAAE,GAAG,CACP;MAAA,EAAE,IAAI,CACR;IAAA,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAC1B,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,SAAwB;IACtD,MAAM,WAAW,GAAe,EAAE,CAAC;IAEnC,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC;QACnE,OAAO,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,cAAc,GAAe,EAAE,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YACnC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC;gBAAE,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACxC,IAAI,UAAU,EAAE,CAAC;gBACf,cAAc,CAAC,IAAI,CACjB,EACE;YAAA,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAC/C;;UACF,GAAG,CACJ,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,IAAI,CACjB,EACE;YAAA,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EACjD;UAAA,GAAG,CACJ,CAAC;YACJ,CAAC;QACH,CAAC;QACD,WAAW,CAAC,IAAI,CACd,EACE;gBAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAC3B;QAAA,CAAC,cAAc,CACf;QAAA,CAAC,GAAG,CAAC;MACP,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC;QACpE,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,eAAe,GAAe,EAAE,CAAC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YACnC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC;gBAAE,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACzC,IAAI,UAAU,EAAE,CAAC;gBACf,eAAe,CAAC,IAAI,CAClB,EACE;YAAA,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAC/C;;UACF,GAAG,CACJ,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,eAAe,CAAC,IAAI,CAClB,EACE;YAAA,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EACjD;UAAA,GAAG,CACJ,CAAC;YACJ,CAAC;QACH,CAAC;QACD,WAAW,CAAC,IAAI,CACd,EACE;qBAAa,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAChC;QAAA,CAAC,eAAe,CAChB;QAAA,CAAC,GAAG,CAAC;MACP,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;QAC5C,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,IAAI,KAAK,CAAC;QAEzD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACtD,WAAW,CAAC,IAAI,CACd,EACE;gBAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EACxC;QAAA,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,EAAE,CAAC,gBAAgB,CAAC,AAAD,EAAG,CAAC;IACjC,CAAC;IAED,OAAO,CACL,CAAC,EAAE,CAAC,gBAAgB,CAClB;cAAQ,CAAC,GAAG,CACZ;MAAA,CAAC,WAAW,CACZ;MAAA,CAAC,GAAG,CACN;IAAA,EAAE,EAAE,CAAC,gBAAgB,CAAC,CACvB,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,SAAwB,EACxB,MAAc,EACd,UAA8C;IAE9C,MAAM,QAAQ,GAAe,EAAE,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QACpD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACpE,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;QAC5C,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,IAAI,KAAK,CAAC;QAEzD,IAAI,UAAU,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QACpD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,YAAY,GAAG,EAAE,iBAAiB,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC;YACzD,QAAQ,CAAC,IAAI,CACX,EACE;yBAAe,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC;;QAErE,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CACxD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAC1B,CAAC;IAEF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,CACjB,CAAC,EAAE,CAAC,gBAAgB,CAClB;QAAA,CAAC,WAAW;iBACT,GAAG,CAAC,UAAU,KAAK,EAAE,KAAK;gBACzB,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAClC,KAAK,CAAC,KAAK,CAAC,IAAI,EAChB,oBAAoB,CACrB,CAAC;gBACF,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,OAAO,GAAG,SAAS,GAAG,SAAS,mBAAmB,SAAS,EAAE,CAAC;YAChE,CAAC,CAAC;iBACD,IAAI,CAAC,EAAE,CAAC,CACb;MAAA,EAAE,EAAE,CAAC,gBAAgB,CAAC,CACvB,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;QACxD,OAAO,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,MAAM,IAAI,aAAa,CAAC;IAE5C,OAAO,CACL,CAAC,EAAE,CAAC,kBAAkB,CACpB,KAAK,CACL,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAErD;MAAA,CAAC,IAAI,CACH;QAAA,EAAE,IAAI,CAAC,GAAG,CAAC,GACX;QAAA,CAAC,IAAI,CACH;UAAA,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAC9B;iBAAK,CAAC,GAAG,CACT;YAAA,CAAC,EAAE,CAAC,sBAAsB,CACxB,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CACjC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAEnB;UAAA,EAAE,EAAE,CAAC,cAAc,CACnB;UAAA,CAAC,WAAW,CAAC,CAAC,CAAC,CACb,EAAE,qCAAqC,GAAG,CAC3C,CAAC,CAAC,CAAC,CACF,EAAE,gDAAgD,GAAG,CACtD,CACH;QAAA,EAAE,IAAI,CACN;QAAA,EACE;UAAA,CAAC,GAAG,CAAE,eAAc,CAAC,GAAG,CAC1B;QAAA,GACA;QAAA,CAAC,IAAI,CACH;UAAA,EACE;iCAAqB,CAAC,GAAG,CAAE;oDACa,CAAC,GAAG,CAAC;UAC/C,GACF;QAAA,EAAE,IAAI,CACN;QAAA,EAAE,CAAC,GAAG,CAAC,GACT;MAAA,EAAE,IAAI,CACR;IAAA,EAAE,EAAE,CAAC,kBAAkB,CAAC,CACzB,CAAC;AACJ,CAAC"}