@azure-tools/typespec-java 0.26.0 → 0.27.0
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 +1 -0
- package/dist/src/code-model-builder.d.ts.map +1 -1
- package/dist/src/code-model-builder.js +63 -38
- 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 -12
- package/dist/src/emitter.js.map +1 -1
- package/dist/src/operation-utils.d.ts +1 -1
- package/dist/src/operation-utils.d.ts.map +1 -1
- package/dist/src/operation-utils.js +4 -9
- package/dist/src/operation-utils.js.map +1 -1
- package/dist/src/utils.d.ts +1 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +9 -0
- package/dist/src/utils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/generator/http-client-generator/target/emitter.jar +0 -0
- package/package.json +31 -31
- package/readme.md +1 -1
|
@@ -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,EAEZ,SAAS,EAKT,MAAM,EAMN,YAAY,EAKb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,
|
|
1
|
+
{"version":3,"file":"code-model-builder.d.ts","sourceRoot":"","sources":["../../src/code-model-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
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
3
|
import { createSdkContext, getAllModels, getWireName, isApiVersion, isSdkBuiltInKind, isSdkIntKind, } from "@azure-tools/typespec-client-generator-core";
|
|
4
|
-
import { getDoc, getEffectiveModelType, getNamespaceFullName, getOverloadedOperation, getSummary,
|
|
5
|
-
import { Visibility, getAuthentication, getHeaderFieldName, getPathParamName, getQueryParamName, isHeader, isPathParam, isQueryParam, } from "@typespec/http";
|
|
4
|
+
import { getDoc, getEffectiveModelType, getNamespaceFullName, getOverloadedOperation, getSummary, isArrayModelType, isRecordModelType, listServices, } from "@typespec/compiler";
|
|
5
|
+
import { Visibility, getAuthentication, getHeaderFieldName, getPathParamName, getQueryParamName, isCookieParam, isHeader, isPathParam, isQueryParam, } from "@typespec/http";
|
|
6
6
|
import { getSegment } from "@typespec/rest";
|
|
7
7
|
import { getAddedOnVersions } from "@typespec/versioning";
|
|
8
8
|
import { fail } from "assert";
|
|
@@ -20,13 +20,11 @@ import { createPollOperationDetailsSchema, getFileDetailsSchema } from "./extern
|
|
|
20
20
|
import { ClientContext } from "./models.js";
|
|
21
21
|
import { CONTENT_TYPE_KEY, ORIGIN_API_VERSION, SPECIAL_HEADER_NAMES, cloneOperationParameter, getServiceVersion, isKnownContentType, isLroNewPollingStrategy, isPayloadProperty, operationIsJsonMergePatch, operationIsMultipart, operationIsMultipleContentTypes, } from "./operation-utils.js";
|
|
22
22
|
import { ProcessingCache, getAccess, getDurationFormat, getNonNullSdkType, getUnionDescription, getUsage, isStable, modelIs, pushDistinct, } from "./type-utils.js";
|
|
23
|
-
import { getNamespace, logWarning, pascalCase, removeClientSuffix, stringArrayContainsIgnoreCase, trace, } from "./utils.js";
|
|
23
|
+
import { getNamespace, logError, logWarning, pascalCase, removeClientSuffix, stringArrayContainsIgnoreCase, trace, } from "./utils.js";
|
|
24
24
|
const { isEqual } = pkg;
|
|
25
25
|
export class CodeModelBuilder {
|
|
26
26
|
constructor(program1, context) {
|
|
27
27
|
var _a, _b;
|
|
28
|
-
this.baseJavaNamespace = ""; // it will be set at the start of "build" function
|
|
29
|
-
this.legacyJavaNamespace = false; // backward-compatible mode, that emitter ignores clientNamespace from TCGC
|
|
30
28
|
this.loggingEnabled = false;
|
|
31
29
|
this.schemaCache = new ProcessingCache((type, name) => this.processSchemaImpl(type, name));
|
|
32
30
|
this.typeUnionRefCache = new Map(); // Union means it ref a Union type, null means it does not ref any Union, undefined means type visited but not completed
|
|
@@ -41,7 +39,7 @@ export class CodeModelBuilder {
|
|
|
41
39
|
}
|
|
42
40
|
const service = listServices(this.program)[0];
|
|
43
41
|
if (!service) {
|
|
44
|
-
|
|
42
|
+
this.logError("TypeSpec for HTTP must define a service.");
|
|
45
43
|
}
|
|
46
44
|
this.serviceNamespace = service.type;
|
|
47
45
|
this.namespace = getNamespaceFullName(this.serviceNamespace) || "Azure.Client";
|
|
@@ -161,10 +159,15 @@ export class CodeModelBuilder {
|
|
|
161
159
|
break;
|
|
162
160
|
case "apiKey":
|
|
163
161
|
{
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
162
|
+
if (scheme.in === "header") {
|
|
163
|
+
const keyScheme = new KeySecurityScheme({
|
|
164
|
+
name: scheme.name,
|
|
165
|
+
});
|
|
166
|
+
securitySchemes.push(keyScheme);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
this.logWarning(`ApiKey auth is currently only supported for ApiKeyLocation.header.`);
|
|
170
|
+
}
|
|
168
171
|
}
|
|
169
172
|
break;
|
|
170
173
|
case "http":
|
|
@@ -175,7 +178,7 @@ export class CodeModelBuilder {
|
|
|
175
178
|
schemeOrApiKeyPrefix = pascalCase(schemeOrApiKeyPrefix);
|
|
176
179
|
if (this.isBranded()) {
|
|
177
180
|
// Azure would not allow BasicAuth or BearerAuth
|
|
178
|
-
this.logWarning(
|
|
181
|
+
this.logWarning(`HTTP auth with ${scheme.scheme} scheme is not supported for Azure.`);
|
|
179
182
|
continue;
|
|
180
183
|
}
|
|
181
184
|
}
|
|
@@ -196,7 +199,8 @@ export class CodeModelBuilder {
|
|
|
196
199
|
}
|
|
197
200
|
}
|
|
198
201
|
isBranded() {
|
|
199
|
-
|
|
202
|
+
var _a;
|
|
203
|
+
return ((_a = this.options["flavor"]) === null || _a === void 0 ? void 0 : _a.toLocaleLowerCase()) === "azure";
|
|
200
204
|
}
|
|
201
205
|
processModels() {
|
|
202
206
|
const processedSdkModels = new Set();
|
|
@@ -345,7 +349,7 @@ export class CodeModelBuilder {
|
|
|
345
349
|
else {
|
|
346
350
|
this.apiVersion = versions.find((it) => it === this.sdkContext.apiVersion);
|
|
347
351
|
if (!this.apiVersion) {
|
|
348
|
-
|
|
352
|
+
this.logError("Unrecognized api-version: " + this.sdkContext.apiVersion);
|
|
349
353
|
}
|
|
350
354
|
}
|
|
351
355
|
codeModelClient.apiVersions = [];
|
|
@@ -372,7 +376,7 @@ export class CodeModelBuilder {
|
|
|
372
376
|
}
|
|
373
377
|
}
|
|
374
378
|
else if (initializationProperty.type.variantTypes.length > 2) {
|
|
375
|
-
|
|
379
|
+
this.logError("Multiple server url defined for one client is not supported yet.");
|
|
376
380
|
}
|
|
377
381
|
}
|
|
378
382
|
else if (initializationProperty.type.kind === "endpoint") {
|
|
@@ -606,6 +610,11 @@ export class CodeModelBuilder {
|
|
|
606
610
|
clientContext.hostParameters.forEach((it) => codeModelOperation.addParameter(it));
|
|
607
611
|
// path/query/header parameters
|
|
608
612
|
for (const param of httpOperation.parameters) {
|
|
613
|
+
// TODO, switch to TCGC param.kind=="cookie"
|
|
614
|
+
if (param.__raw && isCookieParam(this.program, param.__raw)) {
|
|
615
|
+
// ignore cookie parameter
|
|
616
|
+
continue;
|
|
617
|
+
}
|
|
609
618
|
// if it's paged operation with request body, skip content-type header added by TCGC, as next link call should not have content type header
|
|
610
619
|
if ((sdkMethod.kind === "paging" || sdkMethod.kind === "lropaging") &&
|
|
611
620
|
httpOperation.bodyParam &&
|
|
@@ -653,25 +662,27 @@ export class CodeModelBuilder {
|
|
|
653
662
|
}
|
|
654
663
|
processRouteForPaged(op, responses, sdkMethod) {
|
|
655
664
|
var _a, _b;
|
|
665
|
+
if (!this.isBranded()) {
|
|
666
|
+
// TODO: currently unbranded does not support paged operation
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
656
669
|
if (sdkMethod.kind === "paging" || sdkMethod.kind === "lropaging") {
|
|
657
670
|
for (const response of responses) {
|
|
658
671
|
const bodyType = response.type;
|
|
659
672
|
if (bodyType && bodyType.kind === "model") {
|
|
660
673
|
const itemName = sdkMethod.response.resultPath;
|
|
661
674
|
const nextLinkName = sdkMethod.nextLinkPath;
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
(
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
break;
|
|
674
|
-
}
|
|
675
|
+
op.extensions = (_a = op.extensions) !== null && _a !== void 0 ? _a : {};
|
|
676
|
+
op.extensions["x-ms-pageable"] = {
|
|
677
|
+
itemName: itemName,
|
|
678
|
+
nextLinkName: nextLinkName,
|
|
679
|
+
};
|
|
680
|
+
(_b = op.responses) === null || _b === void 0 ? void 0 : _b.forEach((r) => {
|
|
681
|
+
if (r instanceof SchemaResponse) {
|
|
682
|
+
this.trackSchemaUsage(r.schema, { usage: [SchemaContext.Paged] });
|
|
683
|
+
}
|
|
684
|
+
});
|
|
685
|
+
break;
|
|
675
686
|
}
|
|
676
687
|
}
|
|
677
688
|
}
|
|
@@ -1279,6 +1290,11 @@ export class CodeModelBuilder {
|
|
|
1279
1290
|
op.addException(response);
|
|
1280
1291
|
if (response instanceof SchemaResponse) {
|
|
1281
1292
|
this.trackSchemaUsage(response.schema, { usage: [SchemaContext.Exception] });
|
|
1293
|
+
if (trackConvenienceApi && !this.isBranded()) {
|
|
1294
|
+
this.trackSchemaUsage(response.schema, {
|
|
1295
|
+
usage: [op.internalApi ? SchemaContext.Internal : SchemaContext.Public],
|
|
1296
|
+
});
|
|
1297
|
+
}
|
|
1282
1298
|
}
|
|
1283
1299
|
}
|
|
1284
1300
|
else {
|
|
@@ -1344,7 +1360,9 @@ export class CodeModelBuilder {
|
|
|
1344
1360
|
}
|
|
1345
1361
|
}
|
|
1346
1362
|
}
|
|
1347
|
-
|
|
1363
|
+
const errorMsg = `Unrecognized type: '${type.kind}'.`;
|
|
1364
|
+
this.logError(errorMsg);
|
|
1365
|
+
throw new Error(errorMsg);
|
|
1348
1366
|
}
|
|
1349
1367
|
processBuiltInType(type, nameHint) {
|
|
1350
1368
|
nameHint = nameHint || type.kind;
|
|
@@ -1690,7 +1708,7 @@ export class CodeModelBuilder {
|
|
|
1690
1708
|
processUnionSchema(type, name) {
|
|
1691
1709
|
var _a, _b;
|
|
1692
1710
|
if (!(type.__raw && type.__raw.kind === "Union")) {
|
|
1693
|
-
|
|
1711
|
+
this.logError(`Invalid type for union: '${type.kind}'.`);
|
|
1694
1712
|
}
|
|
1695
1713
|
const rawUnionType = type.__raw;
|
|
1696
1714
|
const namespace = getNamespace(rawUnionType);
|
|
@@ -1736,7 +1754,8 @@ export class CodeModelBuilder {
|
|
|
1736
1754
|
getUnionVariantName(type, option) {
|
|
1737
1755
|
var _a, _b;
|
|
1738
1756
|
if (type === undefined) {
|
|
1739
|
-
|
|
1757
|
+
this.logError("type is undefined.");
|
|
1758
|
+
return "UnionVariant";
|
|
1740
1759
|
}
|
|
1741
1760
|
switch (type.kind) {
|
|
1742
1761
|
case "Scalar": {
|
|
@@ -1793,7 +1812,8 @@ export class CodeModelBuilder {
|
|
|
1793
1812
|
case "UnionVariant":
|
|
1794
1813
|
return (_b = (typeof type.name === "string" ? type.name : undefined)) !== null && _b !== void 0 ? _b : "UnionVariant";
|
|
1795
1814
|
default:
|
|
1796
|
-
|
|
1815
|
+
this.logError(`Unrecognized type for union variable: '${type.kind}'.`);
|
|
1816
|
+
return "UnionVariant";
|
|
1797
1817
|
}
|
|
1798
1818
|
}
|
|
1799
1819
|
processMultipartFormDataFilePropertySchema(property) {
|
|
@@ -1817,7 +1837,9 @@ export class CodeModelBuilder {
|
|
|
1817
1837
|
});
|
|
1818
1838
|
}
|
|
1819
1839
|
else {
|
|
1820
|
-
|
|
1840
|
+
const errorMsg = `Invalid type for multipart form data: '${property.type.kind}'.`;
|
|
1841
|
+
this.logError(errorMsg);
|
|
1842
|
+
throw new Error(errorMsg);
|
|
1821
1843
|
}
|
|
1822
1844
|
}
|
|
1823
1845
|
getDoc(target) {
|
|
@@ -1847,13 +1869,13 @@ export class CodeModelBuilder {
|
|
|
1847
1869
|
return true;
|
|
1848
1870
|
}
|
|
1849
1871
|
else {
|
|
1850
|
-
const visibility = target.
|
|
1872
|
+
const visibility = target.kind === "property" ? target.visibility : undefined;
|
|
1851
1873
|
if (visibility) {
|
|
1852
|
-
return (!visibility.includes(
|
|
1853
|
-
!visibility.includes(
|
|
1854
|
-
!visibility.includes(
|
|
1855
|
-
!visibility.includes(
|
|
1856
|
-
!visibility.includes(
|
|
1874
|
+
return (!visibility.includes(Visibility.All) &&
|
|
1875
|
+
!visibility.includes(Visibility.Create) &&
|
|
1876
|
+
!visibility.includes(Visibility.Update) &&
|
|
1877
|
+
!visibility.includes(Visibility.Delete) &&
|
|
1878
|
+
!visibility.includes(Visibility.Query));
|
|
1857
1879
|
}
|
|
1858
1880
|
else {
|
|
1859
1881
|
return false;
|
|
@@ -1950,6 +1972,9 @@ export class CodeModelBuilder {
|
|
|
1950
1972
|
return clientNamespace.toLowerCase();
|
|
1951
1973
|
}
|
|
1952
1974
|
}
|
|
1975
|
+
logError(msg) {
|
|
1976
|
+
logError(this.program, msg);
|
|
1977
|
+
}
|
|
1953
1978
|
logWarning(msg) {
|
|
1954
1979
|
if (this.loggingEnabled) {
|
|
1955
1980
|
logWarning(this.program, msg);
|