@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,158 @@
|
|
|
1
|
+
import { createComponent as _$createComponent, createIntrinsic as _$createIntrinsic } from "@alloy-js/core/jsx-runtime";
|
|
2
|
+
import { For } from "@alloy-js/core";
|
|
3
|
+
import * as cs from "@alloy-js/csharp";
|
|
4
|
+
import { Attribute } from "@alloy-js/csharp";
|
|
5
|
+
import { useTsp } from "@typespec/emitter-framework";
|
|
6
|
+
import { JsonSerialization } from "../../utils/csharp-libs.js";
|
|
7
|
+
import { getDocComments } from "../../utils/doc-comments.js";
|
|
8
|
+
import { getSubNamespaceParts } from "../../utils/namespace-utils.js";
|
|
9
|
+
import { CSharpFile } from "../csharp-file.js";
|
|
10
|
+
import { efRefkey } from "../type-expression/type-expression.js";
|
|
11
|
+
|
|
12
|
+
/** Normalized member info shared by both enums and union-enums. */
|
|
13
|
+
|
|
14
|
+
/** Normalized enum info that abstracts over Enum and union-as-enum types. */
|
|
15
|
+
|
|
16
|
+
function normalizeEnum(en) {
|
|
17
|
+
return {
|
|
18
|
+
name: en.name,
|
|
19
|
+
type: en,
|
|
20
|
+
namespace: en.namespace,
|
|
21
|
+
members: Array.from(en.members.entries()).map(([key, value]) => ({
|
|
22
|
+
name: key,
|
|
23
|
+
serializedValue: typeof value.value === "string" ? value.value : key,
|
|
24
|
+
docSource: value
|
|
25
|
+
}))
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function normalizeUnionEnum(union) {
|
|
29
|
+
return {
|
|
30
|
+
name: union.name,
|
|
31
|
+
type: union,
|
|
32
|
+
namespace: union.namespace,
|
|
33
|
+
members: getUnionEnumMembers(union).map(({
|
|
34
|
+
name,
|
|
35
|
+
value,
|
|
36
|
+
variant
|
|
37
|
+
}) => ({
|
|
38
|
+
name,
|
|
39
|
+
serializedValue: value,
|
|
40
|
+
docSource: variant,
|
|
41
|
+
memberRefkey: efRefkey(union, name)
|
|
42
|
+
}))
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Iterates pre-resolved enums and union-enums and emits C# enum declarations.
|
|
47
|
+
* Each enum is emitted in its own source file with JSON serialization attributes.
|
|
48
|
+
*/
|
|
49
|
+
export function Enums(props) {
|
|
50
|
+
const {
|
|
51
|
+
$
|
|
52
|
+
} = useTsp();
|
|
53
|
+
const allEnums = [...props.enums.map(normalizeEnum), ...props.unionEnums.map(normalizeUnionEnum)];
|
|
54
|
+
return _$createComponent(For, {
|
|
55
|
+
each: allEnums,
|
|
56
|
+
children: info => {
|
|
57
|
+
const namePolicy = cs.useCSharpNamePolicy();
|
|
58
|
+
const subNsParts = getSubNamespaceParts(info.namespace, props.serviceNamespace);
|
|
59
|
+
const enumDecl = [_$createComponent(Attribute, {
|
|
60
|
+
get name() {
|
|
61
|
+
return JsonSerialization.JsonConverterAttribute;
|
|
62
|
+
},
|
|
63
|
+
args: ["typeof(JsonStringEnumConverter)"]
|
|
64
|
+
}), _$createIntrinsic("hbr", {}), _$createComponent(cs.EnumDeclaration, {
|
|
65
|
+
get name() {
|
|
66
|
+
return namePolicy.getName(info.name, "enum");
|
|
67
|
+
},
|
|
68
|
+
"public": true,
|
|
69
|
+
get refkey() {
|
|
70
|
+
return efRefkey(info.type);
|
|
71
|
+
},
|
|
72
|
+
get doc() {
|
|
73
|
+
return getDocComments($, info.type);
|
|
74
|
+
},
|
|
75
|
+
get children() {
|
|
76
|
+
return _$createComponent(For, {
|
|
77
|
+
get each() {
|
|
78
|
+
return info.members;
|
|
79
|
+
},
|
|
80
|
+
comma: true,
|
|
81
|
+
hardline: true,
|
|
82
|
+
children: member => [_$createComponent(cs.DocWhen, {
|
|
83
|
+
get doc() {
|
|
84
|
+
return getDocComments($, member.docSource);
|
|
85
|
+
}
|
|
86
|
+
}), _$createComponent(Attribute, {
|
|
87
|
+
get name() {
|
|
88
|
+
return JsonSerialization.JsonStringEnumMemberNameAttribute;
|
|
89
|
+
},
|
|
90
|
+
get args() {
|
|
91
|
+
return [`"${member.serializedValue}"`];
|
|
92
|
+
}
|
|
93
|
+
}), _$createIntrinsic("hbr", {}), _$createComponent(cs.EnumMember, {
|
|
94
|
+
get name() {
|
|
95
|
+
return namePolicy.getName(member.name, "enum-member");
|
|
96
|
+
},
|
|
97
|
+
get refkey() {
|
|
98
|
+
return member.memberRefkey;
|
|
99
|
+
}
|
|
100
|
+
})]
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
})];
|
|
104
|
+
const wrappedContent = subNsParts.reduceRight((content, nsPart) => _$createComponent(cs.Namespace, {
|
|
105
|
+
name: nsPart,
|
|
106
|
+
children: content
|
|
107
|
+
}), enumDecl);
|
|
108
|
+
return _$createComponent(CSharpFile, {
|
|
109
|
+
get path() {
|
|
110
|
+
return `${info.name}.cs`;
|
|
111
|
+
},
|
|
112
|
+
using: ["System.Text.Json"],
|
|
113
|
+
children: wrappedContent
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Returns true if a named union can be represented as a C# enum.
|
|
121
|
+
* Requires: named union, every named variant has a string value,
|
|
122
|
+
* and optionally one unnamed scalar `string` variant (open/extensible).
|
|
123
|
+
*/
|
|
124
|
+
export function isUnionEnum(union) {
|
|
125
|
+
if (!union.name) return false;
|
|
126
|
+
const variants = Array.from(union.variants.values());
|
|
127
|
+
let hasNamedStringVariant = false;
|
|
128
|
+
for (const variant of variants) {
|
|
129
|
+
// Allow a single open string scalar variant (extensible union)
|
|
130
|
+
if (variant.type.kind === "Scalar" && variant.type.name === "string") {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
// Named variant with a string literal value
|
|
134
|
+
if (variant.type.kind === "String" && variant.name && typeof variant.name === "string") {
|
|
135
|
+
hasNamedStringVariant = true;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
// Any other variant type means it's not a simple enum
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
return hasNamedStringVariant;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Gets the named string variants of a union-as-enum (skipping the open `string` variant). */
|
|
145
|
+
export function getUnionEnumMembers(union) {
|
|
146
|
+
const members = [];
|
|
147
|
+
for (const variant of union.variants.values()) {
|
|
148
|
+
if (variant.type.kind === "String" && variant.name && typeof variant.name === "string") {
|
|
149
|
+
members.push({
|
|
150
|
+
name: variant.name,
|
|
151
|
+
value: variant.type.value,
|
|
152
|
+
variant
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return members;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=enums.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["For","cs","Attribute","useTsp","JsonSerialization","getDocComments","getSubNamespaceParts","CSharpFile","efRefkey","normalizeEnum","en","name","type","namespace","members","Array","from","entries","map","key","value","serializedValue","docSource","normalizeUnionEnum","union","getUnionEnumMembers","variant","memberRefkey","Enums","props","$","allEnums","enums","unionEnums","_$createComponent","each","children","info","namePolicy","useCSharpNamePolicy","subNsParts","serviceNamespace","enumDecl","JsonConverterAttribute","args","_$createIntrinsic","EnumDeclaration","getName","refkey","doc","comma","hardline","member","DocWhen","JsonStringEnumMemberNameAttribute","EnumMember","wrappedContent","reduceRight","content","nsPart","Namespace","path","using","isUnionEnum","variants","values","hasNamedStringVariant","kind","push"],"sources":["../../../../src/components/enums/enums.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enums.test.d.ts","sourceRoot":"","sources":["../../../../src/components/enums/enums.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,112 @@
|
|
|
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 { Output } from "@typespec/emitter-framework";
|
|
6
|
+
import { EnumDeclaration } from "@typespec/emitter-framework/csharp";
|
|
7
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
8
|
+
let runner;
|
|
9
|
+
beforeEach(async () => {
|
|
10
|
+
runner = await Tester.createInstance();
|
|
11
|
+
});
|
|
12
|
+
function Wrapper(props) {
|
|
13
|
+
const policy = createCSharpNamePolicy();
|
|
14
|
+
return _$createComponent(Output, {
|
|
15
|
+
get program() {
|
|
16
|
+
return runner.program;
|
|
17
|
+
},
|
|
18
|
+
namePolicy: policy,
|
|
19
|
+
get children() {
|
|
20
|
+
return _$createComponent(SourceFile, {
|
|
21
|
+
path: "test.cs",
|
|
22
|
+
get children() {
|
|
23
|
+
return props.children;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
describe("EnumDeclaration", () => {
|
|
30
|
+
it("renders a simple enum", async () => {
|
|
31
|
+
const {
|
|
32
|
+
Color
|
|
33
|
+
} = await runner.compile(t.code`
|
|
34
|
+
enum ${t.enum("Color")} {
|
|
35
|
+
Red,
|
|
36
|
+
Green,
|
|
37
|
+
Blue,
|
|
38
|
+
}
|
|
39
|
+
`);
|
|
40
|
+
expect(_$createComponent(Wrapper, {
|
|
41
|
+
get children() {
|
|
42
|
+
return _$createComponent(EnumDeclaration, {
|
|
43
|
+
type: Color
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
})).toRenderTo(`
|
|
47
|
+
enum Color
|
|
48
|
+
{
|
|
49
|
+
Red,
|
|
50
|
+
Green,
|
|
51
|
+
Blue
|
|
52
|
+
}
|
|
53
|
+
`);
|
|
54
|
+
});
|
|
55
|
+
it("renders an enum with multiple members", async () => {
|
|
56
|
+
const {
|
|
57
|
+
Direction
|
|
58
|
+
} = await runner.compile(t.code`
|
|
59
|
+
enum ${t.enum("Direction")} {
|
|
60
|
+
North,
|
|
61
|
+
South,
|
|
62
|
+
East,
|
|
63
|
+
West,
|
|
64
|
+
}
|
|
65
|
+
`);
|
|
66
|
+
expect(_$createComponent(Wrapper, {
|
|
67
|
+
get children() {
|
|
68
|
+
return _$createComponent(EnumDeclaration, {
|
|
69
|
+
type: Direction
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
})).toRenderTo(`
|
|
73
|
+
enum Direction
|
|
74
|
+
{
|
|
75
|
+
North,
|
|
76
|
+
South,
|
|
77
|
+
East,
|
|
78
|
+
West
|
|
79
|
+
}
|
|
80
|
+
`);
|
|
81
|
+
});
|
|
82
|
+
it("renders an enum with a type-level doc comment", async () => {
|
|
83
|
+
const {
|
|
84
|
+
Color
|
|
85
|
+
} = await runner.compile(t.code`
|
|
86
|
+
/** Represents available colors */
|
|
87
|
+
enum ${t.enum("Color")} {
|
|
88
|
+
Red,
|
|
89
|
+
Green,
|
|
90
|
+
Blue,
|
|
91
|
+
}
|
|
92
|
+
`);
|
|
93
|
+
expect(_$createComponent(Wrapper, {
|
|
94
|
+
get children() {
|
|
95
|
+
return _$createComponent(EnumDeclaration, {
|
|
96
|
+
type: Color
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
})).toRenderTo(`
|
|
100
|
+
/// <summary>
|
|
101
|
+
/// Represents available colors
|
|
102
|
+
/// </summary>
|
|
103
|
+
enum Color
|
|
104
|
+
{
|
|
105
|
+
Red,
|
|
106
|
+
Green,
|
|
107
|
+
Blue
|
|
108
|
+
}
|
|
109
|
+
`);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=enums.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Tester","createCSharpNamePolicy","SourceFile","t","Output","EnumDeclaration","beforeEach","describe","expect","it","runner","createInstance","Wrapper","props","policy","_$createComponent","program","namePolicy","children","path","Color","compile","code","enum","type","toRenderTo","Direction"],"sources":["../../../../src/components/enums/enums.test.tsx"],"sourcesContent":[null],"mappings":";AAAA,SAASA,MAAM,QAAQ,iBAAiB;AAExC,SAASC,sBAAsB,EAAEC,UAAU,QAAQ,kBAAkB;AACrE,SAASC,CAAC,QAA6B,4BAA4B;AACnE,SAASC,MAAM,QAAQ,6BAA6B;AACpD,SAASC,eAAe,QAAQ,oCAAoC;AACpE,SAASC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAEzD,IAAIC,MAAsB;AAE1BJ,UAAU,CAAC,YAAY;EACrBI,MAAM,GAAG,MAAMV,MAAM,CAACW,cAAc,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,SAASC,OAAOA,CAACC,KAA6B,EAAE;EAC9C,MAAMC,MAAM,GAAGb,sBAAsB,CAAC,CAAC;EACvC,OAAAc,iBAAA,CACGX,MAAM;IAAA,IAACY,OAAOA,CAAA;MAAA,OAAEN,MAAM,CAACM,OAAO;IAAA;IAAEC,UAAU,EAAEH,MAAM;IAAA,IAAAI,SAAA;MAAA,OAAAH,iBAAA,CAChDb,UAAU;QAACiB,IAAI;QAAA,IAAAD,SAAA;UAAA,OAAYL,KAAK,CAACK,QAAQ;QAAA;MAAA;IAAA;EAAA;AAGhD;AAEAX,QAAQ,CAAC,iBAAiB,EAAE,MAAM;EAChCE,EAAE,CAAC,uBAAuB,EAAE,YAAY;IACtC,MAAM;MAAEW;IAAM,CAAC,GAAG,MAAMV,MAAM,CAACW,OAAO,CAAClB,CAAC,CAACmB,IAAI;AACjD,aAAanB,CAAC,CAACoB,IAAI,CAAC,OAAO,CAAC;AAC5B;AACA;AACA;AACA;AACA,KAAK,CAAC;IAEFf,MAAM,CAAAO,iBAAA,CACHH,OAAO;MAAA,IAAAM,SAAA;QAAA,OAAAH,iBAAA,CACLV,eAAe;UAACmB,IAAI,EAAEJ;QAAK;MAAA;IAAA,EAEhC,CAAC,CAACK,UAAU,CAAC;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC;EACJ,CAAC,CAAC;EAEFhB,EAAE,CAAC,uCAAuC,EAAE,YAAY;IACtD,MAAM;MAAEiB;IAAU,CAAC,GAAG,MAAMhB,MAAM,CAACW,OAAO,CAAClB,CAAC,CAACmB,IAAI;AACrD,aAAanB,CAAC,CAACoB,IAAI,CAAC,WAAW,CAAC;AAChC;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC;IAEFf,MAAM,CAAAO,iBAAA,CACHH,OAAO;MAAA,IAAAM,SAAA;QAAA,OAAAH,iBAAA,CACLV,eAAe;UAACmB,IAAI,EAAEE;QAAS;MAAA;IAAA,EAEpC,CAAC,CAACD,UAAU,CAAC;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC;EACJ,CAAC,CAAC;EAEFhB,EAAE,CAAC,+CAA+C,EAAE,YAAY;IAC9D,MAAM;MAAEW;IAAM,CAAC,GAAG,MAAMV,MAAM,CAACW,OAAO,CAAClB,CAAC,CAACmB,IAAI;AACjD;AACA,aAAanB,CAAC,CAACoB,IAAI,CAAC,OAAO,CAAC;AAC5B;AACA;AACA;AACA;AACA,KAAK,CAAC;IAEFf,MAAM,CAAAO,iBAAA,CACHH,OAAO;MAAA,IAAAM,SAAA;QAAA,OAAAH,iBAAA,CACLV,eAAe;UAACmB,IAAI,EAAEJ;QAAK;MAAA;IAAA,EAEhC,CAAC,CAACK,UAAU,CAAC;AACjB;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 Children, type Refkey } from "@alloy-js/core";
|
|
2
|
+
import type { Interface } from "@typespec/compiler";
|
|
3
|
+
import type { OperationHttpCanonicalization } from "@typespec/http-canonicalization";
|
|
4
|
+
/** Creates a stable refkey for a business logic interface from its TypeSpec Interface type. */
|
|
5
|
+
export declare function businessLogicInterfaceRefkey(type: Interface): Refkey;
|
|
6
|
+
export interface BusinessLogicInterfaceProps {
|
|
7
|
+
/** The TypeSpec interface to generate a business logic interface for. */
|
|
8
|
+
type: Interface;
|
|
9
|
+
/** The canonicalized HTTP operations (for filtering body params on GET). */
|
|
10
|
+
canonicalOps?: OperationHttpCanonicalization[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generates an ASP.NET business logic interface (e.g., `IPetStoreOperations`)
|
|
14
|
+
* from a TypeSpec interface. Each operation becomes an async Task method.
|
|
15
|
+
*/
|
|
16
|
+
export declare function BusinessLogicInterface(props: BusinessLogicInterfaceProps): Children;
|
|
17
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../src/components/interfaces/interfaces.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE3F,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,oBAAoB,CAAC;AAG/D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAQrF,+FAA+F;AAC/F,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEpE;AAED,MAAM,WAAW,2BAA2B;IAC1C,yEAAyE;IACzE,IAAI,EAAE,SAAS,CAAC;IAChB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,6BAA6B,EAAE,CAAC;CAChD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,QAAQ,CA8BnF"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
|
|
2
|
+
import { refkey as ayRefkey, code, For } from "@alloy-js/core";
|
|
3
|
+
import * as cs from "@alloy-js/csharp";
|
|
4
|
+
import { isTemplateDeclaration, isVoidType } from "@typespec/compiler";
|
|
5
|
+
import { useTsp } from "@typespec/emitter-framework";
|
|
6
|
+
import { getUniqueItems } from "@typespec/json-schema";
|
|
7
|
+
import { getDocComments } from "../../utils/doc-comments.js";
|
|
8
|
+
import { getSuccessReturnType } from "../../utils/return-type-helpers.js";
|
|
9
|
+
import { TypeExpression } from "../type-expression/type-expression.js";
|
|
10
|
+
const interfaceRefKeyPrefix = Symbol.for("http-server-csharp:interface");
|
|
11
|
+
|
|
12
|
+
/** Creates a stable refkey for a business logic interface from its TypeSpec Interface type. */
|
|
13
|
+
export function businessLogicInterfaceRefkey(type) {
|
|
14
|
+
return ayRefkey(interfaceRefKeyPrefix, type);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generates an ASP.NET business logic interface (e.g., `IPetStoreOperations`)
|
|
18
|
+
* from a TypeSpec interface. Each operation becomes an async Task method.
|
|
19
|
+
*/
|
|
20
|
+
export function BusinessLogicInterface(props) {
|
|
21
|
+
const {
|
|
22
|
+
$
|
|
23
|
+
} = useTsp();
|
|
24
|
+
const namePolicy = cs.useCSharpNamePolicy();
|
|
25
|
+
const interfaceName = `I${namePolicy.getName(props.type.name, "class")}`;
|
|
26
|
+
const operations = Array.from(props.type.operations.entries()).filter(([_, op]) => !isTemplateDeclaration(op));
|
|
27
|
+
|
|
28
|
+
// Build a map from operation name to its canonicalized HTTP info
|
|
29
|
+
const canonicalMap = new Map();
|
|
30
|
+
if (props.canonicalOps) {
|
|
31
|
+
for (const cop of props.canonicalOps) {
|
|
32
|
+
canonicalMap.set(cop.name, cop);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return _$createComponent(cs.InterfaceDeclaration, {
|
|
36
|
+
name: interfaceName,
|
|
37
|
+
"public": true,
|
|
38
|
+
get refkey() {
|
|
39
|
+
return businessLogicInterfaceRefkey(props.type);
|
|
40
|
+
},
|
|
41
|
+
get doc() {
|
|
42
|
+
return getDocComments($, props.type);
|
|
43
|
+
},
|
|
44
|
+
get children() {
|
|
45
|
+
return _$createComponent(For, {
|
|
46
|
+
each: operations,
|
|
47
|
+
doubleHardline: true,
|
|
48
|
+
children: ([name, op]) => _$createComponent(BusinessLogicMethod, {
|
|
49
|
+
name: name,
|
|
50
|
+
operation: op,
|
|
51
|
+
get canonicalOp() {
|
|
52
|
+
return canonicalMap.get(name);
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Renders a single async method signature in a business logic interface.
|
|
61
|
+
* Method names get an "Async" suffix (e.g., `ListPetsAsync`).
|
|
62
|
+
*/
|
|
63
|
+
function BusinessLogicMethod(props) {
|
|
64
|
+
const namePolicy = cs.useCSharpNamePolicy();
|
|
65
|
+
const methodName = `${namePolicy.getName(props.name, "class-method")}Async`;
|
|
66
|
+
const {
|
|
67
|
+
$
|
|
68
|
+
} = useTsp();
|
|
69
|
+
const successType = getSuccessReturnType($.program, props.operation.returnType);
|
|
70
|
+
const returnType = successType ? code`Task<${_$createComponent(TypeExpression, {
|
|
71
|
+
type: successType
|
|
72
|
+
})}>` : code`Task`;
|
|
73
|
+
|
|
74
|
+
// Check if this is a multipart request
|
|
75
|
+
const isMultipart = props.canonicalOp?.requestParameters.body?.bodyKind === "multipart";
|
|
76
|
+
|
|
77
|
+
// For GET operations, suppress body parameters entirely
|
|
78
|
+
const isGet = props.canonicalOp?.method === "get";
|
|
79
|
+
const bodyPropNames = new Set();
|
|
80
|
+
if (isGet && props.canonicalOp) {
|
|
81
|
+
const body = props.canonicalOp.requestParameters.body;
|
|
82
|
+
if (body?.bodyKind === "single" && body.bodies.length > 0) {
|
|
83
|
+
const bodyType = body.bodies[0].type.sourceType;
|
|
84
|
+
if (bodyType.kind === "Model") {
|
|
85
|
+
for (const [name] of bodyType.properties) {
|
|
86
|
+
bodyPropNames.add(name);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
for (const p of props.canonicalOp.requestParameters.properties) {
|
|
91
|
+
if (p.kind === "body" || p.kind === "bodyRoot" || p.kind === "bodyProperty") {
|
|
92
|
+
bodyPropNames.add(p.property.sourceType.name);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// For multipart requests, suppress all body-related params
|
|
98
|
+
// For all requests, suppress content-type params
|
|
99
|
+
const filteredPropNames = new Set();
|
|
100
|
+
if (props.canonicalOp) {
|
|
101
|
+
for (const p of props.canonicalOp.requestParameters.properties) {
|
|
102
|
+
if (isMultipart && (p.kind === "body" || p.kind === "bodyRoot" || p.kind === "bodyProperty" || p.kind === "multipartBody")) {
|
|
103
|
+
filteredPropNames.add(p.property.sourceType.name);
|
|
104
|
+
}
|
|
105
|
+
if (p.property.isContentTypeProperty) {
|
|
106
|
+
filteredPropNames.add(p.property.sourceType.name);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const parameters = Array.from(props.operation.parameters.properties.entries()).filter(([name, prop]) => !isVoidType(prop.type)).filter(([name]) => !bodyPropNames.has(name)).filter(([name]) => !filteredPropNames.has(name)).map(([pName, prop]) => {
|
|
111
|
+
const isUnique = getUniqueItems($.program, prop);
|
|
112
|
+
const isArrayType = prop.type.kind === "Model" && $.array.is(prop.type);
|
|
113
|
+
let typeExpr;
|
|
114
|
+
if (isUnique && isArrayType && prop.type.kind === "Model" && prop.type.indexer?.value) {
|
|
115
|
+
typeExpr = ["ISet<", _$createComponent(TypeExpression, {
|
|
116
|
+
get type() {
|
|
117
|
+
return prop.type.indexer.value;
|
|
118
|
+
}
|
|
119
|
+
}), ">"];
|
|
120
|
+
} else {
|
|
121
|
+
typeExpr = _$createComponent(TypeExpression, {
|
|
122
|
+
get type() {
|
|
123
|
+
return prop.type;
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
name: namePolicy.getName(pName, "parameter"),
|
|
129
|
+
type: typeExpr,
|
|
130
|
+
optional: prop.optional
|
|
131
|
+
};
|
|
132
|
+
})
|
|
133
|
+
// Required parameters must come before optional ones in C#
|
|
134
|
+
.sort((a, b) => a.optional === b.optional ? 0 : a.optional ? 1 : -1);
|
|
135
|
+
|
|
136
|
+
// For multipart requests, add MultipartReader parameter
|
|
137
|
+
if (isMultipart) {
|
|
138
|
+
parameters.push({
|
|
139
|
+
name: "reader",
|
|
140
|
+
type: code`MultipartReader`,
|
|
141
|
+
optional: false
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return _$createComponent(cs.InterfaceMethod, {
|
|
145
|
+
name: methodName,
|
|
146
|
+
parameters: parameters,
|
|
147
|
+
returns: returnType,
|
|
148
|
+
get doc() {
|
|
149
|
+
return getDocComments($, props.operation);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=interfaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["refkey","ayRefkey","code","For","cs","isTemplateDeclaration","isVoidType","useTsp","getUniqueItems","getDocComments","getSuccessReturnType","TypeExpression","interfaceRefKeyPrefix","Symbol","for","businessLogicInterfaceRefkey","type","BusinessLogicInterface","props","$","namePolicy","useCSharpNamePolicy","interfaceName","getName","name","operations","Array","from","entries","filter","_","op","canonicalMap","Map","canonicalOps","cop","set","_$createComponent","InterfaceDeclaration","doc","children","each","doubleHardline","BusinessLogicMethod","operation","canonicalOp","get","methodName","successType","program","returnType","isMultipart","requestParameters","body","bodyKind","isGet","method","bodyPropNames","Set","bodies","length","bodyType","sourceType","kind","properties","add","p","property","filteredPropNames","isContentTypeProperty","parameters","prop","has","map","pName","isUnique","isArrayType","array","is","typeExpr","indexer","value","optional","sort","a","b","push","InterfaceMethod","returns"],"sources":["../../../../src/components/interfaces/interfaces.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.test.d.ts","sourceRoot":"","sources":["../../../../src/components/interfaces/interfaces.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
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 { Output } from "@typespec/emitter-framework";
|
|
6
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
7
|
+
import { BusinessLogicInterface } from "./interfaces.js";
|
|
8
|
+
let runner;
|
|
9
|
+
beforeEach(async () => {
|
|
10
|
+
runner = await Tester.createInstance();
|
|
11
|
+
});
|
|
12
|
+
function Wrapper(props) {
|
|
13
|
+
const policy = createCSharpNamePolicy();
|
|
14
|
+
return _$createComponent(Output, {
|
|
15
|
+
get program() {
|
|
16
|
+
return runner.program;
|
|
17
|
+
},
|
|
18
|
+
namePolicy: policy,
|
|
19
|
+
get children() {
|
|
20
|
+
return _$createComponent(SourceFile, {
|
|
21
|
+
path: "test.cs",
|
|
22
|
+
get children() {
|
|
23
|
+
return props.children;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
describe("BusinessLogicInterface", () => {
|
|
30
|
+
it("renders an interface with async methods", async () => {
|
|
31
|
+
const {
|
|
32
|
+
PetStore
|
|
33
|
+
} = await runner.compile(t.code`
|
|
34
|
+
interface ${t.interface("PetStore")} {
|
|
35
|
+
listPets(): string[];
|
|
36
|
+
getPet(petId: string): string;
|
|
37
|
+
}
|
|
38
|
+
`);
|
|
39
|
+
expect(_$createComponent(Wrapper, {
|
|
40
|
+
get children() {
|
|
41
|
+
return _$createComponent(BusinessLogicInterface, {
|
|
42
|
+
type: PetStore
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
})).toRenderTo(`
|
|
46
|
+
public interface IPetStore
|
|
47
|
+
{
|
|
48
|
+
Task<string[]> ListPetsAsync();
|
|
49
|
+
|
|
50
|
+
Task<string> GetPetAsync(string petId);
|
|
51
|
+
}
|
|
52
|
+
`);
|
|
53
|
+
});
|
|
54
|
+
it("renders an interface with void return type", async () => {
|
|
55
|
+
const {
|
|
56
|
+
PetStore
|
|
57
|
+
} = await runner.compile(t.code`
|
|
58
|
+
interface ${t.interface("PetStore")} {
|
|
59
|
+
deletePet(petId: string): void;
|
|
60
|
+
}
|
|
61
|
+
`);
|
|
62
|
+
expect(_$createComponent(Wrapper, {
|
|
63
|
+
get children() {
|
|
64
|
+
return _$createComponent(BusinessLogicInterface, {
|
|
65
|
+
type: PetStore
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
})).toRenderTo(`
|
|
69
|
+
public interface IPetStore
|
|
70
|
+
{
|
|
71
|
+
Task DeletePetAsync(string petId);
|
|
72
|
+
}
|
|
73
|
+
`);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=interfaces.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Tester","createCSharpNamePolicy","SourceFile","t","Output","beforeEach","describe","expect","it","BusinessLogicInterface","runner","createInstance","Wrapper","props","policy","_$createComponent","program","namePolicy","children","path","PetStore","compile","code","interface","type","toRenderTo"],"sources":["../../../../src/components/interfaces/interfaces.test.tsx"],"sourcesContent":[null],"mappings":";AAAA,SAASA,MAAM,QAAQ,iBAAiB;AAExC,SAASC,sBAAsB,EAAEC,UAAU,QAAQ,kBAAkB;AACrE,SAASC,CAAC,QAA6B,4BAA4B;AACnE,SAASC,MAAM,QAAQ,6BAA6B;AACpD,SAASC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AACzD,SAASC,sBAAsB;AAE/B,IAAIC,MAAsB;AAE1BL,UAAU,CAAC,YAAY;EACrBK,MAAM,GAAG,MAAMV,MAAM,CAACW,cAAc,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,SAASC,OAAOA,CAACC,KAA6B,EAAE;EAC9C,MAAMC,MAAM,GAAGb,sBAAsB,CAAC,CAAC;EACvC,OAAAc,iBAAA,CACGX,MAAM;IAAA,IAACY,OAAOA,CAAA;MAAA,OAAEN,MAAM,CAACM,OAAO;IAAA;IAAEC,UAAU,EAAEH,MAAM;IAAA,IAAAI,SAAA;MAAA,OAAAH,iBAAA,CAChDb,UAAU;QAACiB,IAAI;QAAA,IAAAD,SAAA;UAAA,OAAYL,KAAK,CAACK,QAAQ;QAAA;MAAA;IAAA;EAAA;AAGhD;AAEAZ,QAAQ,CAAC,wBAAwB,EAAE,MAAM;EACvCE,EAAE,CAAC,yCAAyC,EAAE,YAAY;IACxD,MAAM;MAAEY;IAAS,CAAC,GAAG,MAAMV,MAAM,CAACW,OAAO,CAAClB,CAAC,CAACmB,IAAI;AACpD,kBAAkBnB,CAAC,CAACoB,SAAS,CAAC,UAAU,CAAC;AACzC;AACA;AACA;AACA,KAAK,CAAC;IAEFhB,MAAM,CAAAQ,iBAAA,CACHH,OAAO;MAAA,IAAAM,SAAA;QAAA,OAAAH,iBAAA,CACLN,sBAAsB;UAACe,IAAI,EAAEJ;QAAQ;MAAA;IAAA,EAE1C,CAAC,CAACK,UAAU,CAAC;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,CAAC;EACJ,CAAC,CAAC;EAEFjB,EAAE,CAAC,4CAA4C,EAAE,YAAY;IAC3D,MAAM;MAAEY;IAAS,CAAC,GAAG,MAAMV,MAAM,CAACW,OAAO,CAAClB,CAAC,CAACmB,IAAI;AACpD,kBAAkBnB,CAAC,CAACoB,SAAS,CAAC,UAAU,CAAC;AACzC;AACA;AACA,KAAK,CAAC;IAEFhB,MAAM,CAAAQ,iBAAA,CACHH,OAAO;MAAA,IAAAM,SAAA;QAAA,OAAAH,iBAAA,CACLN,sBAAsB;UAACe,IAAI,EAAEJ;QAAQ;MAAA;IAAA,EAE1C,CAAC,CAACK,UAAU,CAAC;AACjB;AACA;AACA;AACA;AACA,KAAK,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Interface, Model } from "@typespec/compiler";
|
|
2
|
+
/** Resets anonymous model state — call before each compilation. */
|
|
3
|
+
export declare function resetAnonymousModels(): void;
|
|
4
|
+
/** Gets the generated name for an anonymous model, or undefined if it's not anonymous. */
|
|
5
|
+
export declare function getAnonymousModelName(model: Model): string | undefined;
|
|
6
|
+
export declare function assignAnonymousName(model: Model, contextualName?: string): string;
|
|
7
|
+
/** Pre-assigns contextual names to anonymous response models before the diagnostic pre-pass. */
|
|
8
|
+
export declare function preAssignAnonymousResponseNames(interfaces: Interface[]): void;
|
|
9
|
+
//# sourceMappingURL=anonymous-models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anonymous-models.d.ts","sourceRoot":"","sources":["../../../../src/components/models/anonymous-models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAM3D,mEAAmE;AACnE,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C;AAED,0FAA0F;AAC1F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAEtE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAOjF;AAED,gGAAgG;AAChG,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAW7E"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Map from anonymous models to their generated names (Model0, Model1, ...) */
|
|
2
|
+
const anonymousModelNames = new Map();
|
|
3
|
+
let anonymousModelCounter = 0;
|
|
4
|
+
|
|
5
|
+
/** Resets anonymous model state — call before each compilation. */
|
|
6
|
+
export function resetAnonymousModels() {
|
|
7
|
+
anonymousModelNames.clear();
|
|
8
|
+
anonymousModelCounter = 0;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** Gets the generated name for an anonymous model, or undefined if it's not anonymous. */
|
|
12
|
+
export function getAnonymousModelName(model) {
|
|
13
|
+
return anonymousModelNames.get(model);
|
|
14
|
+
}
|
|
15
|
+
export function assignAnonymousName(model, contextualName) {
|
|
16
|
+
let name = anonymousModelNames.get(model);
|
|
17
|
+
if (!name) {
|
|
18
|
+
name = contextualName ?? `Model${anonymousModelCounter++}`;
|
|
19
|
+
anonymousModelNames.set(model, name);
|
|
20
|
+
}
|
|
21
|
+
return name;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Pre-assigns contextual names to anonymous response models before the diagnostic pre-pass. */
|
|
25
|
+
export function preAssignAnonymousResponseNames(interfaces) {
|
|
26
|
+
for (const iface of interfaces) {
|
|
27
|
+
for (const [, op] of iface.operations) {
|
|
28
|
+
const returnType = op.returnType;
|
|
29
|
+
if (returnType.kind === "Model" && !returnType.name) {
|
|
30
|
+
const opName = op.name.charAt(0).toUpperCase() + op.name.slice(1);
|
|
31
|
+
const ctxName = iface.name.charAt(0).toUpperCase() + iface.name.slice(1);
|
|
32
|
+
assignAnonymousName(returnType, `${ctxName}${opName}Response`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=anonymous-models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["anonymousModelNames","Map","anonymousModelCounter","resetAnonymousModels","clear","getAnonymousModelName","model","get","assignAnonymousName","contextualName","name","set","preAssignAnonymousResponseNames","interfaces","iface","op","operations","returnType","kind","opName","charAt","toUpperCase","slice","ctxName"],"sources":["../../../../src/components/models/anonymous-models.ts"],"sourcesContent":[null],"mappings":"AAEA;AACA,MAAMA,mBAAmB,GAAG,IAAIC,GAAG,CAAgB,CAAC;AACpD,IAAIC,qBAAqB,GAAG,CAAC;;AAE7B;AACA,OAAO,SAASC,oBAAoBA,CAAA,EAAS;EAC3CH,mBAAmB,CAACI,KAAK,CAAC,CAAC;EAC3BF,qBAAqB,GAAG,CAAC;AAC3B;;AAEA;AACA,OAAO,SAASG,qBAAqBA,CAACC,KAAY,EAAsB;EACtE,OAAON,mBAAmB,CAACO,GAAG,CAACD,KAAK,CAAC;AACvC;AAEA,OAAO,SAASE,mBAAmBA,CAACF,KAAY,EAAEG,cAAuB,EAAU;EACjF,IAAIC,IAAI,GAAGV,mBAAmB,CAACO,GAAG,CAACD,KAAK,CAAC;EACzC,IAAI,CAACI,IAAI,EAAE;IACTA,IAAI,GAAGD,cAAc,IAAI,QAAQP,qBAAqB,EAAE,EAAE;IAC1DF,mBAAmB,CAACW,GAAG,CAACL,KAAK,EAAEI,IAAI,CAAC;EACtC;EACA,OAAOA,IAAI;AACb;;AAEA;AACA,OAAO,SAASE,+BAA+BA,CAACC,UAAuB,EAAQ;EAC7E,KAAK,MAAMC,KAAK,IAAID,UAAU,EAAE;IAC9B,KAAK,MAAM,GAAGE,EAAE,CAAC,IAAID,KAAK,CAACE,UAAU,EAAE;MACrC,MAAMC,UAAU,GAAGF,EAAE,CAACE,UAAU;MAChC,IAAIA,UAAU,CAACC,IAAI,KAAK,OAAO,IAAI,CAACD,UAAU,CAACP,IAAI,EAAE;QACnD,MAAMS,MAAM,GAAGJ,EAAE,CAACL,IAAI,CAACU,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,GAAGN,EAAE,CAACL,IAAI,CAACY,KAAK,CAAC,CAAC,CAAC;QACjE,MAAMC,OAAO,GAAGT,KAAK,CAACJ,IAAI,CAACU,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,GAAGP,KAAK,CAACJ,IAAI,CAACY,KAAK,CAAC,CAAC,CAAC;QACxEd,mBAAmB,CAACS,UAAU,EAAE,GAAGM,OAAO,GAAGJ,MAAM,UAAU,CAAC;MAChE;IACF;EACF;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type Children } from "@alloy-js/core";
|
|
2
|
+
import { type Model, type Program } from "@typespec/compiler";
|
|
3
|
+
/** Generates the constructor for an error model. */
|
|
4
|
+
export declare function getErrorConstructor(program: Program, model: Model, className: string): Children;
|
|
5
|
+
//# sourceMappingURL=error-models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-models.d.ts","sourceRoot":"","sources":["../../../../src/components/models/error-models.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,EAAgB,KAAK,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAW5E,oDAAoD;AACpD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,CAyE/F"}
|