@azure-tools/typespec-java 0.15.13 → 0.15.15
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 +10 -1
- package/dist/src/code-model-builder.d.ts.map +1 -1
- package/dist/src/code-model-builder.js +47 -39
- package/dist/src/code-model-builder.js.map +1 -1
- package/dist/src/operation-utils.d.ts +10 -1
- package/dist/src/operation-utils.d.ts.map +1 -1
- package/dist/src/operation-utils.js +37 -10
- package/dist/src/operation-utils.js.map +1 -1
- package/dist/src/type-utils.d.ts +2 -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/package.json +2 -2
- package/target/emitter.jar +0 -0
|
@@ -26,6 +26,15 @@ export declare class CodeModelBuilder {
|
|
|
26
26
|
private deduplicateSchemaName;
|
|
27
27
|
private resolveSchemaUsage;
|
|
28
28
|
private processClients;
|
|
29
|
+
/**
|
|
30
|
+
* Filter api-versions for "ServiceVersion".
|
|
31
|
+
* TODO(xiaofei) pending TCGC design: https://github.com/Azure/typespec-azure/issues/746
|
|
32
|
+
*
|
|
33
|
+
* @param pinnedApiVersion the api-version to use as filter base
|
|
34
|
+
* @param versions api-versions to filter
|
|
35
|
+
* @returns filtered api-versions
|
|
36
|
+
*/
|
|
37
|
+
private getFilteredApiVersions;
|
|
29
38
|
/**
|
|
30
39
|
* `@armProviderNamespace` currently will add a default server if not defined globally:
|
|
31
40
|
* https://github.com/Azure/typespec-azure/blob/8b8d7c05f168d9305a09691c4fedcb88f4a57652/packages/typespec-azure-resource-manager/src/namespace.ts#L121-L128
|
|
@@ -36,11 +45,11 @@ export declare class CodeModelBuilder {
|
|
|
36
45
|
*/
|
|
37
46
|
private isArmSynthesizedServer;
|
|
38
47
|
private needToSkipProcessingOperation;
|
|
39
|
-
private existsAtCurrentVersion;
|
|
40
48
|
/**
|
|
41
49
|
* Whether we support advanced versioning in non-breaking fashion.
|
|
42
50
|
*/
|
|
43
51
|
private supportsAdvancedVersioning;
|
|
52
|
+
private getOperationExample;
|
|
44
53
|
private processOperation;
|
|
45
54
|
private processRouteForPaged;
|
|
46
55
|
private processLroMetadata;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-model-builder.d.ts","sourceRoot":"","sources":["../../src/code-model-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAoBL,OAAO,EAGP,IAAI,EAEJ,KAAK,EASL,WAAW,EAQZ,MAAM,oBAAoB,CAAC;AA6C5B,OAAO,EACL,SAAS,EAGT,YAAY,EACZ,aAAa,EAUb,YAAY,EACZ,YAAY,EACZ,SAAS,EAKT,MAAM,EAIN,YAAY,EAeb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAUnD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAW9C,OAAO,EACL,eAAe,
|
|
1
|
+
{"version":3,"file":"code-model-builder.d.ts","sourceRoot":"","sources":["../../src/code-model-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getDoc, getEffectiveModelType, getFormat, getFriendlyName, getKnownValues, getSummary, getVisibility, ignoreDiagnostics, isArrayModelType, isRecordModelType, isUnknownType, getDiscriminator, isNeverType, listServices, getNamespaceFullName, isNullType, getTypeName, getProjectedName, getEncode, getOverloadedOperation, walkPropertiesInherited, isVoidType, isErrorModel, } from "@typespec/compiler";
|
|
2
2
|
import { getResourceOperation, getSegment } from "@typespec/rest";
|
|
3
3
|
import { getAuthentication, getServers, getStatusCodeDescription, getHttpOperation, getQueryParamOptions, getHeaderFieldOptions, isPathParam, } from "@typespec/http";
|
|
4
|
-
import {
|
|
4
|
+
import { getAddedOnVersions, getVersion } from "@typespec/versioning";
|
|
5
5
|
import { isPollingLocation, getPagedResult, isFixed, getLroMetadata, getUnionAsEnum, } from "@azure-tools/typespec-azure-core";
|
|
6
6
|
import { listClients, listOperationGroups, listOperationsInOperationGroup, isApiVersion, shouldGenerateConvenient, createSdkContext, shouldGenerateProtocol, isInternal, getCrossLanguageDefinitionId, getClientNameOverride, shouldFlattenProperty, getWireName, getDefaultApiVersion, } from "@azure-tools/typespec-client-generator-core";
|
|
7
7
|
import { fail } from "assert";
|
|
@@ -20,7 +20,7 @@ import { PreNamer } from "./prenamer/prenamer.js";
|
|
|
20
20
|
import { createPollOperationDetailsSchema, getFileDetailsSchema } from "./external-schemas.js";
|
|
21
21
|
import { ClientContext } from "./models.js";
|
|
22
22
|
import { stringArrayContainsIgnoreCase, getJavaNamespace, getNamespace, pascalCase, logWarning, trace, } from "./utils.js";
|
|
23
|
-
import { ProcessingCache, isModelReferredInTemplate, pushDistinct, modelContainsDerivedModel, getNameForTemplate, getDurationFormat, hasScalarAsBase, isNullableType, getAccess, getUsage, getUnionDescription, modelIs, getNamePrefixForProperty, isAllValueInteger, } from "./type-utils.js";
|
|
23
|
+
import { ProcessingCache, isModelReferredInTemplate, pushDistinct, modelContainsDerivedModel, getNameForTemplate, getDurationFormat, hasScalarAsBase, isNullableType, getAccess, getUsage, getUnionDescription, modelIs, getNamePrefixForProperty, isAllValueInteger, isStable, } from "./type-utils.js";
|
|
24
24
|
import { getServiceVersion, operationIsJsonMergePatch, isPayloadProperty, ORIGIN_API_VERSION, SPECIAL_HEADER_NAMES, loadExamples, isLroNewPollingStrategy, operationIsMultipleContentTypes, cloneOperationParameter, operationIsMultipart, isKnownContentType, CONTENT_TYPE_KEY, } from "./operation-utils.js";
|
|
25
25
|
import { isArmCommonType } from "./type-utils.js";
|
|
26
26
|
import pkg from "lodash";
|
|
@@ -84,7 +84,7 @@ export class CodeModelBuilder {
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
async build() {
|
|
87
|
-
this.operationExamples = await loadExamples(this.program, this.options);
|
|
87
|
+
this.operationExamples = await loadExamples(this.program, this.options, this.sdkContext);
|
|
88
88
|
if (this.sdkContext.arm) {
|
|
89
89
|
// ARM
|
|
90
90
|
this.codeModel.arm = true;
|
|
@@ -351,12 +351,6 @@ export class CodeModelBuilder {
|
|
|
351
351
|
const versioning = getVersion(this.program, client.service);
|
|
352
352
|
if (versioning && versioning.getVersions()) {
|
|
353
353
|
// @versioned in versioning
|
|
354
|
-
codeModelClient.apiVersions = [];
|
|
355
|
-
for (const version of versioning.getVersions()) {
|
|
356
|
-
const apiVersion = new ApiVersion();
|
|
357
|
-
apiVersion.version = version.value;
|
|
358
|
-
codeModelClient.apiVersions.push(apiVersion);
|
|
359
|
-
}
|
|
360
354
|
if (!this.sdkContext.apiVersion || ["all", "latest"].includes(this.sdkContext.apiVersion)) {
|
|
361
355
|
this.apiVersion = getDefaultApiVersion(this.sdkContext, client.service);
|
|
362
356
|
}
|
|
@@ -366,6 +360,12 @@ export class CodeModelBuilder {
|
|
|
366
360
|
throw new Error("Unrecognized api-version: " + this.sdkContext.apiVersion);
|
|
367
361
|
}
|
|
368
362
|
}
|
|
363
|
+
codeModelClient.apiVersions = [];
|
|
364
|
+
for (const version of this.getFilteredApiVersions(this.apiVersion, versioning.getVersions())) {
|
|
365
|
+
const apiVersion = new ApiVersion();
|
|
366
|
+
apiVersion.version = version.value;
|
|
367
|
+
codeModelClient.apiVersions.push(apiVersion);
|
|
368
|
+
}
|
|
369
369
|
}
|
|
370
370
|
// server
|
|
371
371
|
let baseUri = "{endpoint}";
|
|
@@ -449,6 +449,22 @@ export class CodeModelBuilder {
|
|
|
449
449
|
}
|
|
450
450
|
return clients;
|
|
451
451
|
}
|
|
452
|
+
/**
|
|
453
|
+
* Filter api-versions for "ServiceVersion".
|
|
454
|
+
* TODO(xiaofei) pending TCGC design: https://github.com/Azure/typespec-azure/issues/746
|
|
455
|
+
*
|
|
456
|
+
* @param pinnedApiVersion the api-version to use as filter base
|
|
457
|
+
* @param versions api-versions to filter
|
|
458
|
+
* @returns filtered api-versions
|
|
459
|
+
*/
|
|
460
|
+
getFilteredApiVersions(pinnedApiVersion, versions) {
|
|
461
|
+
if (!pinnedApiVersion) {
|
|
462
|
+
return versions;
|
|
463
|
+
}
|
|
464
|
+
return versions
|
|
465
|
+
.slice(0, versions.indexOf(pinnedApiVersion) + 1)
|
|
466
|
+
.filter((version) => !isStable(pinnedApiVersion) || isStable(version));
|
|
467
|
+
}
|
|
452
468
|
/**
|
|
453
469
|
* `@armProviderNamespace` currently will add a default server if not defined globally:
|
|
454
470
|
* https://github.com/Azure/typespec-azure/blob/8b8d7c05f168d9305a09691c4fedcb88f4a57652/packages/typespec-azure-resource-manager/src/namespace.ts#L121-L128
|
|
@@ -461,9 +477,6 @@ export class CodeModelBuilder {
|
|
|
461
477
|
return this.isArm() && (!server.parameters || server.parameters.size == 0);
|
|
462
478
|
}
|
|
463
479
|
needToSkipProcessingOperation(operation, clientContext) {
|
|
464
|
-
if (!this.existsAtCurrentVersion(operation)) {
|
|
465
|
-
return true;
|
|
466
|
-
}
|
|
467
480
|
// don't generate protocol and convenience method for overloaded operations
|
|
468
481
|
// issue link: https://github.com/Azure/autorest.java/issues/1958#issuecomment-1562558219 we will support generate overload methods for non-union type in future (TODO issue: https://github.com/Azure/autorest.java/issues/2160)
|
|
469
482
|
if (getOverloadedOperation(this.program, operation)) {
|
|
@@ -472,37 +485,37 @@ export class CodeModelBuilder {
|
|
|
472
485
|
}
|
|
473
486
|
return false;
|
|
474
487
|
}
|
|
475
|
-
existsAtCurrentVersion(type) {
|
|
476
|
-
var _a;
|
|
477
|
-
const availabilityMap = getAvailabilityMap(this.program, type);
|
|
478
|
-
// if unversioned then everything exists
|
|
479
|
-
if (!availabilityMap ||
|
|
480
|
-
!this.apiVersion ||
|
|
481
|
-
this.supportsAdvancedVersioning() // if supports non-breaking versioning, then it always exists
|
|
482
|
-
) {
|
|
483
|
-
return true;
|
|
484
|
-
}
|
|
485
|
-
const availability = availabilityMap.get((_a = this.apiVersion) === null || _a === void 0 ? void 0 : _a.name);
|
|
486
|
-
return availability === Availability.Added || availability === Availability.Available;
|
|
487
|
-
}
|
|
488
488
|
/**
|
|
489
489
|
* Whether we support advanced versioning in non-breaking fashion.
|
|
490
490
|
*/
|
|
491
491
|
supportsAdvancedVersioning() {
|
|
492
492
|
return Boolean(this.options["advanced-versioning"]);
|
|
493
493
|
}
|
|
494
|
+
getOperationExample(operation) {
|
|
495
|
+
var _a, _b;
|
|
496
|
+
if (((_a = operation.projectionSource) === null || _a === void 0 ? void 0 : _a.kind) === "Operation") {
|
|
497
|
+
// always use the projectionSource, if available
|
|
498
|
+
operation = operation.projectionSource;
|
|
499
|
+
}
|
|
500
|
+
let operationExample = this.operationExamples.get(operation);
|
|
501
|
+
if (!operationExample && operation.sourceOperation) {
|
|
502
|
+
// if the operation is customized in client.tsp, the operation would be different from that of main.tsp
|
|
503
|
+
// try the operation.sourceOperation
|
|
504
|
+
operation = operation.sourceOperation;
|
|
505
|
+
if (((_b = operation.projectionSource) === null || _b === void 0 ? void 0 : _b.kind) === "Operation") {
|
|
506
|
+
operation = operation.projectionSource;
|
|
507
|
+
}
|
|
508
|
+
operationExample = this.operationExamples.get(operation);
|
|
509
|
+
}
|
|
510
|
+
return operationExample;
|
|
511
|
+
}
|
|
494
512
|
processOperation(groupName, operation, clientContext) {
|
|
495
513
|
var _a, _b, _c;
|
|
496
514
|
const op = ignoreDiagnostics(getHttpOperation(this.program, operation));
|
|
497
515
|
const operationGroup = this.codeModel.getOperationGroup(groupName);
|
|
498
516
|
const operationName = this.getName(operation);
|
|
499
517
|
const opId = groupName ? `${groupName}_${operationName}` : `${operationName}`;
|
|
500
|
-
|
|
501
|
-
if (!operationExample && operation.sourceOperation) {
|
|
502
|
-
// if the operation is customized in client.tsp, the operation would be different from that of main.tsp
|
|
503
|
-
// try the operation.sourceOperation
|
|
504
|
-
operationExample = this.operationExamples.get(operation.sourceOperation);
|
|
505
|
-
}
|
|
518
|
+
const operationExample = this.getOperationExample(operation);
|
|
506
519
|
const codeModelOperation = new CodeModelOperation(operationName, this.getDoc(operation), {
|
|
507
520
|
operationId: opId,
|
|
508
521
|
summary: this.getSummary(operation),
|
|
@@ -572,9 +585,7 @@ export class CodeModelBuilder {
|
|
|
572
585
|
// host
|
|
573
586
|
clientContext.hostParameters.forEach((it) => codeModelOperation.addParameter(it));
|
|
574
587
|
// parameters
|
|
575
|
-
op.parameters.parameters
|
|
576
|
-
.filter((param) => this.existsAtCurrentVersion(param.param))
|
|
577
|
-
.map((it) => this.processParameter(codeModelOperation, it, clientContext));
|
|
588
|
+
op.parameters.parameters.map((it) => this.processParameter(codeModelOperation, it, clientContext));
|
|
578
589
|
// "accept" header
|
|
579
590
|
this.addAcceptHeaderParameter(codeModelOperation, op.responses);
|
|
580
591
|
// body
|
|
@@ -1817,8 +1828,7 @@ export class CodeModelBuilder {
|
|
|
1817
1828
|
for (const prop of type.properties.values()) {
|
|
1818
1829
|
if (prop.name === discriminatorPropertyName || // skip the discriminator property
|
|
1819
1830
|
isNeverType(prop.type) || // skip property of type "never"
|
|
1820
|
-
!isPayloadProperty(this.program, prop)
|
|
1821
|
-
!this.existsAtCurrentVersion(prop)) {
|
|
1831
|
+
!isPayloadProperty(this.program, prop)) {
|
|
1822
1832
|
continue;
|
|
1823
1833
|
}
|
|
1824
1834
|
objectSchema.addProperty(this.processModelProperty(prop));
|
|
@@ -1850,9 +1860,7 @@ export class CodeModelBuilder {
|
|
|
1850
1860
|
const resource = this.dummyObjectSchema(type, resourceModelName, namespace);
|
|
1851
1861
|
const declaredProperties = walkPropertiesInherited(type);
|
|
1852
1862
|
for (const prop of declaredProperties) {
|
|
1853
|
-
|
|
1854
|
-
resource.addProperty(this.processModelProperty(prop));
|
|
1855
|
-
}
|
|
1863
|
+
resource.addProperty(this.processModelProperty(prop));
|
|
1856
1864
|
}
|
|
1857
1865
|
return resource;
|
|
1858
1866
|
}
|