@typespec/http-server-csharp 0.58.0-alpha.28 → 0.58.0-alpha.29-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 (279) hide show
  1. package/dist/src/cli/cli.js +118 -154
  2. package/dist/src/cli/cli.js.map +1 -1
  3. package/dist/src/components/controller-action/controller-action.d.ts +16 -0
  4. package/dist/src/components/controller-action/controller-action.d.ts.map +1 -0
  5. package/dist/src/components/controller-action/controller-action.js +251 -0
  6. package/dist/src/components/controller-action/controller-action.js.map +1 -0
  7. package/dist/src/components/controller-action/controller-action.test.d.ts +2 -0
  8. package/dist/src/components/controller-action/controller-action.test.d.ts.map +1 -0
  9. package/dist/src/components/controller-action/controller-action.test.js +106 -0
  10. package/dist/src/components/controller-action/controller-action.test.js.map +1 -0
  11. package/dist/src/components/controller-action/parameter-binding.d.ts +17 -0
  12. package/dist/src/components/controller-action/parameter-binding.d.ts.map +1 -0
  13. package/dist/src/components/controller-action/parameter-binding.js +77 -0
  14. package/dist/src/components/controller-action/parameter-binding.js.map +1 -0
  15. package/dist/src/components/controller-action/response-analysis.d.ts +10 -0
  16. package/dist/src/components/controller-action/response-analysis.d.ts.map +1 -0
  17. package/dist/src/components/controller-action/response-analysis.js +61 -0
  18. package/dist/src/components/controller-action/response-analysis.js.map +1 -0
  19. package/dist/src/components/controllers/controllers.d.ts +18 -0
  20. package/dist/src/components/controllers/controllers.d.ts.map +1 -0
  21. package/dist/src/components/controllers/controllers.js +64 -0
  22. package/dist/src/components/controllers/controllers.js.map +1 -0
  23. package/dist/src/components/controllers/controllers.test.d.ts +2 -0
  24. package/dist/src/components/controllers/controllers.test.d.ts.map +1 -0
  25. package/dist/src/components/controllers/controllers.test.js +84 -0
  26. package/dist/src/components/controllers/controllers.test.js.map +1 -0
  27. package/dist/src/components/csharp-file.d.ts +15 -0
  28. package/dist/src/components/csharp-file.d.ts.map +1 -0
  29. package/dist/src/components/csharp-file.js +28 -0
  30. package/dist/src/components/csharp-file.js.map +1 -0
  31. package/dist/src/components/enums/enums.d.ts +28 -0
  32. package/dist/src/components/enums/enums.d.ts.map +1 -0
  33. package/dist/src/components/enums/enums.js +158 -0
  34. package/dist/src/components/enums/enums.js.map +1 -0
  35. package/dist/src/components/enums/enums.test.d.ts +2 -0
  36. package/dist/src/components/enums/enums.test.d.ts.map +1 -0
  37. package/dist/src/components/enums/enums.test.js +112 -0
  38. package/dist/src/components/enums/enums.test.js.map +1 -0
  39. package/dist/src/components/interfaces/interfaces.d.ts +17 -0
  40. package/dist/src/components/interfaces/interfaces.d.ts.map +1 -0
  41. package/dist/src/components/interfaces/interfaces.js +153 -0
  42. package/dist/src/components/interfaces/interfaces.js.map +1 -0
  43. package/dist/src/components/interfaces/interfaces.test.d.ts +2 -0
  44. package/dist/src/components/interfaces/interfaces.test.d.ts.map +1 -0
  45. package/dist/src/components/interfaces/interfaces.test.js +76 -0
  46. package/dist/src/components/interfaces/interfaces.test.js.map +1 -0
  47. package/dist/src/components/models/anonymous-models.d.ts +9 -0
  48. package/dist/src/components/models/anonymous-models.d.ts.map +1 -0
  49. package/dist/src/components/models/anonymous-models.js +37 -0
  50. package/dist/src/components/models/anonymous-models.js.map +1 -0
  51. package/dist/src/components/models/error-models.d.ts +5 -0
  52. package/dist/src/components/models/error-models.d.ts.map +1 -0
  53. package/dist/src/components/models/error-models.js +84 -0
  54. package/dist/src/components/models/error-models.js.map +1 -0
  55. package/dist/src/components/models/model-helpers.d.ts +40 -0
  56. package/dist/src/components/models/model-helpers.d.ts.map +1 -0
  57. package/dist/src/components/models/model-helpers.js +239 -0
  58. package/dist/src/components/models/model-helpers.js.map +1 -0
  59. package/dist/src/components/models/models.d.ts +15 -0
  60. package/dist/src/components/models/models.d.ts.map +1 -0
  61. package/dist/src/components/models/models.js +234 -0
  62. package/dist/src/components/models/models.js.map +1 -0
  63. package/dist/src/components/models/models.test.d.ts +2 -0
  64. package/dist/src/components/models/models.test.d.ts.map +1 -0
  65. package/dist/src/components/models/models.test.js +151 -0
  66. package/dist/src/components/models/models.test.js.map +1 -0
  67. package/dist/src/components/project/csproj.d.ts +12 -0
  68. package/dist/src/components/project/csproj.d.ts.map +1 -0
  69. package/dist/src/components/project/csproj.js +35 -0
  70. package/dist/src/components/project/csproj.js.map +1 -0
  71. package/dist/src/components/project/csproj.test.d.ts +2 -0
  72. package/dist/src/components/project/csproj.test.d.ts.map +1 -0
  73. package/dist/src/components/project/csproj.test.js +42 -0
  74. package/dist/src/components/project/csproj.test.js.map +1 -0
  75. package/dist/src/components/project/launch-settings.d.ts +16 -0
  76. package/dist/src/components/project/launch-settings.d.ts.map +1 -0
  77. package/dist/src/components/project/launch-settings.js +73 -0
  78. package/dist/src/components/project/launch-settings.js.map +1 -0
  79. package/dist/src/components/project/launch-settings.test.d.ts +2 -0
  80. package/dist/src/components/project/launch-settings.test.d.ts.map +1 -0
  81. package/dist/src/components/project/launch-settings.test.js +48 -0
  82. package/dist/src/components/project/launch-settings.test.js.map +1 -0
  83. package/dist/src/components/project/program.d.ts +14 -0
  84. package/dist/src/components/project/program.d.ts.map +1 -0
  85. package/dist/src/components/project/program.js +75 -0
  86. package/dist/src/components/project/program.js.map +1 -0
  87. package/dist/src/components/project/program.test.d.ts +2 -0
  88. package/dist/src/components/project/program.test.d.ts.map +1 -0
  89. package/dist/src/components/project/program.test.js +50 -0
  90. package/dist/src/components/project/program.test.js.map +1 -0
  91. package/dist/src/components/render-root.d.ts +14 -0
  92. package/dist/src/components/render-root.d.ts.map +1 -0
  93. package/dist/src/components/render-root.js +122 -0
  94. package/dist/src/components/render-root.js.map +1 -0
  95. package/dist/src/components/request-models.d.ts +15 -0
  96. package/dist/src/components/request-models.d.ts.map +1 -0
  97. package/dist/src/components/request-models.js +97 -0
  98. package/dist/src/components/request-models.js.map +1 -0
  99. package/dist/src/components/scaffolding/documentation.d.ts +12 -0
  100. package/dist/src/components/scaffolding/documentation.d.ts.map +1 -0
  101. package/dist/src/{lib/doc.js → components/scaffolding/documentation.js} +56 -46
  102. package/dist/src/components/scaffolding/documentation.js.map +1 -0
  103. package/dist/src/components/scaffolding/mock-helpers.d.ts +10 -0
  104. package/dist/src/components/scaffolding/mock-helpers.d.ts.map +1 -0
  105. package/dist/src/components/scaffolding/mock-helpers.js +268 -0
  106. package/dist/src/components/scaffolding/mock-helpers.js.map +1 -0
  107. package/dist/src/components/scaffolding/mock-implementations.d.ts +14 -0
  108. package/dist/src/components/scaffolding/mock-implementations.d.ts.map +1 -0
  109. package/dist/src/components/scaffolding/mock-implementations.js +152 -0
  110. package/dist/src/components/scaffolding/mock-implementations.js.map +1 -0
  111. package/dist/src/components/scaffolding/mock-return-utils.d.ts +11 -0
  112. package/dist/src/components/scaffolding/mock-return-utils.d.ts.map +1 -0
  113. package/dist/src/components/scaffolding/mock-return-utils.js +62 -0
  114. package/dist/src/components/scaffolding/mock-return-utils.js.map +1 -0
  115. package/dist/src/components/scaffolding/mock-scaffolding.d.ts +6 -0
  116. package/dist/src/components/scaffolding/mock-scaffolding.d.ts.map +1 -0
  117. package/dist/src/components/scaffolding/mock-scaffolding.js +5 -0
  118. package/dist/src/components/scaffolding/mock-scaffolding.js.map +1 -0
  119. package/dist/src/components/scaffolding/mock-scaffolding.test.d.ts +2 -0
  120. package/dist/src/components/scaffolding/mock-scaffolding.test.d.ts.map +1 -0
  121. package/dist/src/components/scaffolding/mock-scaffolding.test.js +59 -0
  122. package/dist/src/components/scaffolding/mock-scaffolding.test.js.map +1 -0
  123. package/dist/src/components/serialization/base64-url-json-converter.d.ts +7 -0
  124. package/dist/src/components/serialization/base64-url-json-converter.d.ts.map +1 -0
  125. package/dist/src/components/serialization/base64-url-json-converter.js +58 -0
  126. package/dist/src/components/serialization/base64-url-json-converter.js.map +1 -0
  127. package/dist/src/components/serialization/constraint-attributes.d.ts +7 -0
  128. package/dist/src/components/serialization/constraint-attributes.d.ts.map +1 -0
  129. package/dist/src/components/serialization/constraint-attributes.js +556 -0
  130. package/dist/src/components/serialization/constraint-attributes.js.map +1 -0
  131. package/dist/src/components/serialization/http-service-exception-filter.d.ts +8 -0
  132. package/dist/src/components/serialization/http-service-exception-filter.d.ts.map +1 -0
  133. package/dist/src/components/serialization/http-service-exception-filter.js +71 -0
  134. package/dist/src/components/serialization/http-service-exception-filter.js.map +1 -0
  135. package/dist/src/components/serialization/json-converters.d.ts +7 -0
  136. package/dist/src/components/serialization/json-converters.d.ts.map +1 -0
  137. package/dist/src/components/serialization/json-converters.js +22 -0
  138. package/dist/src/components/serialization/json-converters.js.map +1 -0
  139. package/dist/src/components/serialization/json-converters.test.d.ts +2 -0
  140. package/dist/src/components/serialization/json-converters.test.d.ts.map +1 -0
  141. package/dist/src/components/serialization/json-converters.test.js +136 -0
  142. package/dist/src/components/serialization/json-converters.test.js.map +1 -0
  143. package/dist/src/components/serialization/json-serialization-provider.d.ts +7 -0
  144. package/dist/src/components/serialization/json-serialization-provider.d.ts.map +1 -0
  145. package/dist/src/components/serialization/json-serialization-provider.js +90 -0
  146. package/dist/src/components/serialization/json-serialization-provider.js.map +1 -0
  147. package/dist/src/components/serialization/time-span-duration-converter.d.ts +7 -0
  148. package/dist/src/components/serialization/time-span-duration-converter.d.ts.map +1 -0
  149. package/dist/src/components/serialization/time-span-duration-converter.js +44 -0
  150. package/dist/src/components/serialization/time-span-duration-converter.js.map +1 -0
  151. package/dist/src/components/serialization/unix-epoch-date-time-converter.d.ts +7 -0
  152. package/dist/src/components/serialization/unix-epoch-date-time-converter.d.ts.map +1 -0
  153. package/dist/src/components/serialization/unix-epoch-date-time-converter.js +71 -0
  154. package/dist/src/components/serialization/unix-epoch-date-time-converter.js.map +1 -0
  155. package/dist/src/components/type-expression/type-expression.d.ts +24 -0
  156. package/dist/src/components/type-expression/type-expression.d.ts.map +1 -0
  157. package/dist/src/components/type-expression/type-expression.js +223 -0
  158. package/dist/src/components/type-expression/type-expression.js.map +1 -0
  159. package/dist/src/components/type-expression/type-expression.test.d.ts +2 -0
  160. package/dist/src/components/type-expression/type-expression.test.d.ts.map +1 -0
  161. package/dist/src/components/type-expression/type-expression.test.js +207 -0
  162. package/dist/src/components/type-expression/type-expression.test.js.map +1 -0
  163. package/dist/src/context/emitter-options-context.d.ts +13 -0
  164. package/dist/src/context/emitter-options-context.d.ts.map +1 -0
  165. package/dist/src/context/emitter-options-context.js +15 -0
  166. package/dist/src/context/emitter-options-context.js.map +1 -0
  167. package/dist/src/diagnostics.d.ts +8 -0
  168. package/dist/src/diagnostics.d.ts.map +1 -0
  169. package/dist/src/diagnostics.js +164 -0
  170. package/dist/src/diagnostics.js.map +1 -0
  171. package/dist/src/emitter.d.ts +8 -0
  172. package/dist/src/emitter.d.ts.map +1 -0
  173. package/dist/src/emitter.js +180 -0
  174. package/dist/src/emitter.js.map +1 -0
  175. package/dist/src/{lib/index.d.ts → index.d.ts} +1 -1
  176. package/dist/src/index.d.ts.map +1 -0
  177. package/dist/src/{lib/index.js → index.js} +1 -1
  178. package/dist/src/index.js.map +1 -0
  179. package/dist/src/{lib/lib.d.ts → lib.d.ts} +4 -14
  180. package/dist/src/lib.d.ts.map +1 -0
  181. package/dist/src/lib.js +133 -0
  182. package/dist/src/lib.js.map +1 -0
  183. package/dist/src/output-writer.d.ts +11 -0
  184. package/dist/src/output-writer.d.ts.map +1 -0
  185. package/dist/src/output-writer.js +72 -0
  186. package/dist/src/output-writer.js.map +1 -0
  187. package/dist/src/service-discovery.d.ts +13 -0
  188. package/dist/src/service-discovery.d.ts.map +1 -0
  189. package/dist/src/service-discovery.js +93 -0
  190. package/dist/src/service-discovery.js.map +1 -0
  191. package/dist/src/service-resolution.d.ts +34 -0
  192. package/dist/src/service-resolution.d.ts.map +1 -0
  193. package/dist/src/service-resolution.js +244 -0
  194. package/dist/src/service-resolution.js.map +1 -0
  195. package/dist/src/testing/index.d.ts +2 -0
  196. package/dist/src/testing/index.d.ts.map +1 -0
  197. package/dist/src/testing/index.js +2 -0
  198. package/dist/src/testing/index.js.map +1 -0
  199. package/dist/src/utils/attributes.d.ts +8 -0
  200. package/dist/src/utils/attributes.d.ts.map +1 -0
  201. package/dist/src/utils/attributes.js +224 -0
  202. package/dist/src/utils/attributes.js.map +1 -0
  203. package/dist/src/utils/csharp-libs.d.ts +87 -0
  204. package/dist/src/utils/csharp-libs.d.ts.map +1 -0
  205. package/dist/src/utils/csharp-libs.js +90 -0
  206. package/dist/src/utils/csharp-libs.js.map +1 -0
  207. package/dist/src/utils/doc-comments.d.ts +2 -0
  208. package/dist/src/utils/doc-comments.d.ts.map +1 -0
  209. package/dist/src/utils/doc-comments.js +4 -0
  210. package/dist/src/utils/doc-comments.js.map +1 -0
  211. package/dist/src/utils/http-helpers.d.ts +19 -0
  212. package/dist/src/utils/http-helpers.d.ts.map +1 -0
  213. package/dist/src/utils/http-helpers.js +70 -0
  214. package/dist/src/utils/http-helpers.js.map +1 -0
  215. package/dist/src/utils/http-helpers.test.d.ts +2 -0
  216. package/dist/src/utils/http-helpers.test.d.ts.map +1 -0
  217. package/dist/src/utils/http-helpers.test.js +68 -0
  218. package/dist/src/utils/http-helpers.test.js.map +1 -0
  219. package/dist/src/utils/namespace-utils.d.ts +13 -0
  220. package/dist/src/utils/namespace-utils.d.ts.map +1 -0
  221. package/dist/src/utils/namespace-utils.js +55 -0
  222. package/dist/src/utils/namespace-utils.js.map +1 -0
  223. package/dist/src/utils/naming.d.ts +31 -0
  224. package/dist/src/utils/naming.d.ts.map +1 -0
  225. package/dist/src/utils/naming.js +87 -0
  226. package/dist/src/utils/naming.js.map +1 -0
  227. package/dist/src/utils/naming.test.d.ts +2 -0
  228. package/dist/src/utils/naming.test.d.ts.map +1 -0
  229. package/dist/src/utils/naming.test.js +86 -0
  230. package/dist/src/utils/naming.test.js.map +1 -0
  231. package/dist/src/utils/port.d.ts +5 -0
  232. package/dist/src/utils/port.d.ts.map +1 -0
  233. package/dist/src/utils/port.js +33 -0
  234. package/dist/src/utils/port.js.map +1 -0
  235. package/dist/src/utils/return-type-helpers.d.ts +8 -0
  236. package/dist/src/utils/return-type-helpers.d.ts.map +1 -0
  237. package/dist/src/utils/return-type-helpers.js +59 -0
  238. package/dist/src/utils/return-type-helpers.js.map +1 -0
  239. package/package.json +36 -28
  240. package/dist/src/lib/attributes.d.ts +0 -43
  241. package/dist/src/lib/attributes.d.ts.map +0 -1
  242. package/dist/src/lib/attributes.js +0 -422
  243. package/dist/src/lib/attributes.js.map +0 -1
  244. package/dist/src/lib/boilerplate.d.ts +0 -6
  245. package/dist/src/lib/boilerplate.d.ts.map +0 -1
  246. package/dist/src/lib/boilerplate.js +0 -792
  247. package/dist/src/lib/boilerplate.js.map +0 -1
  248. package/dist/src/lib/doc.d.ts +0 -5
  249. package/dist/src/lib/doc.d.ts.map +0 -1
  250. package/dist/src/lib/doc.js.map +0 -1
  251. package/dist/src/lib/index.d.ts.map +0 -1
  252. package/dist/src/lib/index.js.map +0 -1
  253. package/dist/src/lib/interfaces.d.ts +0 -183
  254. package/dist/src/lib/interfaces.d.ts.map +0 -1
  255. package/dist/src/lib/interfaces.js +0 -287
  256. package/dist/src/lib/interfaces.js.map +0 -1
  257. package/dist/src/lib/lib.d.ts.map +0 -1
  258. package/dist/src/lib/lib.js +0 -146
  259. package/dist/src/lib/lib.js.map +0 -1
  260. package/dist/src/lib/project.d.ts +0 -5
  261. package/dist/src/lib/project.d.ts.map +0 -1
  262. package/dist/src/lib/project.js +0 -101
  263. package/dist/src/lib/project.js.map +0 -1
  264. package/dist/src/lib/scaffolding.d.ts +0 -22
  265. package/dist/src/lib/scaffolding.d.ts.map +0 -1
  266. package/dist/src/lib/scaffolding.js +0 -461
  267. package/dist/src/lib/scaffolding.js.map +0 -1
  268. package/dist/src/lib/service.d.ts +0 -4
  269. package/dist/src/lib/service.d.ts.map +0 -1
  270. package/dist/src/lib/service.js +0 -1208
  271. package/dist/src/lib/service.js.map +0 -1
  272. package/dist/src/lib/type-helpers.d.ts +0 -44
  273. package/dist/src/lib/type-helpers.d.ts.map +0 -1
  274. package/dist/src/lib/type-helpers.js +0 -106
  275. package/dist/src/lib/type-helpers.js.map +0 -1
  276. package/dist/src/lib/utils.d.ts +0 -120
  277. package/dist/src/lib/utils.d.ts.map +0 -1
  278. package/dist/src/lib/utils.js +0 -1580
  279. package/dist/src/lib/utils.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=controller-action.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller-action.test.d.ts","sourceRoot":"","sources":["../../../../src/components/controller-action/controller-action.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,106 @@
1
+ import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
2
+ import { Tester } from "#test/tester.js";
3
+ import { createCSharpNamePolicy, ClassDeclaration as CsClassDeclaration, SourceFile } from "@alloy-js/csharp";
4
+ import { t } from "@typespec/compiler/testing";
5
+ import { $ } from "@typespec/compiler/typekit";
6
+ import { Output } from "@typespec/emitter-framework";
7
+ import { HttpCanonicalizer } from "@typespec/http-canonicalization";
8
+ import { beforeEach, describe, expect, it } from "vitest";
9
+ import { ControllerAction } from "./controller-action.js";
10
+ let runner;
11
+ beforeEach(async () => {
12
+ runner = await Tester.createInstance();
13
+ });
14
+ function Wrapper(props) {
15
+ const policy = createCSharpNamePolicy();
16
+ return _$createComponent(Output, {
17
+ get program() {
18
+ return runner.program;
19
+ },
20
+ namePolicy: policy,
21
+ get children() {
22
+ return _$createComponent(SourceFile, {
23
+ path: "test.cs",
24
+ get children() {
25
+ return _$createComponent(CsClassDeclaration, {
26
+ name: "TestController",
27
+ get children() {
28
+ return props.children;
29
+ }
30
+ });
31
+ }
32
+ });
33
+ }
34
+ });
35
+ }
36
+ function canonicalizeOp(opType) {
37
+ const canonicalizer = new HttpCanonicalizer($(runner.program));
38
+ return canonicalizer.canonicalize(opType);
39
+ }
40
+ describe("ControllerAction", () => {
41
+ it("renders a GET action", async () => {
42
+ const {
43
+ listPets
44
+ } = await runner.compile(t.code`
45
+ interface PetStore {
46
+ @route("/pets") @get ${t.op("listPets")}(): string[];
47
+ }
48
+ `);
49
+ const canonOp = canonicalizeOp(listPets);
50
+ expect(_$createComponent(Wrapper, {
51
+ get children() {
52
+ return _$createComponent(ControllerAction, {
53
+ operation: canonOp,
54
+ implFieldName: "PetStoreImpl"
55
+ });
56
+ }
57
+ })).toRenderTo(`
58
+ using Microsoft.AspNetCore.Mvc;
59
+
60
+ class TestController
61
+ {
62
+ [HttpGet]
63
+ [Route("/pets")]
64
+ [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(string[]))]
65
+ public virtual async Task<IActionResult> ListPets()
66
+ {
67
+ var result = await PetStoreImpl.ListPetsAsync();
68
+ return Ok(result);
69
+ }
70
+ }
71
+ `);
72
+ });
73
+ it("renders a DELETE action with path param", async () => {
74
+ const {
75
+ deletePet
76
+ } = await runner.compile(t.code`
77
+ interface PetStore {
78
+ @route("/pets/{petId}") @delete ${t.op("deletePet")}(@path petId: string): void;
79
+ }
80
+ `);
81
+ const canonOp = canonicalizeOp(deletePet);
82
+ expect(_$createComponent(Wrapper, {
83
+ get children() {
84
+ return _$createComponent(ControllerAction, {
85
+ operation: canonOp,
86
+ implFieldName: "PetStoreImpl"
87
+ });
88
+ }
89
+ })).toRenderTo(`
90
+ using Microsoft.AspNetCore.Mvc;
91
+
92
+ class TestController
93
+ {
94
+ [HttpDelete]
95
+ [Route("/pets/{petId}")]
96
+ [ProducesResponseType((int)HttpStatusCode.NoContent, Type = typeof(void))]
97
+ public virtual async Task<IActionResult> DeletePet(string petId)
98
+ {
99
+ await PetStoreImpl.DeletePetAsync(petId);
100
+ return NoContent();
101
+ }
102
+ }
103
+ `);
104
+ });
105
+ });
106
+ //# sourceMappingURL=controller-action.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Tester","createCSharpNamePolicy","ClassDeclaration","CsClassDeclaration","SourceFile","t","$","Output","HttpCanonicalizer","beforeEach","describe","expect","it","ControllerAction","runner","createInstance","Wrapper","props","policy","_$createComponent","program","namePolicy","children","path","name","canonicalizeOp","opType","canonicalizer","canonicalize","listPets","compile","code","op","canonOp","operation","implFieldName","toRenderTo","deletePet"],"sources":["../../../../src/components/controller-action/controller-action.test.tsx"],"sourcesContent":[null],"mappings":";AAAA,SAASA,MAAM,QAAQ,iBAAiB;AAExC,SACEC,sBAAsB,EACtBC,gBAAgB,IAAIC,kBAAkB,EACtCC,UAAU,QACL,kBAAkB;AACzB,SAASC,CAAC,QAA6B,4BAA4B;AACnE,SAASC,CAAC,QAAQ,4BAA4B;AAC9C,SAASC,MAAM,QAAQ,6BAA6B;AACpD,SACEC,iBAAiB,QAEZ,iCAAiC;AACxC,SAASC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AACzD,SAASC,gBAAgB;AAEzB,IAAIC,MAAsB;AAE1BL,UAAU,CAAC,YAAY;EACrBK,MAAM,GAAG,MAAMd,MAAM,CAACe,cAAc,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,SAASC,OAAOA,CAACC,KAA6B,EAAE;EAC9C,MAAMC,MAAM,GAAGjB,sBAAsB,CAAC,CAAC;EACvC,OAAAkB,iBAAA,CACGZ,MAAM;IAAA,IAACa,OAAOA,CAAA;MAAA,OAAEN,MAAM,CAACM,OAAO;IAAA;IAAEC,UAAU,EAAEH,MAAM;IAAA,IAAAI,SAAA;MAAA,OAAAH,iBAAA,CAChDf,UAAU;QAACmB,IAAI;QAAA,IAAAD,SAAA;UAAA,OAAAH,iBAAA,CACbhB,kBAAkB;YAACqB,IAAI;YAAA,IAAAF,SAAA;cAAA,OAAmBL,KAAK,CAACK,QAAQ;YAAA;UAAA;QAAA;MAAA;IAAA;EAAA;AAIjE;AAEA,SAASG,cAAcA,CAACC,MAAW,EAAiC;EAClE,MAAMC,aAAa,GAAG,IAAInB,iBAAiB,CAACF,CAAC,CAACQ,MAAM,CAACM,OAAO,CAAC,CAAC;EAC9D,OAAOO,aAAa,CAACC,YAAY,CAACF,MAAM,CAAC;AAC3C;AAEAhB,QAAQ,CAAC,kBAAkB,EAAE,MAAM;EACjCE,EAAE,CAAC,sBAAsB,EAAE,YAAY;IACrC,MAAM;MAAEiB;IAAS,CAAC,GAAG,MAAMf,MAAM,CAACgB,OAAO,CAACzB,CAAC,CAAC0B,IAAI;AACpD;AACA,+BAA+B1B,CAAC,CAAC2B,EAAE,CAAC,UAAU,CAAC;AAC/C;AACA,KAAK,CAAC;IAEF,MAAMC,OAAO,GAAGR,cAAc,CAACI,QAAQ,CAAC;IAExClB,MAAM,CAAAQ,iBAAA,CACHH,OAAO;MAAA,IAAAM,SAAA;QAAA,OAAAH,iBAAA,CACLN,gBAAgB;UAACqB,SAAS,EAAED,OAAO;UAAEE,aAAa;QAAA;MAAA;IAAA,EAEvD,CAAC,CAACC,UAAU,CAAC;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC;EACJ,CAAC,CAAC;EAEFxB,EAAE,CAAC,yCAAyC,EAAE,YAAY;IACxD,MAAM;MAAEyB;IAAU,CAAC,GAAG,MAAMvB,MAAM,CAACgB,OAAO,CAACzB,CAAC,CAAC0B,IAAI;AACrD;AACA,0CAA0C1B,CAAC,CAAC2B,EAAE,CAAC,WAAW,CAAC;AAC3D;AACA,KAAK,CAAC;IAEF,MAAMC,OAAO,GAAGR,cAAc,CAACY,SAAS,CAAC;IAEzC1B,MAAM,CAAAQ,iBAAA,CACHH,OAAO;MAAA,IAAAM,SAAA;QAAA,OAAAH,iBAAA,CACLN,gBAAgB;UAACqB,SAAS,EAAED,OAAO;UAAEE,aAAa;QAAA;MAAA;IAAA,EAEvD,CAAC,CAACC,UAAU,CAAC;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ import type { AttributeProps } from "@alloy-js/csharp";
2
+ import type { Type } from "@typespec/compiler";
3
+ import type { CanonicalHttpProperty } from "@typespec/http-canonicalization";
4
+ /**
5
+ * Maps a canonical HTTP property to an ASP.NET parameter binding attribute.
6
+ * FromRoute is omitted when the parameter name matches the route template variable,
7
+ * since ASP.NET infers route binding by default.
8
+ * Query and header bindings always include the Name to ensure correct wire-name mapping.
9
+ */
10
+ export declare function getBindingAttribute(prop: CanonicalHttpProperty, paramName?: string): AttributeProps | undefined;
11
+ /**
12
+ * Gets the literal default value string for a parameter type, if applicable.
13
+ * Only returns values for compile-time constant types (string, number, bool).
14
+ * Arrays/tuples are NOT valid C# parameter defaults.
15
+ */
16
+ export declare function getLiteralDefaultValue(type: Type): string | undefined;
17
+ //# sourceMappingURL=parameter-binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter-binding.d.ts","sourceRoot":"","sources":["../../../../src/components/controller-action/parameter-binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAG7E;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,qBAAqB,EAC3B,SAAS,CAAC,EAAE,MAAM,GACjB,cAAc,GAAG,SAAS,CAgB5B;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAkCrE"}
@@ -0,0 +1,77 @@
1
+ import { AspNetMvc } from "../../utils/csharp-libs.js";
2
+
3
+ /**
4
+ * Maps a canonical HTTP property to an ASP.NET parameter binding attribute.
5
+ * FromRoute is omitted when the parameter name matches the route template variable,
6
+ * since ASP.NET infers route binding by default.
7
+ * Query and header bindings always include the Name to ensure correct wire-name mapping.
8
+ */
9
+ export function getBindingAttribute(prop, paramName) {
10
+ switch (prop.kind) {
11
+ case "path":
12
+ // FromRoute is the default binding for path params in ASP.NET;
13
+ // only emit when the C# parameter name differs from the route variable name
14
+ if (paramName !== undefined && paramName === prop.options.name) {
15
+ return undefined;
16
+ }
17
+ return {
18
+ name: AspNetMvc.FromRouteAttribute,
19
+ args: [`Name="${prop.options.name}"`]
20
+ };
21
+ case "query":
22
+ return {
23
+ name: AspNetMvc.FromQueryAttribute,
24
+ args: [`Name="${prop.options.name}"`]
25
+ };
26
+ case "header":
27
+ return {
28
+ name: AspNetMvc.FromHeaderAttribute,
29
+ args: [`Name="${prop.options.name}"`]
30
+ };
31
+ default:
32
+ return undefined;
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Gets the literal default value string for a parameter type, if applicable.
38
+ * Only returns values for compile-time constant types (string, number, bool).
39
+ * Arrays/tuples are NOT valid C# parameter defaults.
40
+ */
41
+ export function getLiteralDefaultValue(type) {
42
+ switch (type.kind) {
43
+ case "String":
44
+ return `"${type.value}"`;
45
+ case "StringTemplate":
46
+ {
47
+ if (type.stringValue !== undefined) {
48
+ return `"${type.stringValue}"`;
49
+ }
50
+ // Try to resolve the template by concatenating span values
51
+ let resolved = "";
52
+ for (const span of type.spans) {
53
+ if (span.isInterpolated) {
54
+ // The interpolated value could be a ModelProperty reference
55
+ let spanType = span.type;
56
+ if (spanType.kind === "ModelProperty") {
57
+ spanType = spanType.type;
58
+ }
59
+ const spanDefault = getLiteralDefaultValue(spanType);
60
+ if (spanDefault === undefined) return undefined;
61
+ // Strip quotes from the resolved value
62
+ resolved += spanDefault.replace(/^"|"$/g, "");
63
+ } else {
64
+ resolved += span.type.value;
65
+ }
66
+ }
67
+ return `"${resolved}"`;
68
+ }
69
+ case "Number":
70
+ return type.valueAsString;
71
+ case "Boolean":
72
+ return type.value ? "true" : "false";
73
+ default:
74
+ return undefined;
75
+ }
76
+ }
77
+ //# sourceMappingURL=parameter-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AspNetMvc","getBindingAttribute","prop","paramName","kind","undefined","options","name","FromRouteAttribute","args","FromQueryAttribute","FromHeaderAttribute","getLiteralDefaultValue","type","value","stringValue","resolved","span","spans","isInterpolated","spanType","spanDefault","replace","valueAsString"],"sources":["../../../../src/components/controller-action/parameter-binding.ts"],"sourcesContent":[null],"mappings":"AAGA,SAASA,SAAS;;AAElB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,mBAAmBA,CACjCC,IAA2B,EAC3BC,SAAkB,EACU;EAC5B,QAAQD,IAAI,CAACE,IAAI;IACf,KAAK,MAAM;MACT;MACA;MACA,IAAID,SAAS,KAAKE,SAAS,IAAIF,SAAS,KAAKD,IAAI,CAACI,OAAO,CAACC,IAAI,EAAE;QAC9D,OAAOF,SAAS;MAClB;MACA,OAAO;QAAEE,IAAI,EAAEP,SAAS,CAACQ,kBAAkB;QAAEC,IAAI,EAAE,CAAC,SAASP,IAAI,CAACI,OAAO,CAACC,IAAI,GAAG;MAAE,CAAC;IACtF,KAAK,OAAO;MACV,OAAO;QAAEA,IAAI,EAAEP,SAAS,CAACU,kBAAkB;QAAED,IAAI,EAAE,CAAC,SAASP,IAAI,CAACI,OAAO,CAACC,IAAI,GAAG;MAAE,CAAC;IACtF,KAAK,QAAQ;MACX,OAAO;QAAEA,IAAI,EAAEP,SAAS,CAACW,mBAAmB;QAAEF,IAAI,EAAE,CAAC,SAASP,IAAI,CAACI,OAAO,CAACC,IAAI,GAAG;MAAE,CAAC;IACvF;MACE,OAAOF,SAAS;EACpB;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASO,sBAAsBA,CAACC,IAAU,EAAsB;EACrE,QAAQA,IAAI,CAACT,IAAI;IACf,KAAK,QAAQ;MACX,OAAO,IAAIS,IAAI,CAACC,KAAK,GAAG;IAC1B,KAAK,gBAAgB;MAAE;QACrB,IAAID,IAAI,CAACE,WAAW,KAAKV,SAAS,EAAE;UAClC,OAAO,IAAIQ,IAAI,CAACE,WAAW,GAAG;QAChC;QACA;QACA,IAAIC,QAAQ,GAAG,EAAE;QACjB,KAAK,MAAMC,IAAI,IAAIJ,IAAI,CAACK,KAAK,EAAE;UAC7B,IAAID,IAAI,CAACE,cAAc,EAAE;YACvB;YACA,IAAIC,QAAQ,GAAGH,IAAI,CAACJ,IAAI;YACxB,IAAIO,QAAQ,CAAChB,IAAI,KAAK,eAAe,EAAE;cACrCgB,QAAQ,GAAGA,QAAQ,CAACP,IAAI;YAC1B;YACA,MAAMQ,WAAW,GAAGT,sBAAsB,CAACQ,QAAQ,CAAC;YACpD,IAAIC,WAAW,KAAKhB,SAAS,EAAE,OAAOA,SAAS;YAC/C;YACAW,QAAQ,IAAIK,WAAW,CAACC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;UAC/C,CAAC,MAAM;YACLN,QAAQ,IAAIC,IAAI,CAACJ,IAAI,CAACC,KAAK;UAC7B;QACF;QACA,OAAO,IAAIE,QAAQ,GAAG;MACxB;IACA,KAAK,QAAQ;MACX,OAAOH,IAAI,CAACU,aAAa;IAC3B,KAAK,SAAS;MACZ,OAAOV,IAAI,CAACC,KAAK,GAAG,MAAM,GAAG,OAAO;IACtC;MACE,OAAOT,SAAS;EACpB;AACF","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ import type { OperationHttpCanonicalization } from "@typespec/http-canonicalization";
2
+ /**
3
+ * Determines the success HTTP status code and whether the response has a body.
4
+ * Checks the original return type for @statusCode properties.
5
+ */
6
+ export declare function getSuccessStatusCode(operation: OperationHttpCanonicalization): {
7
+ statusCode: number | undefined;
8
+ hasBody: boolean;
9
+ };
10
+ //# sourceMappingURL=response-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-analysis.d.ts","sourceRoot":"","sources":["../../../../src/components/controller-action/response-analysis.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAErF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,6BAA6B,GAAG;IAC9E,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;CAClB,CAwBA"}
@@ -0,0 +1,61 @@
1
+ import { isVoidType } from "@typespec/compiler";
2
+ /**
3
+ * Determines the success HTTP status code and whether the response has a body.
4
+ * Checks the original return type for @statusCode properties.
5
+ */
6
+ export function getSuccessStatusCode(operation) {
7
+ const returnType = operation.sourceType.returnType;
8
+
9
+ // Check direct model response
10
+ if (returnType.kind === "Model") {
11
+ return analyzeResponseModel(returnType);
12
+ }
13
+
14
+ // Check union responses - find the first non-error success response
15
+ if (returnType.kind === "Union") {
16
+ for (const variant of returnType.variants.values()) {
17
+ const vt = variant.type;
18
+ if (isVoidType(vt)) continue;
19
+ if (vt.kind === "Model") {
20
+ // Skip models with @error decorator or error-range status codes
21
+ const result = analyzeResponseModel(vt);
22
+ if (result.statusCode !== undefined && result.statusCode >= 400) continue;
23
+ return result;
24
+ }
25
+ }
26
+ }
27
+ const hasReturnValue = !isVoidType(returnType);
28
+ return {
29
+ statusCode: hasReturnValue ? 200 : 204,
30
+ hasBody: hasReturnValue
31
+ };
32
+ }
33
+ function analyzeResponseModel(model) {
34
+ let statusCode;
35
+ let bodyProps = 0;
36
+ for (const prop of model.properties.values()) {
37
+ // Check for @statusCode property
38
+ if (prop.name === "statusCode") {
39
+ // The type might be a literal number
40
+ if (prop.type.kind === "Number") {
41
+ statusCode = prop.type.value;
42
+ }
43
+ continue;
44
+ }
45
+ bodyProps++;
46
+ }
47
+
48
+ // Model with only @statusCode and no body props → no body
49
+ // But if the model has an indexer (Record<T>), it IS a body
50
+ if (bodyProps === 0 && !model.indexer) {
51
+ return {
52
+ statusCode: statusCode ?? 204,
53
+ hasBody: false
54
+ };
55
+ }
56
+ return {
57
+ statusCode,
58
+ hasBody: true
59
+ };
60
+ }
61
+ //# sourceMappingURL=response-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["isVoidType","getSuccessStatusCode","operation","returnType","sourceType","kind","analyzeResponseModel","variant","variants","values","vt","type","result","statusCode","undefined","hasReturnValue","hasBody","model","bodyProps","prop","properties","name","value","indexer"],"sources":["../../../../src/components/controller-action/response-analysis.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,UAAU,QAAQ,oBAAoB;AAG/C;AACA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAACC,SAAwC,EAG3E;EACA,MAAMC,UAAU,GAAGD,SAAS,CAACE,UAAU,CAACD,UAAU;;EAElD;EACA,IAAIA,UAAU,CAACE,IAAI,KAAK,OAAO,EAAE;IAC/B,OAAOC,oBAAoB,CAACH,UAAU,CAAC;EACzC;;EAEA;EACA,IAAIA,UAAU,CAACE,IAAI,KAAK,OAAO,EAAE;IAC/B,KAAK,MAAME,OAAO,IAAIJ,UAAU,CAACK,QAAQ,CAACC,MAAM,CAAC,CAAC,EAAE;MAClD,MAAMC,EAAE,GAAGH,OAAO,CAACI,IAAI;MACvB,IAAIX,UAAU,CAACU,EAAE,CAAC,EAAE;MACpB,IAAIA,EAAE,CAACL,IAAI,KAAK,OAAO,EAAE;QACvB;QACA,MAAMO,MAAM,GAAGN,oBAAoB,CAACI,EAAE,CAAC;QACvC,IAAIE,MAAM,CAACC,UAAU,KAAKC,SAAS,IAAIF,MAAM,CAACC,UAAU,IAAI,GAAG,EAAE;QACjE,OAAOD,MAAM;MACf;IACF;EACF;EAEA,MAAMG,cAAc,GAAG,CAACf,UAAU,CAACG,UAAU,CAAC;EAC9C,OAAO;IAAEU,UAAU,EAAEE,cAAc,GAAG,GAAG,GAAG,GAAG;IAAEC,OAAO,EAAED;EAAe,CAAC;AAC5E;AAEA,SAAST,oBAAoBA,CAACW,KAAyC,EAGrE;EACA,IAAIJ,UAA8B;EAClC,IAAIK,SAAS,GAAG,CAAC;EAEjB,KAAK,MAAMC,IAAI,IAAIF,KAAK,CAACG,UAAU,CAACX,MAAM,CAAC,CAAC,EAAE;IAC5C;IACA,IAAIU,IAAI,CAACE,IAAI,KAAK,YAAY,EAAE;MAC9B;MACA,IAAIF,IAAI,CAACR,IAAI,CAACN,IAAI,KAAK,QAAQ,EAAE;QAC/BQ,UAAU,GAAGM,IAAI,CAACR,IAAI,CAACW,KAAK;MAC9B;MACA;IACF;IACAJ,SAAS,EAAE;EACb;;EAEA;EACA;EACA,IAAIA,SAAS,KAAK,CAAC,IAAI,CAACD,KAAK,CAACM,OAAO,EAAE;IACrC,OAAO;MAAEV,UAAU,EAAEA,UAAU,IAAI,GAAG;MAAEG,OAAO,EAAE;IAAM,CAAC;EAC1D;EAEA,OAAO;IAAEH,UAAU;IAAEG,OAAO,EAAE;EAAK,CAAC;AACtC","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ import { type Children } from "@alloy-js/core";
2
+ import type { Interface } from "@typespec/compiler";
3
+ import type { OperationHttpCanonicalization } from "@typespec/http-canonicalization";
4
+ import type { RequestModelInfo } from "../request-models.jsx";
5
+ export interface ControllerProps {
6
+ /** The TypeSpec interface this controller represents. */
7
+ type: Interface;
8
+ /** The canonicalized HTTP operations belonging to this controller. */
9
+ operations: OperationHttpCanonicalization[];
10
+ /** Request models generated for unnamed body types. */
11
+ requestModels?: RequestModelInfo[];
12
+ }
13
+ /**
14
+ * Renders a full ASP.NET controller class.
15
+ * Includes [ApiController], DI for business logic interface, and action methods.
16
+ */
17
+ export declare function Controller(props: ControllerProps): Children;
18
+ //# sourceMappingURL=controllers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controllers.d.ts","sourceRoot":"","sources":["../../../../src/components/controllers/controllers.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAIrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,IAAI,EAAE,SAAS,CAAC;IAChB,sEAAsE;IACtE,UAAU,EAAE,6BAA6B,EAAE,CAAC;IAC5C,uDAAuD;IACvD,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,QAAQ,CAiC3D"}
@@ -0,0 +1,64 @@
1
+ import { createComponent as _$createComponent, createIntrinsic as _$createIntrinsic } from "@alloy-js/core/jsx-runtime";
2
+ import { code, For } from "@alloy-js/core";
3
+ import * as cs from "@alloy-js/csharp";
4
+ import { Attribute, Reference } from "@alloy-js/csharp";
5
+ import { AspNetMvc } from "../../utils/csharp-libs.js";
6
+ import { ControllerAction } from "../controller-action/controller-action.js";
7
+ import { businessLogicInterfaceRefkey } from "../interfaces/interfaces.js";
8
+ /**
9
+ * Renders a full ASP.NET controller class.
10
+ * Includes [ApiController], DI for business logic interface, and action methods.
11
+ */
12
+ export function Controller(props) {
13
+ const namePolicy = cs.useCSharpNamePolicy();
14
+ const baseName = namePolicy.getName(props.type.name, "class");
15
+ const controllerName = `${baseName}Controller`;
16
+ const implPropName = `${baseName}Impl`;
17
+ const interfaceRef = _$createComponent(Reference, {
18
+ get refkey() {
19
+ return businessLogicInterfaceRefkey(props.type);
20
+ }
21
+ });
22
+ const attributes = [_$createComponent(Attribute, {
23
+ get name() {
24
+ return AspNetMvc.ApiControllerAttribute;
25
+ }
26
+ })];
27
+ return _$createComponent(cs.ClassDeclaration, {
28
+ name: controllerName,
29
+ "public": true,
30
+ partial: true,
31
+ baseType: "ControllerBase",
32
+ attributes: attributes,
33
+ get children() {
34
+ return [_$createComponent(cs.Property, {
35
+ name: implPropName,
36
+ type: interfaceRef,
37
+ internal: true,
38
+ virtual: true,
39
+ get: true
40
+ }), _$createIntrinsic("hbr", {}), _$createComponent(cs.Constructor, {
41
+ "public": true,
42
+ parameters: [{
43
+ name: "operations",
44
+ type: interfaceRef
45
+ }],
46
+ children: code`${implPropName} = operations;`
47
+ }), _$createIntrinsic("hbr", {}), _$createIntrinsic("hbr", {}), _$createComponent(For, {
48
+ get each() {
49
+ return props.operations;
50
+ },
51
+ doubleHardline: true,
52
+ children: op => {
53
+ const rm = props.requestModels?.find(r => r.op === op);
54
+ return _$createComponent(ControllerAction, {
55
+ operation: op,
56
+ implFieldName: implPropName,
57
+ requestModel: rm
58
+ });
59
+ }
60
+ })];
61
+ }
62
+ });
63
+ }
64
+ //# sourceMappingURL=controllers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["code","For","cs","Attribute","Reference","AspNetMvc","ControllerAction","businessLogicInterfaceRefkey","Controller","props","namePolicy","useCSharpNamePolicy","baseName","getName","type","name","controllerName","implPropName","interfaceRef","_$createComponent","refkey","attributes","ApiControllerAttribute","ClassDeclaration","partial","baseType","children","Property","internal","virtual","get","_$createIntrinsic","Constructor","parameters","each","operations","doubleHardline","op","rm","requestModels","find","r","operation","implFieldName","requestModel"],"sources":["../../../../src/components/controllers/controllers.tsx"],"sourcesContent":[null],"mappings":";AAAA,SAASA,IAAI,EAAEC,GAAG,QAAuB,gBAAgB;AACzD,OAAO,KAAKC,EAAE,MAAM,kBAAkB;AACtC,SAASC,SAAS,EAAEC,SAAS,QAAQ,kBAAkB;AAGvD,SAASC,SAAS;AAClB,SAASC,gBAAgB;AACzB,SAASC,4BAA4B;AAYrC;AACA;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAACC,KAAsB,EAAY;EAC3D,MAAMC,UAAU,GAAGR,EAAE,CAACS,mBAAmB,CAAC,CAAC;EAC3C,MAAMC,QAAQ,GAAGF,UAAU,CAACG,OAAO,CAACJ,KAAK,CAACK,IAAI,CAACC,IAAI,EAAE,OAAO,CAAC;EAC7D,MAAMC,cAAc,GAAG,GAAGJ,QAAQ,YAAY;EAC9C,MAAMK,YAAY,GAAG,GAAGL,QAAQ,MAAM;EAEtC,MAAMM,YAAY,GAAAC,iBAAA,CAAIf,SAAS;IAAA,IAACgB,MAAMA,CAAA;MAAA,OAAEb,4BAA4B,CAACE,KAAK,CAACK,IAAI,CAAC;IAAA;EAAA,EAAI;EAEpF,MAAMO,UAAU,GAAG,CAAAF,iBAAA,CAAEhB,SAAS;IAAA,IAACY,IAAIA,CAAA;MAAA,OAAEV,SAAS,CAACiB,sBAAsB;IAAA;EAAA,GAAK;EAE1E,OAAAH,iBAAA,CACGjB,EAAE,CAACqB,gBAAgB;IAClBR,IAAI,EAAEC,cAAc;IAAA;IAEpBQ,OAAO;IACPC,QAAQ;IACRJ,UAAU,EAAEA,UAAU;IAAA,IAAAK,SAAA;MAAA,QAAAP,iBAAA,CAErBjB,EAAE,CAACyB,QAAQ;QAACZ,IAAI,EAAEE,YAAY;QAAEH,IAAI,EAAEI,YAAY;QAAEU,QAAQ;QAACC,OAAO;QAACC,GAAG;MAAA,IAAAC,iBAAA,aAAAZ,iBAAA,CAExEjB,EAAE,CAAC8B,WAAW;QAAA;QAAQC,UAAU,EAAE,CAAC;UAAElB,IAAI,EAAE,YAAY;UAAED,IAAI,EAAEI;QAAa,CAAC,CAAC;QAAAQ,QAAA,EAC5E1B,IAAI,GAAGiB,YAAY;MAAgB,IAAAc,iBAAA,aAAAA,iBAAA,aAAAZ,iBAAA,CAIrClB,GAAG;QAAA,IAACiC,IAAIA,CAAA;UAAA,OAAEzB,KAAK,CAAC0B,UAAU;QAAA;QAAEC,cAAc;QAAAV,QAAA,EACvCW,EAAE,IAAK;UACP,MAAMC,EAAE,GAAG7B,KAAK,CAAC8B,aAAa,EAAEC,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACJ,EAAE,KAAKA,EAAE,CAAC;UACxD,OAAAlB,iBAAA,CAAQb,gBAAgB;YAACoC,SAAS,EAAEL,EAAE;YAAEM,aAAa,EAAE1B,YAAY;YAAE2B,YAAY,EAAEN;UAAE;QACvF;MAAC;IAAA;EAAA;AAIT","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=controllers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controllers.test.d.ts","sourceRoot":"","sources":["../../../../src/components/controllers/controllers.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
2
+ import { Tester } from "#test/tester.js";
3
+ import { createCSharpNamePolicy, SourceFile } from "@alloy-js/csharp";
4
+ import { t } from "@typespec/compiler/testing";
5
+ import { $ } from "@typespec/compiler/typekit";
6
+ import { Output } from "@typespec/emitter-framework";
7
+ import { HttpCanonicalizer } from "@typespec/http-canonicalization";
8
+ import { beforeEach, describe, expect, it } from "vitest";
9
+ import { BusinessLogicInterface } from "../interfaces/interfaces.js";
10
+ import { Controller } from "./controllers.js";
11
+ let runner;
12
+ beforeEach(async () => {
13
+ runner = await Tester.createInstance();
14
+ });
15
+ function Wrapper(props) {
16
+ const policy = createCSharpNamePolicy();
17
+ return _$createComponent(Output, {
18
+ get program() {
19
+ return runner.program;
20
+ },
21
+ namePolicy: policy,
22
+ get children() {
23
+ return _$createComponent(SourceFile, {
24
+ path: "test.cs",
25
+ get children() {
26
+ return props.children;
27
+ }
28
+ });
29
+ }
30
+ });
31
+ }
32
+ function canonicalizeOp(opType) {
33
+ const canonicalizer = new HttpCanonicalizer($(runner.program));
34
+ return canonicalizer.canonicalize(opType);
35
+ }
36
+ describe("Controller", () => {
37
+ it("renders a controller class with an action method", async () => {
38
+ const {
39
+ PetStore,
40
+ listPets
41
+ } = await runner.compile(t.code`
42
+ interface ${t.interface("PetStore")} {
43
+ @route("/pets") @get ${t.op("listPets")}(): string[];
44
+ }
45
+ `);
46
+ const canonOp = canonicalizeOp(listPets);
47
+ expect(_$createComponent(Wrapper, {
48
+ get children() {
49
+ return [_$createComponent(BusinessLogicInterface, {
50
+ type: PetStore
51
+ }), "\n", _$createComponent(Controller, {
52
+ type: PetStore,
53
+ operations: [canonOp]
54
+ })];
55
+ }
56
+ })).toRenderTo(`
57
+ using Microsoft.AspNetCore.Mvc;
58
+
59
+ public interface IPetStore
60
+ {
61
+ Task<string[]> ListPetsAsync();
62
+ }
63
+ [ApiController]
64
+ public partial class PetStoreController : ControllerBase
65
+ {
66
+ internal virtual IPetStore PetStoreImpl { get; }
67
+ public PetStoreController(IPetStore operations)
68
+ {
69
+ PetStoreImpl = operations;
70
+ }
71
+
72
+ [HttpGet]
73
+ [Route("/pets")]
74
+ [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(string[]))]
75
+ public virtual async Task<IActionResult> ListPets()
76
+ {
77
+ var result = await PetStoreImpl.ListPetsAsync();
78
+ return Ok(result);
79
+ }
80
+ }
81
+ `);
82
+ });
83
+ });
84
+ //# sourceMappingURL=controllers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Tester","createCSharpNamePolicy","SourceFile","t","$","Output","HttpCanonicalizer","beforeEach","describe","expect","it","BusinessLogicInterface","Controller","runner","createInstance","Wrapper","props","policy","_$createComponent","program","namePolicy","children","path","canonicalizeOp","opType","canonicalizer","canonicalize","PetStore","listPets","compile","code","interface","op","canonOp","type","operations","toRenderTo"],"sources":["../../../../src/components/controllers/controllers.test.tsx"],"sourcesContent":[null],"mappings":";AAAA,SAASA,MAAM,QAAQ,iBAAiB;AAExC,SAASC,sBAAsB,EAAEC,UAAU,QAAQ,kBAAkB;AACrE,SAASC,CAAC,QAA6B,4BAA4B;AACnE,SAASC,CAAC,QAAQ,4BAA4B;AAC9C,SAASC,MAAM,QAAQ,6BAA6B;AACpD,SACEC,iBAAiB,QAEZ,iCAAiC;AACxC,SAASC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AACzD,SAASC,sBAAsB;AAC/B,SAASC,UAAU;AAEnB,IAAIC,MAAsB;AAE1BN,UAAU,CAAC,YAAY;EACrBM,MAAM,GAAG,MAAMb,MAAM,CAACc,cAAc,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,SAASC,OAAOA,CAACC,KAA6B,EAAE;EAC9C,MAAMC,MAAM,GAAGhB,sBAAsB,CAAC,CAAC;EACvC,OAAAiB,iBAAA,CACGb,MAAM;IAAA,IAACc,OAAOA,CAAA;MAAA,OAAEN,MAAM,CAACM,OAAO;IAAA;IAAEC,UAAU,EAAEH,MAAM;IAAA,IAAAI,SAAA;MAAA,OAAAH,iBAAA,CAChDhB,UAAU;QAACoB,IAAI;QAAA,IAAAD,SAAA;UAAA,OAAYL,KAAK,CAACK,QAAQ;QAAA;MAAA;IAAA;EAAA;AAGhD;AAEA,SAASE,cAAcA,CAACC,MAAW,EAAiC;EAClE,MAAMC,aAAa,GAAG,IAAInB,iBAAiB,CAACF,CAAC,CAACS,MAAM,CAACM,OAAO,CAAC,CAAC;EAC9D,OAAOM,aAAa,CAACC,YAAY,CAACF,MAAM,CAAC;AAC3C;AAEAhB,QAAQ,CAAC,YAAY,EAAE,MAAM;EAC3BE,EAAE,CAAC,kDAAkD,EAAE,YAAY;IACjE,MAAM;MAAEiB,QAAQ;MAAEC;IAAS,CAAC,GAAG,MAAMf,MAAM,CAACgB,OAAO,CAAC1B,CAAC,CAAC2B,IAAI;AAC9D,kBAAkB3B,CAAC,CAAC4B,SAAS,CAAC,UAAU,CAAC;AACzC,+BAA+B5B,CAAC,CAAC6B,EAAE,CAAC,UAAU,CAAC;AAC/C;AACA,KAAK,CAAC;IAEF,MAAMC,OAAO,GAAGV,cAAc,CAACK,QAAQ,CAAC;IAExCnB,MAAM,CAAAS,iBAAA,CACHH,OAAO;MAAA,IAAAM,SAAA;QAAA,QAAAH,iBAAA,CACLP,sBAAsB;UAACuB,IAAI,EAAEP;QAAQ,IACrC,IAAI,EAAAT,iBAAA,CACJN,UAAU;UAACsB,IAAI,EAAEP,QAAQ;UAAEQ,UAAU,EAAE,CAACF,OAAO;QAAC;MAAA;IAAA,EAErD,CAAC,CAACG,UAAU,CAAC;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,15 @@
1
+ import { type Children } from "@alloy-js/core";
2
+ export interface CSharpFileProps {
3
+ /** Path of the source file */
4
+ path: string;
5
+ /** A list of using directives to include. */
6
+ using?: string[];
7
+ /** Source file content */
8
+ children?: Children;
9
+ }
10
+ /**
11
+ * A C# source file that automatically includes the auto-generated header.
12
+ * Use this for all static C# files in the http-server-csharp emitter.
13
+ */
14
+ export declare function CSharpFile(props: CSharpFileProps): Children;
15
+ //# sourceMappingURL=csharp-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csharp-file.d.ts","sourceRoot":"","sources":["../../../src/components/csharp-file.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAGrD,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IAEb,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAQD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,QAAQ,CAM3D"}
@@ -0,0 +1,28 @@
1
+ import { memo as _$memo, createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
2
+ import { code } from "@alloy-js/core";
3
+ import { SourceFile } from "@alloy-js/csharp";
4
+ const fileHeader = code`
5
+ // Generated by @typespec/http-server-csharp
6
+ // <auto-generated />
7
+ #nullable enable
8
+ `;
9
+
10
+ /**
11
+ * A C# source file that automatically includes the auto-generated header.
12
+ * Use this for all static C# files in the http-server-csharp emitter.
13
+ */
14
+ export function CSharpFile(props) {
15
+ return _$createComponent(SourceFile, {
16
+ get path() {
17
+ return props.path;
18
+ },
19
+ get using() {
20
+ return props.using;
21
+ },
22
+ header: fileHeader,
23
+ get children() {
24
+ return props.children;
25
+ }
26
+ });
27
+ }
28
+ //# sourceMappingURL=csharp-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["code","SourceFile","fileHeader","CSharpFile","props","_$createComponent","path","using","header","children"],"sources":["../../../src/components/csharp-file.tsx"],"sourcesContent":[null],"mappings":";AAAA,SAASA,IAAI,QAAuB,gBAAgB;AACpD,SAASC,UAAU,QAAQ,kBAAkB;AAa7C,MAAMC,UAAU,GAAGF,IAAI;AACvB;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,SAASG,UAAUA,CAACC,KAAsB,EAAY;EAC3D,OAAAC,iBAAA,CACGJ,UAAU;IAAA,IAACK,IAAIA,CAAA;MAAA,OAAEF,KAAK,CAACE,IAAI;IAAA;IAAA,IAAEC,KAAKA,CAAA;MAAA,OAAEH,KAAK,CAACG,KAAK;IAAA;IAAEC,MAAM,EAAEN,UAAU;IAAA,IAAAO,SAAA;MAAA,OACjEL,KAAK,CAACK,QAAQ;IAAA;EAAA;AAGrB","ignoreList":[]}
@@ -0,0 +1,28 @@
1
+ import { type Children } from "@alloy-js/core";
2
+ import { type Enum, type Namespace as TspNamespace, type Union } from "@typespec/compiler";
3
+ export interface EnumsProps {
4
+ /** Pre-resolved TypeSpec enums. */
5
+ enums: Enum[];
6
+ /** Pre-resolved union-as-enum types. */
7
+ unionEnums: Union[];
8
+ /** The service namespace for sub-namespace wrapping. */
9
+ serviceNamespace: TspNamespace | undefined;
10
+ }
11
+ /**
12
+ * Iterates pre-resolved enums and union-enums and emits C# enum declarations.
13
+ * Each enum is emitted in its own source file with JSON serialization attributes.
14
+ */
15
+ export declare function Enums(props: EnumsProps): Children;
16
+ /**
17
+ * Returns true if a named union can be represented as a C# enum.
18
+ * Requires: named union, every named variant has a string value,
19
+ * and optionally one unnamed scalar `string` variant (open/extensible).
20
+ */
21
+ export declare function isUnionEnum(union: Union): boolean;
22
+ /** Gets the named string variants of a union-as-enum (skipping the open `string` variant). */
23
+ export declare function getUnionEnumMembers(union: Union): {
24
+ name: string;
25
+ value: string;
26
+ variant: import("@typespec/compiler").UnionVariant;
27
+ }[];
28
+ //# sourceMappingURL=enums.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enums.d.ts","sourceRoot":"","sources":["../../../../src/components/enums/enums.tsx"],"names":[],"mappings":"AACA,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAGpD,OAAO,EACL,KAAK,IAAI,EACT,KAAK,SAAS,IAAI,YAAY,EAE9B,KAAK,KAAK,EACX,MAAM,oBAAoB,CAAC;AAmD5B,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,wCAAwC;IACxC,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,wDAAwD;IACxD,gBAAgB,EAAE,YAAY,GAAG,SAAS,CAAC;CAC5C;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,QAAQ,CA4DjD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAqBjD;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,KAAK,GACX;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,oBAAoB,EAAE,YAAY,CAAA;CAAE,EAAE,CAYvF"}