@typespec/http-server-csharp 0.58.0-alpha.28-dev.4 → 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.
- package/dist/src/cli/cli.js +118 -154
- package/dist/src/cli/cli.js.map +1 -1
- package/dist/src/components/controller-action/controller-action.d.ts +16 -0
- package/dist/src/components/controller-action/controller-action.d.ts.map +1 -0
- package/dist/src/components/controller-action/controller-action.js +251 -0
- package/dist/src/components/controller-action/controller-action.js.map +1 -0
- package/dist/src/components/controller-action/controller-action.test.d.ts +2 -0
- package/dist/src/components/controller-action/controller-action.test.d.ts.map +1 -0
- package/dist/src/components/controller-action/controller-action.test.js +106 -0
- package/dist/src/components/controller-action/controller-action.test.js.map +1 -0
- package/dist/src/components/controller-action/parameter-binding.d.ts +17 -0
- package/dist/src/components/controller-action/parameter-binding.d.ts.map +1 -0
- package/dist/src/components/controller-action/parameter-binding.js +77 -0
- package/dist/src/components/controller-action/parameter-binding.js.map +1 -0
- package/dist/src/components/controller-action/response-analysis.d.ts +10 -0
- package/dist/src/components/controller-action/response-analysis.d.ts.map +1 -0
- package/dist/src/components/controller-action/response-analysis.js +61 -0
- package/dist/src/components/controller-action/response-analysis.js.map +1 -0
- package/dist/src/components/controllers/controllers.d.ts +18 -0
- package/dist/src/components/controllers/controllers.d.ts.map +1 -0
- package/dist/src/components/controllers/controllers.js +64 -0
- package/dist/src/components/controllers/controllers.js.map +1 -0
- package/dist/src/components/controllers/controllers.test.d.ts +2 -0
- package/dist/src/components/controllers/controllers.test.d.ts.map +1 -0
- package/dist/src/components/controllers/controllers.test.js +84 -0
- package/dist/src/components/controllers/controllers.test.js.map +1 -0
- package/dist/src/components/csharp-file.d.ts +15 -0
- package/dist/src/components/csharp-file.d.ts.map +1 -0
- package/dist/src/components/csharp-file.js +28 -0
- package/dist/src/components/csharp-file.js.map +1 -0
- package/dist/src/components/enums/enums.d.ts +28 -0
- package/dist/src/components/enums/enums.d.ts.map +1 -0
- package/dist/src/components/enums/enums.js +158 -0
- package/dist/src/components/enums/enums.js.map +1 -0
- package/dist/src/components/enums/enums.test.d.ts +2 -0
- package/dist/src/components/enums/enums.test.d.ts.map +1 -0
- package/dist/src/components/enums/enums.test.js +112 -0
- package/dist/src/components/enums/enums.test.js.map +1 -0
- package/dist/src/components/interfaces/interfaces.d.ts +17 -0
- package/dist/src/components/interfaces/interfaces.d.ts.map +1 -0
- package/dist/src/components/interfaces/interfaces.js +153 -0
- package/dist/src/components/interfaces/interfaces.js.map +1 -0
- package/dist/src/components/interfaces/interfaces.test.d.ts +2 -0
- package/dist/src/components/interfaces/interfaces.test.d.ts.map +1 -0
- package/dist/src/components/interfaces/interfaces.test.js +76 -0
- package/dist/src/components/interfaces/interfaces.test.js.map +1 -0
- package/dist/src/components/models/anonymous-models.d.ts +9 -0
- package/dist/src/components/models/anonymous-models.d.ts.map +1 -0
- package/dist/src/components/models/anonymous-models.js +37 -0
- package/dist/src/components/models/anonymous-models.js.map +1 -0
- package/dist/src/components/models/error-models.d.ts +5 -0
- package/dist/src/components/models/error-models.d.ts.map +1 -0
- package/dist/src/components/models/error-models.js +84 -0
- package/dist/src/components/models/error-models.js.map +1 -0
- package/dist/src/components/models/model-helpers.d.ts +40 -0
- package/dist/src/components/models/model-helpers.d.ts.map +1 -0
- package/dist/src/components/models/model-helpers.js +239 -0
- package/dist/src/components/models/model-helpers.js.map +1 -0
- package/dist/src/components/models/models.d.ts +15 -0
- package/dist/src/components/models/models.d.ts.map +1 -0
- package/dist/src/components/models/models.js +234 -0
- package/dist/src/components/models/models.js.map +1 -0
- package/dist/src/components/models/models.test.d.ts +2 -0
- package/dist/src/components/models/models.test.d.ts.map +1 -0
- package/dist/src/components/models/models.test.js +151 -0
- package/dist/src/components/models/models.test.js.map +1 -0
- package/dist/src/components/project/csproj.d.ts +12 -0
- package/dist/src/components/project/csproj.d.ts.map +1 -0
- package/dist/src/components/project/csproj.js +35 -0
- package/dist/src/components/project/csproj.js.map +1 -0
- package/dist/src/components/project/csproj.test.d.ts +2 -0
- package/dist/src/components/project/csproj.test.d.ts.map +1 -0
- package/dist/src/components/project/csproj.test.js +42 -0
- package/dist/src/components/project/csproj.test.js.map +1 -0
- package/dist/src/components/project/launch-settings.d.ts +16 -0
- package/dist/src/components/project/launch-settings.d.ts.map +1 -0
- package/dist/src/components/project/launch-settings.js +73 -0
- package/dist/src/components/project/launch-settings.js.map +1 -0
- package/dist/src/components/project/launch-settings.test.d.ts +2 -0
- package/dist/src/components/project/launch-settings.test.d.ts.map +1 -0
- package/dist/src/components/project/launch-settings.test.js +48 -0
- package/dist/src/components/project/launch-settings.test.js.map +1 -0
- package/dist/src/components/project/program.d.ts +14 -0
- package/dist/src/components/project/program.d.ts.map +1 -0
- package/dist/src/components/project/program.js +75 -0
- package/dist/src/components/project/program.js.map +1 -0
- package/dist/src/components/project/program.test.d.ts +2 -0
- package/dist/src/components/project/program.test.d.ts.map +1 -0
- package/dist/src/components/project/program.test.js +50 -0
- package/dist/src/components/project/program.test.js.map +1 -0
- package/dist/src/components/render-root.d.ts +14 -0
- package/dist/src/components/render-root.d.ts.map +1 -0
- package/dist/src/components/render-root.js +122 -0
- package/dist/src/components/render-root.js.map +1 -0
- package/dist/src/components/request-models.d.ts +15 -0
- package/dist/src/components/request-models.d.ts.map +1 -0
- package/dist/src/components/request-models.js +97 -0
- package/dist/src/components/request-models.js.map +1 -0
- package/dist/src/components/scaffolding/documentation.d.ts +12 -0
- package/dist/src/components/scaffolding/documentation.d.ts.map +1 -0
- package/dist/src/{lib/doc.js → components/scaffolding/documentation.js} +56 -46
- package/dist/src/components/scaffolding/documentation.js.map +1 -0
- package/dist/src/components/scaffolding/mock-helpers.d.ts +10 -0
- package/dist/src/components/scaffolding/mock-helpers.d.ts.map +1 -0
- package/dist/src/components/scaffolding/mock-helpers.js +268 -0
- package/dist/src/components/scaffolding/mock-helpers.js.map +1 -0
- package/dist/src/components/scaffolding/mock-implementations.d.ts +14 -0
- package/dist/src/components/scaffolding/mock-implementations.d.ts.map +1 -0
- package/dist/src/components/scaffolding/mock-implementations.js +152 -0
- package/dist/src/components/scaffolding/mock-implementations.js.map +1 -0
- package/dist/src/components/scaffolding/mock-return-utils.d.ts +11 -0
- package/dist/src/components/scaffolding/mock-return-utils.d.ts.map +1 -0
- package/dist/src/components/scaffolding/mock-return-utils.js +62 -0
- package/dist/src/components/scaffolding/mock-return-utils.js.map +1 -0
- package/dist/src/components/scaffolding/mock-scaffolding.d.ts +6 -0
- package/dist/src/components/scaffolding/mock-scaffolding.d.ts.map +1 -0
- package/dist/src/components/scaffolding/mock-scaffolding.js +5 -0
- package/dist/src/components/scaffolding/mock-scaffolding.js.map +1 -0
- package/dist/src/components/scaffolding/mock-scaffolding.test.d.ts +2 -0
- package/dist/src/components/scaffolding/mock-scaffolding.test.d.ts.map +1 -0
- package/dist/src/components/scaffolding/mock-scaffolding.test.js +59 -0
- package/dist/src/components/scaffolding/mock-scaffolding.test.js.map +1 -0
- package/dist/src/components/serialization/base64-url-json-converter.d.ts +7 -0
- package/dist/src/components/serialization/base64-url-json-converter.d.ts.map +1 -0
- package/dist/src/components/serialization/base64-url-json-converter.js +58 -0
- package/dist/src/components/serialization/base64-url-json-converter.js.map +1 -0
- package/dist/src/components/serialization/constraint-attributes.d.ts +7 -0
- package/dist/src/components/serialization/constraint-attributes.d.ts.map +1 -0
- package/dist/src/components/serialization/constraint-attributes.js +556 -0
- package/dist/src/components/serialization/constraint-attributes.js.map +1 -0
- package/dist/src/components/serialization/http-service-exception-filter.d.ts +8 -0
- package/dist/src/components/serialization/http-service-exception-filter.d.ts.map +1 -0
- package/dist/src/components/serialization/http-service-exception-filter.js +71 -0
- package/dist/src/components/serialization/http-service-exception-filter.js.map +1 -0
- package/dist/src/components/serialization/json-converters.d.ts +7 -0
- package/dist/src/components/serialization/json-converters.d.ts.map +1 -0
- package/dist/src/components/serialization/json-converters.js +22 -0
- package/dist/src/components/serialization/json-converters.js.map +1 -0
- package/dist/src/components/serialization/json-converters.test.d.ts +2 -0
- package/dist/src/components/serialization/json-converters.test.d.ts.map +1 -0
- package/dist/src/components/serialization/json-converters.test.js +136 -0
- package/dist/src/components/serialization/json-converters.test.js.map +1 -0
- package/dist/src/components/serialization/json-serialization-provider.d.ts +7 -0
- package/dist/src/components/serialization/json-serialization-provider.d.ts.map +1 -0
- package/dist/src/components/serialization/json-serialization-provider.js +90 -0
- package/dist/src/components/serialization/json-serialization-provider.js.map +1 -0
- package/dist/src/components/serialization/time-span-duration-converter.d.ts +7 -0
- package/dist/src/components/serialization/time-span-duration-converter.d.ts.map +1 -0
- package/dist/src/components/serialization/time-span-duration-converter.js +44 -0
- package/dist/src/components/serialization/time-span-duration-converter.js.map +1 -0
- package/dist/src/components/serialization/unix-epoch-date-time-converter.d.ts +7 -0
- package/dist/src/components/serialization/unix-epoch-date-time-converter.d.ts.map +1 -0
- package/dist/src/components/serialization/unix-epoch-date-time-converter.js +71 -0
- package/dist/src/components/serialization/unix-epoch-date-time-converter.js.map +1 -0
- package/dist/src/components/type-expression/type-expression.d.ts +24 -0
- package/dist/src/components/type-expression/type-expression.d.ts.map +1 -0
- package/dist/src/components/type-expression/type-expression.js +223 -0
- package/dist/src/components/type-expression/type-expression.js.map +1 -0
- package/dist/src/components/type-expression/type-expression.test.d.ts +2 -0
- package/dist/src/components/type-expression/type-expression.test.d.ts.map +1 -0
- package/dist/src/components/type-expression/type-expression.test.js +207 -0
- package/dist/src/components/type-expression/type-expression.test.js.map +1 -0
- package/dist/src/context/emitter-options-context.d.ts +13 -0
- package/dist/src/context/emitter-options-context.d.ts.map +1 -0
- package/dist/src/context/emitter-options-context.js +15 -0
- package/dist/src/context/emitter-options-context.js.map +1 -0
- package/dist/src/diagnostics.d.ts +8 -0
- package/dist/src/diagnostics.d.ts.map +1 -0
- package/dist/src/diagnostics.js +164 -0
- package/dist/src/diagnostics.js.map +1 -0
- package/dist/src/emitter.d.ts +8 -0
- package/dist/src/emitter.d.ts.map +1 -0
- package/dist/src/emitter.js +180 -0
- package/dist/src/emitter.js.map +1 -0
- package/dist/src/{lib/index.d.ts → index.d.ts} +1 -1
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/{lib/index.js → index.js} +1 -1
- package/dist/src/index.js.map +1 -0
- package/dist/src/{lib/lib.d.ts → lib.d.ts} +4 -14
- package/dist/src/lib.d.ts.map +1 -0
- package/dist/src/lib.js +133 -0
- package/dist/src/lib.js.map +1 -0
- package/dist/src/output-writer.d.ts +11 -0
- package/dist/src/output-writer.d.ts.map +1 -0
- package/dist/src/output-writer.js +72 -0
- package/dist/src/output-writer.js.map +1 -0
- package/dist/src/service-discovery.d.ts +13 -0
- package/dist/src/service-discovery.d.ts.map +1 -0
- package/dist/src/service-discovery.js +93 -0
- package/dist/src/service-discovery.js.map +1 -0
- package/dist/src/service-resolution.d.ts +34 -0
- package/dist/src/service-resolution.d.ts.map +1 -0
- package/dist/src/service-resolution.js +244 -0
- package/dist/src/service-resolution.js.map +1 -0
- package/dist/src/testing/index.d.ts +2 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +2 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/utils/attributes.d.ts +8 -0
- package/dist/src/utils/attributes.d.ts.map +1 -0
- package/dist/src/utils/attributes.js +224 -0
- package/dist/src/utils/attributes.js.map +1 -0
- package/dist/src/utils/csharp-libs.d.ts +87 -0
- package/dist/src/utils/csharp-libs.d.ts.map +1 -0
- package/dist/src/utils/csharp-libs.js +90 -0
- package/dist/src/utils/csharp-libs.js.map +1 -0
- package/dist/src/utils/doc-comments.d.ts +2 -0
- package/dist/src/utils/doc-comments.d.ts.map +1 -0
- package/dist/src/utils/doc-comments.js +4 -0
- package/dist/src/utils/doc-comments.js.map +1 -0
- package/dist/src/utils/http-helpers.d.ts +19 -0
- package/dist/src/utils/http-helpers.d.ts.map +1 -0
- package/dist/src/utils/http-helpers.js +70 -0
- package/dist/src/utils/http-helpers.js.map +1 -0
- package/dist/src/utils/http-helpers.test.d.ts +2 -0
- package/dist/src/utils/http-helpers.test.d.ts.map +1 -0
- package/dist/src/utils/http-helpers.test.js +68 -0
- package/dist/src/utils/http-helpers.test.js.map +1 -0
- package/dist/src/utils/namespace-utils.d.ts +13 -0
- package/dist/src/utils/namespace-utils.d.ts.map +1 -0
- package/dist/src/utils/namespace-utils.js +55 -0
- package/dist/src/utils/namespace-utils.js.map +1 -0
- package/dist/src/utils/naming.d.ts +31 -0
- package/dist/src/utils/naming.d.ts.map +1 -0
- package/dist/src/utils/naming.js +87 -0
- package/dist/src/utils/naming.js.map +1 -0
- package/dist/src/utils/naming.test.d.ts +2 -0
- package/dist/src/utils/naming.test.d.ts.map +1 -0
- package/dist/src/utils/naming.test.js +86 -0
- package/dist/src/utils/naming.test.js.map +1 -0
- package/dist/src/utils/port.d.ts +5 -0
- package/dist/src/utils/port.d.ts.map +1 -0
- package/dist/src/utils/port.js +33 -0
- package/dist/src/utils/port.js.map +1 -0
- package/dist/src/utils/return-type-helpers.d.ts +8 -0
- package/dist/src/utils/return-type-helpers.d.ts.map +1 -0
- package/dist/src/utils/return-type-helpers.js +59 -0
- package/dist/src/utils/return-type-helpers.js.map +1 -0
- package/package.json +34 -26
- package/dist/src/lib/attributes.d.ts +0 -43
- package/dist/src/lib/attributes.d.ts.map +0 -1
- package/dist/src/lib/attributes.js +0 -422
- package/dist/src/lib/attributes.js.map +0 -1
- package/dist/src/lib/boilerplate.d.ts +0 -6
- package/dist/src/lib/boilerplate.d.ts.map +0 -1
- package/dist/src/lib/boilerplate.js +0 -792
- package/dist/src/lib/boilerplate.js.map +0 -1
- package/dist/src/lib/doc.d.ts +0 -5
- package/dist/src/lib/doc.d.ts.map +0 -1
- package/dist/src/lib/doc.js.map +0 -1
- package/dist/src/lib/index.d.ts.map +0 -1
- package/dist/src/lib/index.js.map +0 -1
- package/dist/src/lib/interfaces.d.ts +0 -183
- package/dist/src/lib/interfaces.d.ts.map +0 -1
- package/dist/src/lib/interfaces.js +0 -287
- package/dist/src/lib/interfaces.js.map +0 -1
- package/dist/src/lib/lib.d.ts.map +0 -1
- package/dist/src/lib/lib.js +0 -146
- package/dist/src/lib/lib.js.map +0 -1
- package/dist/src/lib/project.d.ts +0 -5
- package/dist/src/lib/project.d.ts.map +0 -1
- package/dist/src/lib/project.js +0 -101
- package/dist/src/lib/project.js.map +0 -1
- package/dist/src/lib/scaffolding.d.ts +0 -22
- package/dist/src/lib/scaffolding.d.ts.map +0 -1
- package/dist/src/lib/scaffolding.js +0 -461
- package/dist/src/lib/scaffolding.js.map +0 -1
- package/dist/src/lib/service.d.ts +0 -4
- package/dist/src/lib/service.d.ts.map +0 -1
- package/dist/src/lib/service.js +0 -1208
- package/dist/src/lib/service.js.map +0 -1
- package/dist/src/lib/type-helpers.d.ts +0 -44
- package/dist/src/lib/type-helpers.d.ts.map +0 -1
- package/dist/src/lib/type-helpers.js +0 -106
- package/dist/src/lib/type-helpers.js.map +0 -1
- package/dist/src/lib/utils.d.ts +0 -120
- package/dist/src/lib/utils.d.ts.map +0 -1
- package/dist/src/lib/utils.js +0 -1580
- package/dist/src/lib/utils.js.map +0 -1
|
@@ -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 @@
|
|
|
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"}
|