@azure-tools/typespec-java 0.27.3 → 0.27.5
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/code-model-builder.d.ts +8 -4
- package/dist/src/code-model-builder.d.ts.map +1 -1
- package/dist/src/code-model-builder.js +260 -120
- package/dist/src/code-model-builder.js.map +1 -1
- package/dist/src/emitter.d.ts.map +1 -1
- package/dist/src/emitter.js +6 -3
- package/dist/src/emitter.js.map +1 -1
- package/dist/src/lib.d.ts +1 -0
- package/dist/src/lib.d.ts.map +1 -1
- package/dist/src/lib.js +3 -2
- package/dist/src/lib.js.map +1 -1
- package/dist/src/operation-utils.js +1 -1
- package/dist/src/operation-utils.js.map +1 -1
- package/dist/src/type-utils.d.ts +1 -0
- package/dist/src/type-utils.d.ts.map +1 -1
- package/dist/src/type-utils.js +3 -0
- package/dist/src/type-utils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/generator/http-client-generator/target/emitter.jar +0 -0
- package/package.json +20 -20
- package/readme.md +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnySchema, BinarySchema, BooleanSchema, NumberSchema, ObjectSchema,
|
|
1
|
+
import { AnySchema, BinarySchema, BooleanSchema, NumberSchema, ObjectSchema, Schema, StringSchema } from "@autorest/codemodel";
|
|
2
2
|
import { SdkType } from "@azure-tools/typespec-client-generator-core";
|
|
3
3
|
import { EmitContext, Program, Type, Union } from "@typespec/compiler";
|
|
4
4
|
import { CodeModel } from "./common/code-model.js";
|
|
@@ -50,8 +50,11 @@ export declare class CodeModelBuilder {
|
|
|
50
50
|
private processRouteForPaged;
|
|
51
51
|
private processLroMetadata;
|
|
52
52
|
private processRouteForLongRunning;
|
|
53
|
-
private _armApiVersionParameter?;
|
|
54
53
|
private processParameter;
|
|
54
|
+
private processParameterGrouping;
|
|
55
|
+
private processSdkMethodOverride;
|
|
56
|
+
private processGroupSchema;
|
|
57
|
+
private checkGroupingAfterBodyParameterFlatten;
|
|
55
58
|
private processEtagHeaderParameters;
|
|
56
59
|
private processParameterBody;
|
|
57
60
|
private addParameterOrBodyPropertyToCodeModelRequest;
|
|
@@ -109,9 +112,10 @@ export declare class CodeModelBuilder {
|
|
|
109
112
|
get pollResultSchema(): ObjectSchema;
|
|
110
113
|
private createApiVersionParameter;
|
|
111
114
|
private _apiVersionParameter?;
|
|
112
|
-
get apiVersionParameter(): Parameter;
|
|
113
115
|
private _apiVersionParameterInPath?;
|
|
114
|
-
|
|
116
|
+
private _apiVersionParameterInHeader?;
|
|
117
|
+
private _armApiVersionParameter?;
|
|
118
|
+
private getApiVersionParameter;
|
|
115
119
|
private isSubscriptionId;
|
|
116
120
|
private subscriptionIdParameter;
|
|
117
121
|
private _subscriptionParameter?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-model-builder.d.ts","sourceRoot":"","sources":["../../src/code-model-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAIT,YAAY,EACZ,aAAa,EAeb,YAAY,EAEZ,YAAY,
|
|
1
|
+
{"version":3,"file":"code-model-builder.d.ts","sourceRoot":"","sources":["../../src/code-model-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AnySchema, ApiVersion, ArraySchema, BinaryResponse, BinarySchema, BooleanSchema, ByteArraySchema, ChoiceValue, DateSchema, DateTimeSchema, DictionarySchema, Discriminator, GroupProperty, GroupSchema, HttpHeader, HttpParameter, ImplementationLocation, KeySecurityScheme, Language, Metadata, NumberSchema, OAuth2SecurityScheme, ObjectSchema, OperationGroup, Parameter, ParameterLocation, Property, Relations, Response, SchemaResponse, SchemaType, Security, SerializationStyle, StringSchema, TimeSchema, UnixTimeSchema, UriSchema, VirtualParameter, } from "@autorest/codemodel";
|
|
2
2
|
import { KnownMediaType } from "@azure-tools/codegen";
|
|
3
|
-
import { createSdkContext, getAllModels,
|
|
3
|
+
import { createSdkContext, getAllModels, getHttpOperationParameter, isSdkBuiltInKind, isSdkIntKind, } from "@azure-tools/typespec-client-generator-core";
|
|
4
4
|
import { NoTarget, getDoc, getNamespaceFullName, getOverloadedOperation, getSummary, isArrayModelType, isRecordModelType, listServices, } from "@typespec/compiler";
|
|
5
5
|
import { Visibility, getAuthentication, } from "@typespec/http";
|
|
6
6
|
import { getSegment } from "@typespec/rest";
|
|
@@ -17,7 +17,7 @@ import { OrSchema } from "./common/schemas/relationship.js";
|
|
|
17
17
|
import { DurationSchema } from "./common/schemas/time.js";
|
|
18
18
|
import { SchemaContext } from "./common/schemas/usage.js";
|
|
19
19
|
import { createPollOperationDetailsSchema, getFileDetailsSchema } from "./external-schemas.js";
|
|
20
|
-
import { createDiagnostic, reportDiagnostic } from "./lib.js";
|
|
20
|
+
import { LIB_NAME, createDiagnostic, reportDiagnostic } from "./lib.js";
|
|
21
21
|
import { ClientContext } from "./models.js";
|
|
22
22
|
import { CONTENT_TYPE_KEY, ORIGIN_API_VERSION, SPECIAL_HEADER_NAMES, cloneOperationParameter, getServiceVersion, isKnownContentType, isLroNewPollingStrategy, operationIsJsonMergePatch, operationIsMultipart, operationIsMultipleContentTypes, } from "./operation-utils.js";
|
|
23
23
|
import { ProcessingCache, getAccess, getDurationFormat, getNonNullSdkType, getPropertySerializedName, getUnionDescription, getUsage, modelIs, pushDistinct, } from "./type-utils.js";
|
|
@@ -73,7 +73,8 @@ export class CodeModelBuilder {
|
|
|
73
73
|
if (this.program.hasError()) {
|
|
74
74
|
return this.codeModel;
|
|
75
75
|
}
|
|
76
|
-
this.sdkContext = await createSdkContext(this.emitterContext,
|
|
76
|
+
this.sdkContext = await createSdkContext(this.emitterContext, LIB_NAME, {
|
|
77
|
+
additionalDecorators: ["Azure\\.ClientGenerator\\.Core\\.@override"],
|
|
77
78
|
versioning: { previewStringRegex: /$/ },
|
|
78
79
|
}); // include all versions and do the filter by ourselves
|
|
79
80
|
// java namespace
|
|
@@ -157,6 +158,7 @@ export class CodeModelBuilder {
|
|
|
157
158
|
scopes: [],
|
|
158
159
|
});
|
|
159
160
|
scheme.flows.forEach((it) => oauth2Scheme.scopes.push(...it.scopes.map((it) => it.value)));
|
|
161
|
+
oauth2Scheme.flows = scheme.flows;
|
|
160
162
|
securitySchemes.push(oauth2Scheme);
|
|
161
163
|
}
|
|
162
164
|
else {
|
|
@@ -684,12 +686,12 @@ export class CodeModelBuilder {
|
|
|
684
686
|
this.processParameter(codeModelOperation, param, clientContext);
|
|
685
687
|
}
|
|
686
688
|
// body
|
|
689
|
+
let bodyParameterFlattened = false;
|
|
687
690
|
if (httpOperation.bodyParam && httpOperation.__raw && httpOperation.bodyParam.type.__raw) {
|
|
688
|
-
this.processParameterBody(codeModelOperation,
|
|
691
|
+
bodyParameterFlattened = this.processParameterBody(codeModelOperation, sdkMethod, httpOperation.bodyParam);
|
|
689
692
|
}
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
this.processEtagHeaderParameters(codeModelOperation, sdkMethod.operation);
|
|
693
|
+
if (generateConvenienceApi) {
|
|
694
|
+
this.processParameterGrouping(codeModelOperation, sdkMethod, bodyParameterFlattened);
|
|
693
695
|
}
|
|
694
696
|
// lro metadata
|
|
695
697
|
let lroMetadata = new LongRunningMetadata(false);
|
|
@@ -717,31 +719,27 @@ export class CodeModelBuilder {
|
|
|
717
719
|
for (const response of responses) {
|
|
718
720
|
const bodyType = response.type;
|
|
719
721
|
if (bodyType && bodyType.kind === "model") {
|
|
720
|
-
const itemClientName = sdkMethod.response.resultPath;
|
|
721
|
-
const nextLinkClientName = sdkMethod.nextLinkPath;
|
|
722
722
|
let itemSerializedName = undefined;
|
|
723
723
|
let nextLinkSerializedName = undefined;
|
|
724
|
+
const itemSegments = sdkMethod.response.resultSegments;
|
|
725
|
+
const nextLinkSegments = sdkMethod.pagingMetadata.nextLinkSegments;
|
|
726
|
+
// TODO: in future the property could be nested, so that the "itemSegments" or "nextLinkSegments" would contain more than 1 element
|
|
727
|
+
if (itemSegments) {
|
|
728
|
+
// "itemsSegments" should exist for "paging"/"lropaging"
|
|
729
|
+
const lastSegment = itemSegments[itemSegments.length - 1];
|
|
730
|
+
if (lastSegment.kind === "property") {
|
|
731
|
+
itemSerializedName = getPropertySerializedName(lastSegment);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
if (nextLinkSegments) {
|
|
735
|
+
const lastSegment = nextLinkSegments[nextLinkSegments.length - 1];
|
|
736
|
+
if (lastSegment.kind === "property") {
|
|
737
|
+
nextLinkSerializedName = getPropertySerializedName(lastSegment);
|
|
738
|
+
}
|
|
739
|
+
}
|
|
724
740
|
(_a = op.responses) === null || _a === void 0 ? void 0 : _a.forEach((r) => {
|
|
725
|
-
var _a;
|
|
726
741
|
if (r instanceof SchemaResponse) {
|
|
727
742
|
this.trackSchemaUsage(r.schema, { usage: [SchemaContext.Paged] });
|
|
728
|
-
// find serializedName for items and nextLink
|
|
729
|
-
if (r.schema instanceof ObjectSchema) {
|
|
730
|
-
(_a = r.schema.properties) === null || _a === void 0 ? void 0 : _a.forEach((p) => {
|
|
731
|
-
if (itemClientName &&
|
|
732
|
-
!itemSerializedName &&
|
|
733
|
-
p.serializedName &&
|
|
734
|
-
p.language.default.name === itemClientName) {
|
|
735
|
-
itemSerializedName = p.serializedName;
|
|
736
|
-
}
|
|
737
|
-
if (nextLinkClientName &&
|
|
738
|
-
!nextLinkSerializedName &&
|
|
739
|
-
p.serializedName &&
|
|
740
|
-
p.language.default.name === nextLinkClientName) {
|
|
741
|
-
nextLinkSerializedName = p.serializedName;
|
|
742
|
-
}
|
|
743
|
-
});
|
|
744
|
-
}
|
|
745
743
|
}
|
|
746
744
|
});
|
|
747
745
|
op.extensions = (_b = op.extensions) !== null && _b !== void 0 ? _b : {};
|
|
@@ -755,7 +753,6 @@ export class CodeModelBuilder {
|
|
|
755
753
|
}
|
|
756
754
|
}
|
|
757
755
|
processLroMetadata(op, sdkMethod) {
|
|
758
|
-
var _a;
|
|
759
756
|
const trackConvenienceApi = Boolean(op.convenienceApi);
|
|
760
757
|
const lroMetadata = sdkMethod.lroMetadata;
|
|
761
758
|
if (lroMetadata && lroMetadata.pollingStep) {
|
|
@@ -799,20 +796,11 @@ export class CodeModelBuilder {
|
|
|
799
796
|
if (useNewPollStrategy &&
|
|
800
797
|
lroMetadata.finalStep &&
|
|
801
798
|
lroMetadata.finalStep.kind === "pollingSuccessProperty" &&
|
|
802
|
-
lroMetadata.finalResponse.
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
if (
|
|
806
|
-
|
|
807
|
-
var _a, _b, _c;
|
|
808
|
-
// TODO: "p.__raw?.name" should be "p.name", after TCGC fix https://github.com/Azure/typespec-azure/issues/2072
|
|
809
|
-
if (!finalResultPropertySerializedName &&
|
|
810
|
-
p.kind === "property" &&
|
|
811
|
-
((_a = p.serializationOptions.json) === null || _a === void 0 ? void 0 : _a.name) &&
|
|
812
|
-
((_b = p.__raw) === null || _b === void 0 ? void 0 : _b.name) === finalResultPropertyClientName) {
|
|
813
|
-
finalResultPropertySerializedName = (_c = p.serializationOptions.json) === null || _c === void 0 ? void 0 : _c.name;
|
|
814
|
-
}
|
|
815
|
-
});
|
|
799
|
+
lroMetadata.finalResponse.resultSegments) {
|
|
800
|
+
// TODO: in future the property could be nested, so that the "resultSegments" would contain more than 1 element
|
|
801
|
+
const lastSegment = lroMetadata.finalResponse.resultSegments[lroMetadata.finalResponse.resultSegments.length - 1];
|
|
802
|
+
if (lastSegment.kind === "property") {
|
|
803
|
+
finalResultPropertySerializedName = getPropertySerializedName(lastSegment);
|
|
816
804
|
}
|
|
817
805
|
}
|
|
818
806
|
}
|
|
@@ -848,7 +836,7 @@ export class CodeModelBuilder {
|
|
|
848
836
|
}
|
|
849
837
|
processParameter(op, param, clientContext) {
|
|
850
838
|
var _a, _b, _c;
|
|
851
|
-
if (clientContext.apiVersions &&
|
|
839
|
+
if (clientContext.apiVersions && param.isApiVersionParam && param.kind !== "cookie") {
|
|
852
840
|
// pre-condition for "isApiVersion": the client supports ApiVersions
|
|
853
841
|
if (this.isArm()) {
|
|
854
842
|
// Currently we assume ARM tsp only have one client and one api-version.
|
|
@@ -861,7 +849,7 @@ export class CodeModelBuilder {
|
|
|
861
849
|
op.addParameter(this._armApiVersionParameter);
|
|
862
850
|
}
|
|
863
851
|
else {
|
|
864
|
-
const parameter =
|
|
852
|
+
const parameter = this.getApiVersionParameter(param);
|
|
865
853
|
op.addParameter(parameter);
|
|
866
854
|
clientContext.addGlobalParameter(parameter);
|
|
867
855
|
}
|
|
@@ -988,6 +976,182 @@ export class CodeModelBuilder {
|
|
|
988
976
|
}
|
|
989
977
|
}
|
|
990
978
|
}
|
|
979
|
+
processParameterGrouping(op, sdkMethod, bodyParameterFlattened) {
|
|
980
|
+
const httpOperation = sdkMethod.operation;
|
|
981
|
+
const methodSignatureOverridden = sdkMethod.decorators.some((it) => it.name === "Azure.ClientGenerator.Core.@override");
|
|
982
|
+
if (methodSignatureOverridden) {
|
|
983
|
+
// limit the effect of "SdkServiceMethod"
|
|
984
|
+
// only process it and its parameters, when the "@override" is defined on the operation
|
|
985
|
+
this.processSdkMethodOverride(op, sdkMethod);
|
|
986
|
+
}
|
|
987
|
+
else if (bodyParameterFlattened) {
|
|
988
|
+
// only do this, if no explicit method override via "@override"
|
|
989
|
+
this.checkGroupingAfterBodyParameterFlatten(op);
|
|
990
|
+
}
|
|
991
|
+
// group ETag header parameters, if exists
|
|
992
|
+
if (this.options["group-etag-headers"]) {
|
|
993
|
+
// TODO: unsure what happens, if the etag headers is already processed by override
|
|
994
|
+
this.processEtagHeaderParameters(op, httpOperation);
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
processSdkMethodOverride(op, sdkMethod) {
|
|
998
|
+
var _a, _b, _c;
|
|
999
|
+
// method be called, only if "op.convenienceApi"
|
|
1000
|
+
let request = (_b = (_a = op.convenienceApi) === null || _a === void 0 ? void 0 : _a.requests) === null || _b === void 0 ? void 0 : _b[0];
|
|
1001
|
+
let requestParameters;
|
|
1002
|
+
if (request) {
|
|
1003
|
+
requestParameters = request.parameters;
|
|
1004
|
+
}
|
|
1005
|
+
else {
|
|
1006
|
+
op.convenienceApi.requests = [];
|
|
1007
|
+
request = new Request({
|
|
1008
|
+
protocol: op.requests[0].protocol,
|
|
1009
|
+
});
|
|
1010
|
+
op.convenienceApi.requests.push(request);
|
|
1011
|
+
requestParameters = op.parameters;
|
|
1012
|
+
}
|
|
1013
|
+
request.parameters = [];
|
|
1014
|
+
request.signatureParameters = [];
|
|
1015
|
+
function findOperationParameter(parameter) {
|
|
1016
|
+
let opParameter;
|
|
1017
|
+
// ignore constant parameter, usually the "accept" and "content-type" header
|
|
1018
|
+
if (parameter.type.kind !== "constant") {
|
|
1019
|
+
if (parameter.kind === "body") {
|
|
1020
|
+
// there should be only 1 body parameter
|
|
1021
|
+
opParameter = requestParameters.find((it) => { var _a; return ((_a = it.protocol.http) === null || _a === void 0 ? void 0 : _a.in) === "body"; });
|
|
1022
|
+
}
|
|
1023
|
+
else if (parameter.kind === "property") {
|
|
1024
|
+
// body property
|
|
1025
|
+
// if body property appears on method signature, it should already be flattened, hence the check on VirtualParameter
|
|
1026
|
+
opParameter = requestParameters.find((it) => it instanceof VirtualParameter &&
|
|
1027
|
+
it.language.default.serializedName === getPropertySerializedName(parameter));
|
|
1028
|
+
}
|
|
1029
|
+
else {
|
|
1030
|
+
// query, path, header
|
|
1031
|
+
opParameter = requestParameters.find((it) => {
|
|
1032
|
+
var _a;
|
|
1033
|
+
return ((_a = it.protocol.http) === null || _a === void 0 ? void 0 : _a.in) === parameter.kind &&
|
|
1034
|
+
it.language.default.serializedName === parameter.serializedName;
|
|
1035
|
+
});
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
return opParameter;
|
|
1039
|
+
}
|
|
1040
|
+
for (const sdkMethodParameter of sdkMethod.parameters) {
|
|
1041
|
+
let httpOperationParameter = getHttpOperationParameter(sdkMethod, sdkMethodParameter);
|
|
1042
|
+
if (httpOperationParameter) {
|
|
1043
|
+
const opParameter = findOperationParameter(httpOperationParameter);
|
|
1044
|
+
if (opParameter) {
|
|
1045
|
+
request.signatureParameters.push(opParameter);
|
|
1046
|
+
request.parameters.push(opParameter);
|
|
1047
|
+
}
|
|
1048
|
+
}
|
|
1049
|
+
else {
|
|
1050
|
+
// sdkMethodParameter is a grouping parameter
|
|
1051
|
+
if (sdkMethodParameter.type.kind === "model") {
|
|
1052
|
+
const opParameters = [];
|
|
1053
|
+
for (const property of sdkMethodParameter.type.properties) {
|
|
1054
|
+
httpOperationParameter = getHttpOperationParameter(sdkMethod, property);
|
|
1055
|
+
if (httpOperationParameter) {
|
|
1056
|
+
const opParameter = findOperationParameter(httpOperationParameter);
|
|
1057
|
+
if (opParameter) {
|
|
1058
|
+
if (opParameter instanceof VirtualParameter) {
|
|
1059
|
+
opParameters.push(opParameter);
|
|
1060
|
+
}
|
|
1061
|
+
else {
|
|
1062
|
+
opParameters.push(opParameter);
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1067
|
+
// group schema
|
|
1068
|
+
const groupSchema = this.processGroupSchema(sdkMethodParameter.type, opParameters, sdkMethodParameter.type.name);
|
|
1069
|
+
this.trackSchemaUsage(groupSchema, { usage: [SchemaContext.Input] });
|
|
1070
|
+
if (op.convenienceApi) {
|
|
1071
|
+
this.trackSchemaUsage(groupSchema, {
|
|
1072
|
+
usage: [op.internalApi ? SchemaContext.Internal : SchemaContext.Public],
|
|
1073
|
+
});
|
|
1074
|
+
}
|
|
1075
|
+
// group parameter
|
|
1076
|
+
const groupParameter = new Parameter(sdkMethodParameter.name, (_c = sdkMethodParameter.doc) !== null && _c !== void 0 ? _c : "", groupSchema, {
|
|
1077
|
+
summary: sdkMethodParameter.summary,
|
|
1078
|
+
implementation: ImplementationLocation.Method,
|
|
1079
|
+
required: !sdkMethodParameter.optional,
|
|
1080
|
+
nullable: false,
|
|
1081
|
+
});
|
|
1082
|
+
request.signatureParameters.push(groupParameter);
|
|
1083
|
+
request.parameters.push(...opParameters);
|
|
1084
|
+
request.parameters.push(groupParameter);
|
|
1085
|
+
opParameters.forEach((it) => {
|
|
1086
|
+
it.groupedBy = groupParameter;
|
|
1087
|
+
});
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
processGroupSchema(type, parameters, name, description = undefined) {
|
|
1093
|
+
// the "GroupSchema" is simliar to "ObjectSchema", but the process is different
|
|
1094
|
+
var _a, _b;
|
|
1095
|
+
if (type && this.schemaCache.has(type)) {
|
|
1096
|
+
return this.schemaCache.get(type);
|
|
1097
|
+
}
|
|
1098
|
+
// option bag schema
|
|
1099
|
+
const optionBagSchema = this.codeModel.schemas.add(new GroupSchema(name, (_b = (_a = type === null || type === void 0 ? void 0 : type.doc) !== null && _a !== void 0 ? _a : description) !== null && _b !== void 0 ? _b : "", {
|
|
1100
|
+
summary: type === null || type === void 0 ? void 0 : type.summary,
|
|
1101
|
+
language: {
|
|
1102
|
+
default: {
|
|
1103
|
+
namespace: type ? getNamespace(type.__raw) : this.namespace,
|
|
1104
|
+
},
|
|
1105
|
+
java: {
|
|
1106
|
+
namespace: this.getJavaNamespace(type),
|
|
1107
|
+
},
|
|
1108
|
+
},
|
|
1109
|
+
}));
|
|
1110
|
+
parameters.forEach((it) => {
|
|
1111
|
+
optionBagSchema.add(new GroupProperty(it.language.default.name, it.language.default.description, it.schema, {
|
|
1112
|
+
originalParameter: [it],
|
|
1113
|
+
summary: it.summary,
|
|
1114
|
+
required: it.required,
|
|
1115
|
+
nullable: it.nullable,
|
|
1116
|
+
readOnly: false,
|
|
1117
|
+
serializedName: it.language.default.serializedName,
|
|
1118
|
+
}));
|
|
1119
|
+
});
|
|
1120
|
+
if (type) {
|
|
1121
|
+
// on cache: the GroupProperty actually has a reference to "originalParameter" (though on same type, the parameter should be identical)
|
|
1122
|
+
this.schemaCache.set(type, optionBagSchema);
|
|
1123
|
+
}
|
|
1124
|
+
return optionBagSchema;
|
|
1125
|
+
}
|
|
1126
|
+
checkGroupingAfterBodyParameterFlatten(op) {
|
|
1127
|
+
var _a, _b;
|
|
1128
|
+
// method be called, only if "op.convenienceApi" is defined
|
|
1129
|
+
// method signature of the convenience API after body parameter flatten
|
|
1130
|
+
const request = (_b = (_a = op.convenienceApi) === null || _a === void 0 ? void 0 : _a.requests) === null || _b === void 0 ? void 0 : _b[0];
|
|
1131
|
+
if (request &&
|
|
1132
|
+
request.signatureParameters &&
|
|
1133
|
+
request.parameters &&
|
|
1134
|
+
request.signatureParameters.length > 6) {
|
|
1135
|
+
// create an option bag
|
|
1136
|
+
const name = op.language.default.name + "Options";
|
|
1137
|
+
const optionBagSchema = this.processGroupSchema(undefined, request.parameters, name, `Options for ${op.language.default.name} API`);
|
|
1138
|
+
this.trackSchemaUsage(optionBagSchema, { usage: [SchemaContext.Input] });
|
|
1139
|
+
if (op.convenienceApi) {
|
|
1140
|
+
this.trackSchemaUsage(optionBagSchema, {
|
|
1141
|
+
usage: [op.internalApi ? SchemaContext.Internal : SchemaContext.Public],
|
|
1142
|
+
});
|
|
1143
|
+
}
|
|
1144
|
+
// option bag parameter
|
|
1145
|
+
const optionBagParameter = new Parameter("options", optionBagSchema.language.default.description, optionBagSchema, {
|
|
1146
|
+
implementation: ImplementationLocation.Method,
|
|
1147
|
+
required: true,
|
|
1148
|
+
nullable: false,
|
|
1149
|
+
});
|
|
1150
|
+
request.signatureParameters = [optionBagParameter];
|
|
1151
|
+
request.parameters.forEach((it) => (it.groupedBy = optionBagParameter));
|
|
1152
|
+
request.parameters.push(optionBagParameter);
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
991
1155
|
processEtagHeaderParameters(op, httpOperation) {
|
|
992
1156
|
if (op.convenienceApi && op.parameters && op.signatureParameters) {
|
|
993
1157
|
const etagHeadersNames = new Set([
|
|
@@ -1090,8 +1254,10 @@ export class CodeModelBuilder {
|
|
|
1090
1254
|
}
|
|
1091
1255
|
}
|
|
1092
1256
|
}
|
|
1093
|
-
processParameterBody(op,
|
|
1257
|
+
processParameterBody(op, sdkMethod, sdkBody) {
|
|
1094
1258
|
var _a, _b, _c;
|
|
1259
|
+
let bodyParameterFlattened = false;
|
|
1260
|
+
const sdkHttpOperation = sdkMethod.operation;
|
|
1095
1261
|
// set contentTypes to mediaTypes
|
|
1096
1262
|
op.requests[0].protocol.http.mediaTypes = sdkBody.contentTypes;
|
|
1097
1263
|
const unknownRequestBody = op.requests[0].protocol.http.mediaTypes &&
|
|
@@ -1133,13 +1299,19 @@ export class CodeModelBuilder {
|
|
|
1133
1299
|
this.trackSchemaUsage(schema, { serializationFormats: [KnownMediaType.Multipart] });
|
|
1134
1300
|
}
|
|
1135
1301
|
if (op.convenienceApi) {
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1302
|
+
/**
|
|
1303
|
+
* Explicit body parameter @body or @bodyRoot would result to the existence of rawHttpOperation.parameters.body.property
|
|
1304
|
+
* Implicit body parameter would result to rawHttpOperation.parameters.body.property be undefined
|
|
1305
|
+
* see https://typespec.io/docs/libraries/http/cheat-sheet#data-types
|
|
1306
|
+
*/
|
|
1307
|
+
/**
|
|
1308
|
+
* In TCGC, the condition is 'sdkType.kind === "model" && sdkBody.type !== sdkBody.correspondingMethodParams[0]?.type'.
|
|
1309
|
+
* Basically, it means that the model of the SDK method parameters (typically, more than 1) be different from the model of this single HTTP body parameter.
|
|
1310
|
+
*/
|
|
1311
|
+
const bodyParameterFlatten = !this.isArm() &&
|
|
1312
|
+
schema instanceof ObjectSchema &&
|
|
1140
1313
|
sdkType.kind === "model" &&
|
|
1141
|
-
|
|
1142
|
-
!this.isArm();
|
|
1314
|
+
sdkBody.type !== ((_c = sdkBody.correspondingMethodParams[0]) === null || _c === void 0 ? void 0 : _c.type);
|
|
1143
1315
|
if (schema instanceof ObjectSchema && bodyParameterFlatten) {
|
|
1144
1316
|
// flatten body parameter
|
|
1145
1317
|
const parameters = sdkHttpOperation.parameters;
|
|
@@ -1153,8 +1325,10 @@ export class CodeModelBuilder {
|
|
|
1153
1325
|
if (sdkType.isGeneratedName) {
|
|
1154
1326
|
schema.language.default.name = pascalCase(op.language.default.name) + "PatchRequest";
|
|
1155
1327
|
}
|
|
1156
|
-
return;
|
|
1328
|
+
return bodyParameterFlattened;
|
|
1157
1329
|
}
|
|
1330
|
+
// flatten body parameter
|
|
1331
|
+
bodyParameterFlattened = true;
|
|
1158
1332
|
const schemaUsage = schema.usage;
|
|
1159
1333
|
if (!schemaIsPublicBeforeProcess && (schemaUsage === null || schemaUsage === void 0 ? void 0 : schemaUsage.includes(SchemaContext.Public))) {
|
|
1160
1334
|
// Public added in this op, change it to PublicSpread
|
|
@@ -1162,72 +1336,30 @@ export class CodeModelBuilder {
|
|
|
1162
1336
|
schemaUsage === null || schemaUsage === void 0 ? void 0 : schemaUsage.splice(schemaUsage === null || schemaUsage === void 0 ? void 0 : schemaUsage.indexOf(SchemaContext.Public), 1);
|
|
1163
1337
|
this.trackSchemaUsage(schema, { usage: [SchemaContext.PublicSpread] });
|
|
1164
1338
|
}
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
if (bodyParameter) {
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
this.addParameterOrBodyPropertyToCodeModelRequest(bodyProperty, op, request, schema, parameter);
|
|
1182
|
-
}
|
|
1339
|
+
op.convenienceApi.requests = [];
|
|
1340
|
+
const request = new Request({
|
|
1341
|
+
protocol: op.requests[0].protocol,
|
|
1342
|
+
});
|
|
1343
|
+
request.parameters = [];
|
|
1344
|
+
op.convenienceApi.requests.push(request);
|
|
1345
|
+
// header/query/path params
|
|
1346
|
+
for (const opParameter of parameters) {
|
|
1347
|
+
this.addParameterOrBodyPropertyToCodeModelRequest(opParameter, op, request, schema, parameter);
|
|
1348
|
+
}
|
|
1349
|
+
// body param
|
|
1350
|
+
if (bodyParameter) {
|
|
1351
|
+
if (bodyParameter.type.kind === "model") {
|
|
1352
|
+
for (const bodyProperty of bodyParameter.type.properties) {
|
|
1353
|
+
if (bodyProperty.kind === "property") {
|
|
1354
|
+
this.addParameterOrBodyPropertyToCodeModelRequest(bodyProperty, op, request, schema, parameter);
|
|
1183
1355
|
}
|
|
1184
1356
|
}
|
|
1185
1357
|
}
|
|
1186
|
-
request.signatureParameters = request.parameters;
|
|
1187
|
-
if (request.signatureParameters.length > 6) {
|
|
1188
|
-
// create an option bag
|
|
1189
|
-
const name = op.language.default.name + "Options";
|
|
1190
|
-
const namespace = getNamespace(rawHttpOperation.operation);
|
|
1191
|
-
// option bag schema
|
|
1192
|
-
const optionBagSchema = this.codeModel.schemas.add(new GroupSchema(name, `Options for ${op.language.default.name} API`, {
|
|
1193
|
-
language: {
|
|
1194
|
-
default: {
|
|
1195
|
-
namespace: namespace,
|
|
1196
|
-
},
|
|
1197
|
-
java: {
|
|
1198
|
-
namespace: this.getJavaNamespace(),
|
|
1199
|
-
},
|
|
1200
|
-
},
|
|
1201
|
-
}));
|
|
1202
|
-
request.parameters.forEach((it) => {
|
|
1203
|
-
optionBagSchema.add(new GroupProperty(it.language.default.name, it.language.default.description, it.schema, {
|
|
1204
|
-
originalParameter: [it],
|
|
1205
|
-
summary: it.summary,
|
|
1206
|
-
required: it.required,
|
|
1207
|
-
nullable: it.nullable,
|
|
1208
|
-
readOnly: false,
|
|
1209
|
-
serializedName: it.language.default.serializedName,
|
|
1210
|
-
}));
|
|
1211
|
-
});
|
|
1212
|
-
this.trackSchemaUsage(optionBagSchema, { usage: [SchemaContext.Input] });
|
|
1213
|
-
if (op.convenienceApi) {
|
|
1214
|
-
this.trackSchemaUsage(optionBagSchema, {
|
|
1215
|
-
usage: [op.internalApi ? SchemaContext.Internal : SchemaContext.Public],
|
|
1216
|
-
});
|
|
1217
|
-
}
|
|
1218
|
-
// option bag parameter
|
|
1219
|
-
const optionBagParameter = new Parameter("options", optionBagSchema.language.default.description, optionBagSchema, {
|
|
1220
|
-
implementation: ImplementationLocation.Method,
|
|
1221
|
-
required: true,
|
|
1222
|
-
nullable: false,
|
|
1223
|
-
});
|
|
1224
|
-
request.signatureParameters = [optionBagParameter];
|
|
1225
|
-
request.parameters.forEach((it) => (it.groupedBy = optionBagParameter));
|
|
1226
|
-
request.parameters.push(optionBagParameter);
|
|
1227
|
-
}
|
|
1228
1358
|
}
|
|
1359
|
+
request.signatureParameters = request.parameters;
|
|
1229
1360
|
}
|
|
1230
1361
|
}
|
|
1362
|
+
return bodyParameterFlattened;
|
|
1231
1363
|
}
|
|
1232
1364
|
addParameterOrBodyPropertyToCodeModelRequest(opParameter, op, request, schema, originalParameter) {
|
|
1233
1365
|
var _a, _b, _c, _d, _e;
|
|
@@ -2092,14 +2224,22 @@ export class CodeModelBuilder {
|
|
|
2092
2224
|
},
|
|
2093
2225
|
});
|
|
2094
2226
|
}
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2227
|
+
getApiVersionParameter(param) {
|
|
2228
|
+
// apiVersionParameter is cached by param.kind
|
|
2229
|
+
// we didn't expect Azure service have more than 1 type of api-version, and certainly not more than 1 of each kind.
|
|
2230
|
+
if (param.kind === "query") {
|
|
2231
|
+
return (this._apiVersionParameter ||
|
|
2232
|
+
(this._apiVersionParameter = this.createApiVersionParameter(param.serializedName, ParameterLocation.Query)));
|
|
2233
|
+
}
|
|
2234
|
+
else if (param.kind === "path") {
|
|
2235
|
+
return (this._apiVersionParameterInPath ||
|
|
2236
|
+
(this._apiVersionParameterInPath = this.createApiVersionParameter(param.serializedName, ParameterLocation.Path)));
|
|
2237
|
+
}
|
|
2238
|
+
else {
|
|
2239
|
+
// param.kind === "header"
|
|
2240
|
+
return (this._apiVersionParameterInHeader ||
|
|
2241
|
+
(this._apiVersionParameterInHeader = this.createApiVersionParameter(param.serializedName, ParameterLocation.Header)));
|
|
2242
|
+
}
|
|
2103
2243
|
}
|
|
2104
2244
|
isSubscriptionId(param) {
|
|
2105
2245
|
return "subscriptionId".toLocaleLowerCase() === param.serializedName.toLocaleLowerCase();
|