@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,84 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
|
|
2
|
+
import * as cs from "@alloy-js/csharp";
|
|
3
|
+
import { isErrorModel } from "@typespec/compiler";
|
|
4
|
+
import { getHeaderFieldName, isHeader, isStatusCode } from "@typespec/http";
|
|
5
|
+
import { getAllProperties, getCSharpTypeString, getDefaultValueString, getErrorStatusCode, getLiteralValue, isDuplicateExceptionName } from "./model-helpers.js";
|
|
6
|
+
|
|
7
|
+
/** Generates the constructor for an error model. */
|
|
8
|
+
export function getErrorConstructor(program, model, className) {
|
|
9
|
+
const statusCode = getErrorStatusCode(program, model);
|
|
10
|
+
const isChild = model.baseModel && isErrorModel(program, model.baseModel);
|
|
11
|
+
const namePolicy = cs.createCSharpNamePolicy();
|
|
12
|
+
|
|
13
|
+
// For child error models, only use own properties (not inherited)
|
|
14
|
+
// For root error models, use all properties including inherited
|
|
15
|
+
const props = isChild ? Array.from(model.properties.values()) : getAllProperties(program, model);
|
|
16
|
+
|
|
17
|
+
// Separate properties into required and optional/default
|
|
18
|
+
const sortedProps = props.filter(p => !isStatusCode(program, p)).map(prop => {
|
|
19
|
+
const defaultValue = prop.defaultValue ? getDefaultValueString(prop.defaultValue) : undefined;
|
|
20
|
+
const literalValue = getLiteralValue(prop.type);
|
|
21
|
+
return {
|
|
22
|
+
prop,
|
|
23
|
+
defaultValue: defaultValue ?? literalValue
|
|
24
|
+
};
|
|
25
|
+
}).sort((a, b) => {
|
|
26
|
+
const aHasDefault = a.prop.optional || a.defaultValue !== undefined;
|
|
27
|
+
const bHasDefault = b.prop.optional || b.defaultValue !== undefined;
|
|
28
|
+
if (!aHasDefault && bHasDefault) return -1;
|
|
29
|
+
if (aHasDefault && !bHasDefault) return 1;
|
|
30
|
+
return 0;
|
|
31
|
+
});
|
|
32
|
+
const parameters = [];
|
|
33
|
+
const bodyParts = [];
|
|
34
|
+
const headerParts = [];
|
|
35
|
+
const valueParts = [];
|
|
36
|
+
if (statusCode?.requiresConstructorArgument) {
|
|
37
|
+
parameters.push({
|
|
38
|
+
name: String(statusCode.value),
|
|
39
|
+
type: "int"
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
for (const {
|
|
43
|
+
prop,
|
|
44
|
+
defaultValue
|
|
45
|
+
} of sortedProps) {
|
|
46
|
+
let propName = namePolicy.getName(prop.name, "class-property");
|
|
47
|
+
if (propName === className || isDuplicateExceptionName(propName)) {
|
|
48
|
+
propName = propName === "Value" ? "ValueName" : `${propName}Prop`;
|
|
49
|
+
}
|
|
50
|
+
const csharpType = getCSharpTypeString(program, prop.type);
|
|
51
|
+
const defaultStr = defaultValue ? defaultValue : prop.optional ? "default" : undefined;
|
|
52
|
+
parameters.push({
|
|
53
|
+
name: prop.name,
|
|
54
|
+
type: csharpType,
|
|
55
|
+
default: defaultStr
|
|
56
|
+
});
|
|
57
|
+
bodyParts.push(`${propName} = ${prop.name};`);
|
|
58
|
+
if (isHeader(program, prop)) {
|
|
59
|
+
const headerName = getHeaderFieldName(program, prop);
|
|
60
|
+
headerParts.push(`{"${headerName}", ${prop.name}}`);
|
|
61
|
+
} else {
|
|
62
|
+
valueParts.push(`${prop.name} = ${prop.name}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const statusCodeStr = statusCode?.value ?? 400;
|
|
66
|
+
|
|
67
|
+
// Build base call arguments
|
|
68
|
+
const baseArgs = [String(statusCodeStr)];
|
|
69
|
+
if (headerParts.length > 0) {
|
|
70
|
+
baseArgs.push(`headers: new() { ${headerParts.join(", ")} }`);
|
|
71
|
+
}
|
|
72
|
+
if (valueParts.length > 0) {
|
|
73
|
+
baseArgs.push(`value: new { ${valueParts.join(", ")} }`);
|
|
74
|
+
}
|
|
75
|
+
const baseConstructorArgs = isChild ? [String(statusCodeStr)] : baseArgs;
|
|
76
|
+
const body = bodyParts.join("\n");
|
|
77
|
+
return _$createComponent(cs.Constructor, {
|
|
78
|
+
"public": true,
|
|
79
|
+
parameters: parameters,
|
|
80
|
+
baseConstructor: baseConstructorArgs,
|
|
81
|
+
children: body
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=error-models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["cs","isErrorModel","getHeaderFieldName","isHeader","isStatusCode","getAllProperties","getCSharpTypeString","getDefaultValueString","getErrorStatusCode","getLiteralValue","isDuplicateExceptionName","getErrorConstructor","program","model","className","statusCode","isChild","baseModel","namePolicy","createCSharpNamePolicy","props","Array","from","properties","values","sortedProps","filter","p","map","prop","defaultValue","undefined","literalValue","type","sort","a","b","aHasDefault","optional","bHasDefault","parameters","bodyParts","headerParts","valueParts","requiresConstructorArgument","push","name","String","value","propName","getName","csharpType","defaultStr","default","headerName","statusCodeStr","baseArgs","length","join","baseConstructorArgs","body","_$createComponent","Constructor","baseConstructor","children"],"sources":["../../../../src/components/models/error-models.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as cs from "@alloy-js/csharp";
|
|
2
|
+
import { type Enum, type Model, type ModelProperty, type Program, type Type, type Value } from "@typespec/compiler";
|
|
3
|
+
import type { useTsp } from "@typespec/emitter-framework";
|
|
4
|
+
/** Gets the string representation of a literal or default value. */
|
|
5
|
+
export declare function getLiteralValue(type: Type, collectionType?: "array" | "enumerable"): string | undefined;
|
|
6
|
+
/** Gets the string representation of a Value (for defaultValue). */
|
|
7
|
+
export declare function getDefaultValueString(value: Value): string | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* For a union variant type (e.g., kind: PetType.Dog), returns a C# enum member
|
|
10
|
+
* initializer like "PetType.Dog". Returns undefined if not a union-enum variant.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getUnionVariantInitializer(type: Type, namePolicy: ReturnType<typeof cs.createCSharpNamePolicy>): string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* For a property with a default value that references an enum or union-enum member,
|
|
15
|
+
* returns the C# enum member string like "WolfBreed.Dire".
|
|
16
|
+
*/
|
|
17
|
+
export declare function getEnumDefaultInitializer(property: ModelProperty, namePolicy: ReturnType<typeof cs.createCSharpNamePolicy>): string | undefined;
|
|
18
|
+
/** Checks if a property name exists anywhere in the model's base chain. */
|
|
19
|
+
export declare function hasPropertyInChain(model: Model | undefined, propName: string): boolean;
|
|
20
|
+
/** For literal types, get the underlying scalar type for the property declaration. */
|
|
21
|
+
export declare function getScalarForLiteral(type: Type): Type;
|
|
22
|
+
/** Returns true if the enum has any non-integer member values (float enums can't be C# enums). */
|
|
23
|
+
export declare function hasNonIntegerValues(en: Enum): boolean;
|
|
24
|
+
/** Returns true if the TypeSpec type maps to a C# value type (struct). */
|
|
25
|
+
export declare function isValueType($: ReturnType<typeof useTsp>["$"], type: Type): boolean;
|
|
26
|
+
/** Returns true if any property of the model uses Record<T> (mapped to JsonObject). */
|
|
27
|
+
export declare function modelNeedsJsonNodes($: ReturnType<typeof useTsp>["$"], model: Model): boolean;
|
|
28
|
+
export declare function isDuplicateExceptionName(name: string): boolean;
|
|
29
|
+
/** Gets all properties including inherited ones. */
|
|
30
|
+
export declare function getAllProperties(program: Program, model: Model): ModelProperty[];
|
|
31
|
+
/** Gets the status code for an error model. */
|
|
32
|
+
export declare function getErrorStatusCode(program: Program, model: Model): {
|
|
33
|
+
value: string | number;
|
|
34
|
+
requiresConstructorArgument?: boolean;
|
|
35
|
+
} | undefined;
|
|
36
|
+
/** Gets a simple C# type name string for a TypeSpec type. */
|
|
37
|
+
export declare function getCSharpTypeString(program: Program, type: Type): string;
|
|
38
|
+
/** Gets the name to use when emitting a model — handles friendly names, template instantiations, and anonymous models. */
|
|
39
|
+
export declare function getModelEmitName(program: Program, model: Model): string;
|
|
40
|
+
//# sourceMappingURL=model-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-helpers.d.ts","sourceRoot":"","sources":["../../../../src/components/models/model-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAGL,KAAK,IAAI,EACT,KAAK,KAAK,EACV,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,IAAI,EAET,KAAK,KAAK,EACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAK1D,oEAAoE;AACpE,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,EACV,cAAc,CAAC,EAAE,OAAO,GAAG,YAAY,GACtC,MAAM,GAAG,SAAS,CA8BpB;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAKtE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,sBAAsB,CAAC,GACvD,MAAM,GAAG,SAAS,CAQpB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,sBAAsB,CAAC,GACvD,MAAM,GAAG,SAAS,CA8BpB;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAOtF;AAED,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAIpD;AAED,kGAAkG;AAClG,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAOrD;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAqClF;AAED,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAS5F;AAgBD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,aAAa,EAAE,CAUhF;AAED,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,GACX;IAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,2BAA2B,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAe/E;AAED,6DAA6D;AAC7D,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAkCxE;AAED,0HAA0H;AAC1H,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CA0BvE"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { getFriendlyName, getMinValue } from "@typespec/compiler";
|
|
2
|
+
import { isStatusCode } from "@typespec/http";
|
|
3
|
+
import { getUnionEnumMembers, isUnionEnum } from "../enums/enums.js";
|
|
4
|
+
import { assignAnonymousName } from "./anonymous-models.js";
|
|
5
|
+
|
|
6
|
+
/** Gets the string representation of a literal or default value. */
|
|
7
|
+
export function getLiteralValue(type, collectionType) {
|
|
8
|
+
if (type.kind === "String") return `"${type.value}"`;
|
|
9
|
+
if (type.kind === "Boolean") return type.value ? "true" : "false";
|
|
10
|
+
if (type.kind === "Number") return String(type.value);
|
|
11
|
+
if (type.kind === "StringTemplate" && type.stringValue !== undefined) {
|
|
12
|
+
return `"${type.stringValue}"`;
|
|
13
|
+
}
|
|
14
|
+
if (type.kind === "Tuple") {
|
|
15
|
+
const elements = type.values.map(v => getLiteralValue(v));
|
|
16
|
+
if (elements.every(e => e !== undefined)) {
|
|
17
|
+
if (collectionType === "enumerable") {
|
|
18
|
+
// Determine the C# element type from the first value
|
|
19
|
+
const firstType = type.values[0];
|
|
20
|
+
const csElementType = firstType.kind === "Number" ? Number.isInteger(firstType.value) ? "int" : "double" : firstType.kind === "String" ? "string" : firstType.kind === "Boolean" ? "bool" : "object";
|
|
21
|
+
return `new List<${csElementType}> {${elements.join(", ")}}`;
|
|
22
|
+
}
|
|
23
|
+
// Array mode: use C# 12 collection expression
|
|
24
|
+
return `[${elements.join(", ")}]`;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Gets the string representation of a Value (for defaultValue). */
|
|
31
|
+
export function getDefaultValueString(value) {
|
|
32
|
+
if (value.valueKind === "StringValue") return `"${value.value}"`;
|
|
33
|
+
if (value.valueKind === "BooleanValue") return value.value ? "true" : "false";
|
|
34
|
+
if (value.valueKind === "NumericValue") return String(value.value);
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* For a union variant type (e.g., kind: PetType.Dog), returns a C# enum member
|
|
40
|
+
* initializer like "PetType.Dog". Returns undefined if not a union-enum variant.
|
|
41
|
+
*/
|
|
42
|
+
export function getUnionVariantInitializer(type, namePolicy) {
|
|
43
|
+
if (type.kind !== "UnionVariant") return undefined;
|
|
44
|
+
const union = type.union;
|
|
45
|
+
if (!union || !isUnionEnum(union)) return undefined;
|
|
46
|
+
const enumName = namePolicy.getName(union.name, "enum");
|
|
47
|
+
const memberName = namePolicy.getName(String(type.name), "enum-member");
|
|
48
|
+
return `${enumName}.${memberName}`;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* For a property with a default value that references an enum or union-enum member,
|
|
53
|
+
* returns the C# enum member string like "WolfBreed.Dire".
|
|
54
|
+
*/
|
|
55
|
+
export function getEnumDefaultInitializer(property, namePolicy) {
|
|
56
|
+
if (!property.defaultValue) return undefined;
|
|
57
|
+
const dv = property.defaultValue;
|
|
58
|
+
|
|
59
|
+
// Handle TypeSpec enum default values
|
|
60
|
+
if (dv.valueKind === "EnumValue") {
|
|
61
|
+
const enumType = dv.value.enum;
|
|
62
|
+
if (enumType) {
|
|
63
|
+
const enumName = namePolicy.getName(enumType.name, "enum");
|
|
64
|
+
const memberName = namePolicy.getName(dv.value.name, "enum-member");
|
|
65
|
+
return `${enumName}.${memberName}`;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Handle union-enum default values (StringValue matching a union variant)
|
|
70
|
+
if (dv.valueKind === "StringValue" && property.type.kind === "Union" && isUnionEnum(property.type)) {
|
|
71
|
+
const members = getUnionEnumMembers(property.type);
|
|
72
|
+
const match = members.find(m => m.value === dv.value);
|
|
73
|
+
if (match) {
|
|
74
|
+
const enumName = namePolicy.getName(property.type.name, "enum");
|
|
75
|
+
const memberName = namePolicy.getName(match.name, "enum-member");
|
|
76
|
+
return `${enumName}.${memberName}`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Checks if a property name exists anywhere in the model's base chain. */
|
|
83
|
+
export function hasPropertyInChain(model, propName) {
|
|
84
|
+
let current = model;
|
|
85
|
+
while (current) {
|
|
86
|
+
if (current.properties.has(propName)) return true;
|
|
87
|
+
current = current.baseModel;
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** For literal types, get the underlying scalar type for the property declaration. */
|
|
93
|
+
export function getScalarForLiteral(type) {
|
|
94
|
+
// Literal types don't have a .scalar reference in the compiler types
|
|
95
|
+
// We just return the original type and let TypeExpression handle it
|
|
96
|
+
return type;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Returns true if the enum has any non-integer member values (float enums can't be C# enums). */
|
|
100
|
+
export function hasNonIntegerValues(en) {
|
|
101
|
+
for (const member of en.members.values()) {
|
|
102
|
+
if (typeof member.value === "number" && !Number.isInteger(member.value)) {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Returns true if the TypeSpec type maps to a C# value type (struct). */
|
|
110
|
+
export function isValueType($, type) {
|
|
111
|
+
// Handle literal types
|
|
112
|
+
if (type.kind === "Boolean" || type.kind === "Number") return true;
|
|
113
|
+
if (type.kind === "String") return false;
|
|
114
|
+
if ($.scalar.is(type)) {
|
|
115
|
+
const baseName = $.scalar.getStdBase(type)?.name ?? type.name;
|
|
116
|
+
const valueTypes = new Set(["int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64", "safeint", "float32", "float64", "decimal", "decimal128", "boolean", "numeric", "integer", "float", "plainDate", "plainTime", "utcDateTime", "offsetDateTime", "duration", "unixTimestamp32"]);
|
|
117
|
+
return valueTypes.has(baseName);
|
|
118
|
+
}
|
|
119
|
+
if ($.enum.is(type)) return true;
|
|
120
|
+
if (type.kind === "Union" && isUnionEnum(type)) return true;
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Returns true if any property of the model uses Record<T> (mapped to JsonObject). */
|
|
125
|
+
export function modelNeedsJsonNodes($, model) {
|
|
126
|
+
for (const prop of model.properties.values()) {
|
|
127
|
+
if (prop.type.kind === "Model" && $.record.is(prop.type)) {
|
|
128
|
+
// Only need JsonNodes for Record<unknown> (maps to JsonObject)
|
|
129
|
+
const valueType = prop.type.indexer?.value;
|
|
130
|
+
if (valueType?.kind === "Intrinsic" && valueType.name === "unknown") return true;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Exception property names that conflict with C# Exception class
|
|
137
|
+
const exceptionPropertyNames = ["value", "headers", "stacktrace", "source", "message", "innerexception", "hresult", "data", "targetsite", "helplink"];
|
|
138
|
+
export function isDuplicateExceptionName(name) {
|
|
139
|
+
return exceptionPropertyNames.includes(name.toLowerCase());
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** Gets all properties including inherited ones. */
|
|
143
|
+
export function getAllProperties(program, model) {
|
|
144
|
+
const props = [];
|
|
145
|
+
let current = model;
|
|
146
|
+
while (current) {
|
|
147
|
+
for (const prop of current.properties.values()) {
|
|
148
|
+
props.push(prop);
|
|
149
|
+
}
|
|
150
|
+
current = current.baseModel;
|
|
151
|
+
}
|
|
152
|
+
return props;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** Gets the status code for an error model. */
|
|
156
|
+
export function getErrorStatusCode(program, model) {
|
|
157
|
+
const allProps = getAllProperties(program, model);
|
|
158
|
+
const statusCodeProp = allProps.find(p => isStatusCode(program, p));
|
|
159
|
+
if (!statusCodeProp) return undefined;
|
|
160
|
+
const type = statusCodeProp.type;
|
|
161
|
+
if (type.kind === "Union") {
|
|
162
|
+
return {
|
|
163
|
+
value: statusCodeProp.name,
|
|
164
|
+
requiresConstructorArgument: true
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
if (type.kind === "Number") {
|
|
168
|
+
return {
|
|
169
|
+
value: type.value
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
// Fall back to @minValue decorator
|
|
173
|
+
const minVal = getMinValue(program, statusCodeProp);
|
|
174
|
+
return {
|
|
175
|
+
value: minVal ?? "default"
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** Gets a simple C# type name string for a TypeSpec type. */
|
|
180
|
+
export function getCSharpTypeString(program, type) {
|
|
181
|
+
if (type.kind === "Scalar") {
|
|
182
|
+
const scalarMap = {
|
|
183
|
+
string: "string",
|
|
184
|
+
int8: "sbyte",
|
|
185
|
+
int16: "short",
|
|
186
|
+
int32: "int",
|
|
187
|
+
int64: "long",
|
|
188
|
+
uint8: "byte",
|
|
189
|
+
uint16: "ushort",
|
|
190
|
+
uint32: "uint",
|
|
191
|
+
uint64: "ulong",
|
|
192
|
+
float32: "float",
|
|
193
|
+
float64: "double",
|
|
194
|
+
boolean: "bool",
|
|
195
|
+
plainDate: "DateOnly",
|
|
196
|
+
plainTime: "TimeOnly",
|
|
197
|
+
utcDateTime: "DateTimeOffset",
|
|
198
|
+
offsetDateTime: "DateTimeOffset",
|
|
199
|
+
duration: "TimeSpan",
|
|
200
|
+
bytes: "byte[]",
|
|
201
|
+
decimal: "decimal",
|
|
202
|
+
decimal128: "decimal",
|
|
203
|
+
url: "Uri",
|
|
204
|
+
safeint: "long"
|
|
205
|
+
};
|
|
206
|
+
return scalarMap[type.name] ?? type.name;
|
|
207
|
+
}
|
|
208
|
+
if (type.kind === "String") return "string";
|
|
209
|
+
if (type.kind === "Boolean") return "bool";
|
|
210
|
+
if (type.kind === "Number") return Number.isInteger(type.value) ? "int" : "double";
|
|
211
|
+
if (type.kind === "Enum") return type.name;
|
|
212
|
+
if (type.kind === "Model") return type.name;
|
|
213
|
+
return "object";
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/** Gets the name to use when emitting a model — handles friendly names, template instantiations, and anonymous models. */
|
|
217
|
+
export function getModelEmitName(program, model) {
|
|
218
|
+
// Check for @friendlyName first
|
|
219
|
+
const friendlyName = getFriendlyName(program, model);
|
|
220
|
+
if (friendlyName) return friendlyName;
|
|
221
|
+
|
|
222
|
+
// Anonymous models get sequential names
|
|
223
|
+
if (!model.name || model.name === "") {
|
|
224
|
+
return assignAnonymousName(model);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// For template instantiations, concatenate template args with the base name
|
|
228
|
+
if (model.templateMapper && model.templateMapper.args.length > 0) {
|
|
229
|
+
const argNames = model.templateMapper.args.filter(arg => arg.entityKind === "Type").map(arg => {
|
|
230
|
+
if (arg.kind === "Model" || arg.kind === "Scalar") return arg.name;
|
|
231
|
+
return undefined;
|
|
232
|
+
}).filter(Boolean).map(name => name.charAt(0).toUpperCase() + name.slice(1));
|
|
233
|
+
if (argNames.length > 0) {
|
|
234
|
+
return `${model.name}${argNames.join("")}`;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return model.name;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=model-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getFriendlyName","getMinValue","isStatusCode","getUnionEnumMembers","isUnionEnum","assignAnonymousName","getLiteralValue","type","collectionType","kind","value","String","stringValue","undefined","elements","values","map","v","every","e","firstType","csElementType","Number","isInteger","join","getDefaultValueString","valueKind","getUnionVariantInitializer","namePolicy","union","enumName","getName","name","memberName","getEnumDefaultInitializer","property","defaultValue","dv","enumType","enum","members","match","find","m","hasPropertyInChain","model","propName","current","properties","has","baseModel","getScalarForLiteral","hasNonIntegerValues","en","member","isValueType","$","scalar","is","baseName","getStdBase","valueTypes","Set","modelNeedsJsonNodes","prop","record","valueType","indexer","exceptionPropertyNames","isDuplicateExceptionName","includes","toLowerCase","getAllProperties","program","props","push","getErrorStatusCode","allProps","statusCodeProp","p","requiresConstructorArgument","minVal","getCSharpTypeString","scalarMap","string","int8","int16","int32","int64","uint8","uint16","uint32","uint64","float32","float64","boolean","plainDate","plainTime","utcDateTime","offsetDateTime","duration","bytes","decimal","decimal128","url","safeint","getModelEmitName","friendlyName","templateMapper","args","length","argNames","filter","arg","entityKind","Boolean","charAt","toUpperCase","slice"],"sources":["../../../../src/components/models/model-helpers.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Children } from "@alloy-js/core";
|
|
2
|
+
import { type Model, type Namespace as TspNamespace } from "@typespec/compiler";
|
|
3
|
+
export { getAnonymousModelName } from "./anonymous-models.js";
|
|
4
|
+
export interface ModelsProps {
|
|
5
|
+
/** Pre-resolved models to emit. */
|
|
6
|
+
models: Model[];
|
|
7
|
+
/** The service namespace for sub-namespace wrapping. */
|
|
8
|
+
serviceNamespace: TspNamespace | undefined;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Iterates pre-resolved models and emits C# class declarations.
|
|
12
|
+
* Each model is emitted in its own source file under the models directory.
|
|
13
|
+
*/
|
|
14
|
+
export declare function Models(props: ModelsProps): Children;
|
|
15
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../src/components/models/models.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1D,OAAO,EAGL,KAAK,KAAK,EAEV,KAAK,SAAS,IAAI,YAAY,EAC/B,MAAM,oBAAoB,CAAC;AA2B5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAU9D,MAAM,WAAW,WAAW;IAC1B,mCAAmC;IACnC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,wDAAwD;IACxD,gBAAgB,EAAE,YAAY,GAAG,SAAS,CAAC;CAC5C;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,QAAQ,CA2BnD"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { createComponent as _$createComponent, memo as _$memo, 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 } from "@alloy-js/csharp";
|
|
5
|
+
import { isErrorModel, isVoidType } from "@typespec/compiler";
|
|
6
|
+
import { useTsp } from "@typespec/emitter-framework";
|
|
7
|
+
import { isStatusCode } from "@typespec/http";
|
|
8
|
+
import { getUniqueItems } from "@typespec/json-schema";
|
|
9
|
+
import { useEmitterOptions } from "../../context/emitter-options-context.js";
|
|
10
|
+
import { getPropertyAttributes } from "../../utils/attributes.js";
|
|
11
|
+
import { JsonSerialization } from "../../utils/csharp-libs.js";
|
|
12
|
+
import { getDocComments } from "../../utils/doc-comments.js";
|
|
13
|
+
import { getSubNamespaceParts } from "../../utils/namespace-utils.js";
|
|
14
|
+
import { CSharpFile } from "../csharp-file.js";
|
|
15
|
+
import { efRefkey, TypeExpression } from "../type-expression/type-expression.js";
|
|
16
|
+
import { getErrorConstructor } from "./error-models.js";
|
|
17
|
+
import { getDefaultValueString, getEnumDefaultInitializer, getLiteralValue, getModelEmitName, getScalarForLiteral, getUnionVariantInitializer, hasNonIntegerValues, hasPropertyInChain, isDuplicateExceptionName, isValueType, modelNeedsJsonNodes } from "./model-helpers.js";
|
|
18
|
+
|
|
19
|
+
// Re-export public API used by other modules
|
|
20
|
+
export { getAnonymousModelName } from "./anonymous-models.js";
|
|
21
|
+
const modelUsings = ["System", "System.Collections.Generic", "System.Text.Json", "TypeSpec.Helpers.JsonConverters", "TypeSpec.Helpers"];
|
|
22
|
+
/**
|
|
23
|
+
* Iterates pre-resolved models and emits C# class declarations.
|
|
24
|
+
* Each model is emitted in its own source file under the models directory.
|
|
25
|
+
*/
|
|
26
|
+
export function Models(props) {
|
|
27
|
+
const {
|
|
28
|
+
$
|
|
29
|
+
} = useTsp();
|
|
30
|
+
return _$createComponent(For, {
|
|
31
|
+
get each() {
|
|
32
|
+
return props.models;
|
|
33
|
+
},
|
|
34
|
+
children: model => {
|
|
35
|
+
const needsJsonNodes = modelNeedsJsonNodes($, model);
|
|
36
|
+
const usings = needsJsonNodes ? [...modelUsings, "System.Text.Json.Nodes"] : modelUsings;
|
|
37
|
+
const modelName = getModelEmitName($.program, model);
|
|
38
|
+
const subNsParts = getSubNamespaceParts(model.namespace, props.serviceNamespace);
|
|
39
|
+
const modelContent = _$createComponent(ServerClassDeclaration, {
|
|
40
|
+
type: model,
|
|
41
|
+
emitName: modelName
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// Wrap in sub-namespace if the model is in a sub-namespace of the service
|
|
45
|
+
const wrappedContent = subNsParts.reduceRight((content, nsPart) => _$createComponent(cs.Namespace, {
|
|
46
|
+
name: nsPart,
|
|
47
|
+
children: content
|
|
48
|
+
}), modelContent);
|
|
49
|
+
return _$createComponent(CSharpFile, {
|
|
50
|
+
path: `${modelName}.cs`,
|
|
51
|
+
using: usings,
|
|
52
|
+
children: wrappedContent
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Server-specific class declaration that matches the old emitter output:
|
|
59
|
+
* - No `required` keyword
|
|
60
|
+
* - No `[JsonPropertyName]` attributes
|
|
61
|
+
* - No nullable `?` suffix on reference types (string, byte[], etc.)
|
|
62
|
+
*/
|
|
63
|
+
function ServerClassDeclaration(props) {
|
|
64
|
+
const {
|
|
65
|
+
$
|
|
66
|
+
} = useTsp();
|
|
67
|
+
const namePolicy = cs.useCSharpNamePolicy();
|
|
68
|
+
const className = namePolicy.getName(props.emitName ?? props.type.name, "class");
|
|
69
|
+
const refkeys = efRefkey(props.type);
|
|
70
|
+
const isError = isErrorModel($.program, props.type);
|
|
71
|
+
const properties = Array.from(props.type.properties.entries()).filter(([_, p]) => !isVoidType(p.type));
|
|
72
|
+
|
|
73
|
+
// Determine base type
|
|
74
|
+
let baseType;
|
|
75
|
+
if (props.type.baseModel) {
|
|
76
|
+
baseType = _$createComponent(TypeExpression, {
|
|
77
|
+
get type() {
|
|
78
|
+
return props.type.baseModel;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
} else if (isError) {
|
|
82
|
+
baseType = "HttpServiceException";
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Generate constructor for error models
|
|
86
|
+
const errorConstructor = isError ? getErrorConstructor($.program, props.type, className) : undefined;
|
|
87
|
+
|
|
88
|
+
// For error models with base model, check if base is also an error (child constructor)
|
|
89
|
+
const hasChildConstructor = isError && props.type.derivedModels && props.type.derivedModels.length > 0;
|
|
90
|
+
return _$createComponent(cs.ClassDeclaration, {
|
|
91
|
+
name: className,
|
|
92
|
+
refkey: refkeys,
|
|
93
|
+
"public": true,
|
|
94
|
+
partial: true,
|
|
95
|
+
baseType: baseType,
|
|
96
|
+
get doc() {
|
|
97
|
+
return getDocComments($, props.type);
|
|
98
|
+
},
|
|
99
|
+
get children() {
|
|
100
|
+
return [errorConstructor, _$memo(() => errorConstructor && _$createIntrinsic("hbr", {})), _$memo(() => hasChildConstructor && _$createComponent(cs.Constructor, {
|
|
101
|
+
"public": true,
|
|
102
|
+
parameters: [{
|
|
103
|
+
name: "statusCode",
|
|
104
|
+
type: "int"
|
|
105
|
+
}, {
|
|
106
|
+
name: "value",
|
|
107
|
+
type: "object?",
|
|
108
|
+
default: "null"
|
|
109
|
+
}, {
|
|
110
|
+
name: "headers",
|
|
111
|
+
type: "Dictionary<string, string>?",
|
|
112
|
+
default: "default"
|
|
113
|
+
}],
|
|
114
|
+
baseConstructor: ["statusCode", "value", "headers"]
|
|
115
|
+
})), _$memo(() => hasChildConstructor && _$createIntrinsic("hbr", {})), _$createComponent(For, {
|
|
116
|
+
each: properties,
|
|
117
|
+
doubleHardline: true,
|
|
118
|
+
children: ([_, property]) => {
|
|
119
|
+
// Skip statusCode properties for error models
|
|
120
|
+
if (isError && isStatusCode($.program, property)) return undefined;
|
|
121
|
+
return _$createComponent(ServerProperty, {
|
|
122
|
+
type: property,
|
|
123
|
+
errorClassName: isError ? className : undefined,
|
|
124
|
+
get baseModel() {
|
|
125
|
+
return props.type.baseModel;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
})];
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Server-specific property that matches old emitter output.
|
|
135
|
+
* No `required`, no `[JsonPropertyName]`, no nullable `?` for reference types.
|
|
136
|
+
*/
|
|
137
|
+
function ServerProperty(props) {
|
|
138
|
+
const {
|
|
139
|
+
$
|
|
140
|
+
} = useTsp();
|
|
141
|
+
const namePolicy = cs.useCSharpNamePolicy();
|
|
142
|
+
const propType = props.type.type;
|
|
143
|
+
const attrs = getPropertyAttributes($.program, props.type);
|
|
144
|
+
|
|
145
|
+
// Determine property name, handling error model conflicts
|
|
146
|
+
let propName = props.type.name;
|
|
147
|
+
if (props.errorClassName) {
|
|
148
|
+
const csharpPropName = namePolicy.getName(propName, "class-property");
|
|
149
|
+
if (csharpPropName === props.errorClassName || isDuplicateExceptionName(csharpPropName)) {
|
|
150
|
+
propName = csharpPropName === "Value" ? "ValueName" : `${csharpPropName}Prop`;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Add JsonPropertyName if the C# name differs from the original TypeSpec name
|
|
155
|
+
const csharpName = namePolicy.getName(propName, "class-property");
|
|
156
|
+
if (csharpName !== props.type.name) {
|
|
157
|
+
attrs.unshift(_$createComponent(Attribute, {
|
|
158
|
+
get name() {
|
|
159
|
+
return JsonSerialization.JsonPropertyNameAttribute;
|
|
160
|
+
},
|
|
161
|
+
get args() {
|
|
162
|
+
return [`"${props.type.name}"`];
|
|
163
|
+
}
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Check if this property overrides a base model property (discriminator pattern)
|
|
168
|
+
const isOverride = props.baseModel ? hasPropertyInChain(props.baseModel, props.type.name) : false;
|
|
169
|
+
|
|
170
|
+
// Check for union variant type (e.g., kind: PetType.Dog) — used as enum member initializer
|
|
171
|
+
const unionVariantInit = getUnionVariantInitializer(propType, namePolicy);
|
|
172
|
+
|
|
173
|
+
// Check for enum default value (e.g., variety: WolfBreed = WolfBreed.dire)
|
|
174
|
+
const enumDefaultInit = getEnumDefaultInitializer(props.type, namePolicy);
|
|
175
|
+
|
|
176
|
+
// For error models, properties get values from constructor, not as literals
|
|
177
|
+
const isErrorProp = !!props.errorClassName;
|
|
178
|
+
|
|
179
|
+
// Check for literal values (the type itself is a literal)
|
|
180
|
+
const {
|
|
181
|
+
collectionType
|
|
182
|
+
} = useEmitterOptions();
|
|
183
|
+
const literalInfo = isErrorProp ? undefined : unionVariantInit ?? getLiteralValue(propType, collectionType);
|
|
184
|
+
// Check for default values
|
|
185
|
+
const defaultValue = isErrorProp ? undefined : enumDefaultInit ?? (props.type.defaultValue ? getDefaultValueString(props.type.defaultValue) : undefined);
|
|
186
|
+
const initializer = literalInfo ?? defaultValue;
|
|
187
|
+
const isLiteralOnly = literalInfo !== undefined && defaultValue === undefined;
|
|
188
|
+
|
|
189
|
+
// Check if the property type is a non-integer enum (C# enums can only be integers)
|
|
190
|
+
const isFloatEnum = $.enum.is(propType) && hasNonIntegerValues(propType);
|
|
191
|
+
|
|
192
|
+
// For error model properties with literal types, use the scalar base type
|
|
193
|
+
// But not for union variant types — those should resolve to the enum type
|
|
194
|
+
const resolveToScalar = isLiteralOnly && !unionVariantInit || isErrorProp;
|
|
195
|
+
const resolvedType = resolveToScalar ? getScalarForLiteral(propType) : propType;
|
|
196
|
+
const needsNullable = props.type.optional && (isFloatEnum || isValueType($, resolvedType));
|
|
197
|
+
|
|
198
|
+
// Check if this is a @uniqueItems array → ISet<T>
|
|
199
|
+
const isUniqueItems = getUniqueItems($.program, props.type);
|
|
200
|
+
const isArrayType = propType.kind === "Model" && $.array.is(propType);
|
|
201
|
+
let typeExpr;
|
|
202
|
+
if (isFloatEnum) {
|
|
203
|
+
typeExpr = code`double`;
|
|
204
|
+
} else if (isUniqueItems && isArrayType && propType.indexer?.value) {
|
|
205
|
+
typeExpr = ["ISet<", _$createComponent(TypeExpression, {
|
|
206
|
+
get type() {
|
|
207
|
+
return propType.indexer.value;
|
|
208
|
+
}
|
|
209
|
+
}), ">"];
|
|
210
|
+
} else {
|
|
211
|
+
typeExpr = _$createComponent(TypeExpression, {
|
|
212
|
+
get type() {
|
|
213
|
+
return resolveToScalar ? getScalarForLiteral(propType) : propType;
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
return _$createComponent(cs.Property, {
|
|
218
|
+
name: propName,
|
|
219
|
+
type: typeExpr,
|
|
220
|
+
"public": true,
|
|
221
|
+
"new": isOverride,
|
|
222
|
+
nullable: needsNullable,
|
|
223
|
+
get doc() {
|
|
224
|
+
return getDocComments($, props.type);
|
|
225
|
+
},
|
|
226
|
+
get attributes() {
|
|
227
|
+
return attrs.length > 0 ? attrs : undefined;
|
|
228
|
+
},
|
|
229
|
+
get: true,
|
|
230
|
+
set: !isLiteralOnly,
|
|
231
|
+
initializer: initializer
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=models.js.map
|