@azure-tools/typespec-java 0.5.1 → 0.6.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 +5 -21
- package/dist/src/code-model-builder.d.ts.map +1 -1
- package/dist/src/code-model-builder.js +52 -167
- package/dist/src/code-model-builder.js.map +1 -1
- package/dist/src/common/schemas/constant.d.ts +26 -0
- package/dist/src/common/schemas/constant.d.ts.map +1 -0
- package/dist/src/common/schemas/constant.js +16 -0
- package/dist/src/common/schemas/constant.js.map +1 -0
- package/dist/src/emitter.d.ts +2 -0
- package/dist/src/emitter.d.ts.map +1 -1
- package/dist/src/emitter.js +3 -1
- package/dist/src/emitter.js.map +1 -1
- package/dist/src/utils.d.ts +44 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +211 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/readme.md +2 -1
- package/target/azure-typespec-extension-jar-with-dependencies.jar +0 -0
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import { Operation, Program, Type, EmitContext } from "@typespec/compiler";
|
|
2
|
-
import { AnySchema,
|
|
2
|
+
import { AnySchema, BooleanSchema, NumberSchema, Parameter, Schema, StringSchema } from "@autorest/codemodel";
|
|
3
3
|
import { CodeModel } from "./common/code-model.js";
|
|
4
4
|
import { Operation as CodeModelOperation } from "./common/operation.js";
|
|
5
5
|
import { EmitterOptions } from "./emitter.js";
|
|
6
|
+
import { ProcessingCache } from "./utils.js";
|
|
6
7
|
export declare class CodeModelBuilder {
|
|
7
8
|
private program;
|
|
8
9
|
private typeNameOptions;
|
|
9
10
|
private namespace;
|
|
10
|
-
private
|
|
11
|
+
private sdkContext;
|
|
11
12
|
private options;
|
|
12
13
|
private codeModel;
|
|
13
14
|
readonly schemaCache: ProcessingCache<Type, Schema>;
|
|
14
15
|
readonly operationCache: Map<Operation, CodeModelOperation>;
|
|
16
|
+
private operationExamples;
|
|
15
17
|
constructor(program1: Program, context: EmitContext<EmitterOptions>);
|
|
16
|
-
build(): CodeModel
|
|
18
|
+
build(): Promise<CodeModel>;
|
|
17
19
|
private processHost;
|
|
18
20
|
private processAuth;
|
|
19
21
|
private processClients;
|
|
@@ -71,8 +73,6 @@ export declare class CodeModelBuilder {
|
|
|
71
73
|
get integerSchema(): NumberSchema;
|
|
72
74
|
private _booleanSchema?;
|
|
73
75
|
get booleanSchema(): BooleanSchema;
|
|
74
|
-
private _binarySchema?;
|
|
75
|
-
get binarySchema(): BinarySchema;
|
|
76
76
|
private _anySchema?;
|
|
77
77
|
get anySchema(): AnySchema;
|
|
78
78
|
private createApiVersionParameter;
|
|
@@ -83,20 +83,4 @@ export declare class CodeModelBuilder {
|
|
|
83
83
|
private propagateSchemaUsage;
|
|
84
84
|
private trackSchemaUsage;
|
|
85
85
|
}
|
|
86
|
-
/** Acts as a cache for processing inputs.
|
|
87
|
-
*
|
|
88
|
-
* If the input is undefined, the output is always undefined.
|
|
89
|
-
* for a given input, the process is only ever called once.
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*/
|
|
93
|
-
declare class ProcessingCache<In, Out> {
|
|
94
|
-
private transform;
|
|
95
|
-
private results;
|
|
96
|
-
constructor(transform: (orig: In, ...args: Array<any>) => Out);
|
|
97
|
-
has(original: In | undefined): boolean;
|
|
98
|
-
set(original: In, result: Out): Out;
|
|
99
|
-
process(original: In | undefined, ...args: Array<any>): Out | undefined;
|
|
100
|
-
}
|
|
101
|
-
export {};
|
|
102
86
|
//# sourceMappingURL=code-model-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-model-builder.d.ts","sourceRoot":"","sources":["../../src/code-model-builder.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"code-model-builder.d.ts","sourceRoot":"","sources":["../../src/code-model-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
import { getDoc, getEffectiveModelType, getFormat, getFriendlyName, getKnownValues, getSummary, getVisibility, ignoreDiagnostics, isArrayModelType, isRecordModelType,
|
|
1
|
+
import { getDoc, getEffectiveModelType, getFormat, getFriendlyName, getKnownValues, getSummary, getVisibility, ignoreDiagnostics, isArrayModelType, isRecordModelType, isUnknownType, getDiscriminator, isNeverType, listServices, getNamespaceFullName, isNullType, NoTarget, getTypeName, getProjectedName, getService, } from "@typespec/compiler";
|
|
2
2
|
import { getResourceOperation, getSegment } from "@typespec/rest";
|
|
3
|
-
import { getAuthentication,
|
|
3
|
+
import { getAuthentication, getServers, getStatusCodeDescription, getHttpOperation, getQueryParamOptions, getHeaderFieldOptions, } from "@typespec/http";
|
|
4
4
|
import { getVersion } from "@typespec/versioning";
|
|
5
5
|
import { isPollingLocation, getPagedResult, getOperationLinks, isFixed } from "@azure-tools/typespec-azure-core";
|
|
6
|
-
import { listClients, listOperationGroups, listOperationsInOperationGroup, isApiVersion, shouldGenerateConvenient,
|
|
6
|
+
import { listClients, listOperationGroups, listOperationsInOperationGroup, isApiVersion, shouldGenerateConvenient, createSdkContext, shouldGenerateProtocol, } from "@azure-tools/typespec-client-generator-core";
|
|
7
7
|
import { fail } from "assert";
|
|
8
|
-
import { AnySchema, ArraySchema, BinaryResponse, BinarySchema, BooleanSchema, ByteArraySchema, ChoiceValue,
|
|
8
|
+
import { AnySchema, ArraySchema, BinaryResponse, BinarySchema, BooleanSchema, ByteArraySchema, ChoiceValue, DateTimeSchema, DateSchema, DictionarySchema, Discriminator, DurationSchema, HttpHeader, HttpParameter, ImplementationLocation, NumberSchema, ObjectSchema, Parameter, ParameterLocation, Property, Relations, Response, SchemaResponse, SchemaType, StringSchema, TimeSchema, Security, OAuth2SecurityScheme, KeySecurityScheme, OperationGroup, UriSchema, VirtualParameter, GroupSchema, GroupProperty, ApiVersion, SerializationStyle, } from "@autorest/codemodel";
|
|
9
9
|
import { CodeModel } from "./common/code-model.js";
|
|
10
|
-
import { Client as CodeModelClient
|
|
10
|
+
import { Client as CodeModelClient } from "./common/client.js";
|
|
11
11
|
import { ConvenienceApi, Operation as CodeModelOperation, OperationLink, Request } from "./common/operation.js";
|
|
12
12
|
import { SchemaContext } from "./common/schemas/usage.js";
|
|
13
13
|
import { ChoiceSchema, SealedChoiceSchema } from "./common/schemas/choice.js";
|
|
14
|
+
import { ConstantSchema, ConstantValue } from "./common/schemas/constant.js";
|
|
14
15
|
import { OrSchema } from "./common/schemas/relationship.js";
|
|
15
16
|
import { PreNamer } from "./prenamer/prenamer.js";
|
|
16
17
|
import { ClientContext, LongRunningMetadata } from "./models.js";
|
|
18
|
+
import { ProcessingCache, stringArrayContainsIgnoreCase, getClientApiVersions, getJavaNamespace, getServiceVersion, isModelReferredInTemplate, operationContainsJsonMergePatch, getNamespace, pushDistinct, isPayloadProperty, modelContainsDerivedModel, pascalCase, getNameForTemplate, originApiVersion, specialHeaderNames, loadExamples, } from "./utils.js";
|
|
17
19
|
import pkg from "lodash";
|
|
18
20
|
const { isEqual } = pkg;
|
|
19
21
|
export class CodeModelBuilder {
|
|
@@ -21,9 +23,10 @@ export class CodeModelBuilder {
|
|
|
21
23
|
var _a;
|
|
22
24
|
this.schemaCache = new ProcessingCache((type, name) => this.processSchemaImpl(type, name));
|
|
23
25
|
this.operationCache = new Map();
|
|
26
|
+
this.operationExamples = new Map();
|
|
24
27
|
this.options = context.options;
|
|
25
28
|
this.program = program1;
|
|
26
|
-
this.
|
|
29
|
+
this.sdkContext = createSdkContext(context);
|
|
27
30
|
const service = listServices(this.program)[0];
|
|
28
31
|
const serviceNamespace = service.type;
|
|
29
32
|
if (serviceNamespace === undefined) {
|
|
@@ -66,8 +69,9 @@ export class CodeModelBuilder {
|
|
|
66
69
|
this.processAuth(auth);
|
|
67
70
|
}
|
|
68
71
|
}
|
|
69
|
-
build() {
|
|
72
|
+
async build() {
|
|
70
73
|
var _a;
|
|
74
|
+
this.operationExamples = await loadExamples(this.program, this.options);
|
|
71
75
|
this.processClients();
|
|
72
76
|
(_a = this.codeModel.schemas.objects) === null || _a === void 0 ? void 0 : _a.forEach((it) => this.propagateSchemaUsage(it));
|
|
73
77
|
if (this.options.namer) {
|
|
@@ -80,7 +84,7 @@ export class CodeModelBuilder {
|
|
|
80
84
|
if (server) {
|
|
81
85
|
server.parameters.forEach((it) => {
|
|
82
86
|
let parameter;
|
|
83
|
-
if (isApiVersion(this.
|
|
87
|
+
if (isApiVersion(this.sdkContext, it)) {
|
|
84
88
|
parameter = this.createApiVersionParameter(it.name, ParameterLocation.Uri);
|
|
85
89
|
}
|
|
86
90
|
else {
|
|
@@ -165,7 +169,7 @@ export class CodeModelBuilder {
|
|
|
165
169
|
}
|
|
166
170
|
processClients() {
|
|
167
171
|
var _a;
|
|
168
|
-
const clients = listClients(this.
|
|
172
|
+
const clients = listClients(this.sdkContext);
|
|
169
173
|
for (const client of clients) {
|
|
170
174
|
const codeModelClient = new CodeModelClient(client.name, this.getDoc(client.type), {
|
|
171
175
|
summary: this.getSummary(client.type),
|
|
@@ -205,8 +209,8 @@ export class CodeModelBuilder {
|
|
|
205
209
|
const hostParameters = this.processHost((servers === null || servers === void 0 ? void 0 : servers.length) === 1 ? servers[0] : undefined);
|
|
206
210
|
codeModelClient.addGlobalParameters(hostParameters);
|
|
207
211
|
const clientContext = new ClientContext(baseUri, hostParameters, codeModelClient.globalParameters);
|
|
208
|
-
const operationGroups = listOperationGroups(this.
|
|
209
|
-
const operationWithoutGroup = listOperationsInOperationGroup(this.
|
|
212
|
+
const operationGroups = listOperationGroups(this.sdkContext, client);
|
|
213
|
+
const operationWithoutGroup = listOperationsInOperationGroup(this.sdkContext, client);
|
|
210
214
|
let codeModelGroup = new OperationGroup("");
|
|
211
215
|
for (const operation of operationWithoutGroup) {
|
|
212
216
|
codeModelGroup.addOperation(this.processOperation("", operation, clientContext));
|
|
@@ -215,7 +219,7 @@ export class CodeModelBuilder {
|
|
|
215
219
|
codeModelClient.operationGroups.push(codeModelGroup);
|
|
216
220
|
}
|
|
217
221
|
for (const operationGroup of operationGroups) {
|
|
218
|
-
const operations = listOperationsInOperationGroup(this.
|
|
222
|
+
const operations = listOperationsInOperationGroup(this.sdkContext, operationGroup);
|
|
219
223
|
codeModelGroup = new OperationGroup(operationGroup.type.name);
|
|
220
224
|
for (const operation of operations) {
|
|
221
225
|
codeModelGroup.addOperation(this.processOperation(operationGroup.type.name, operation, clientContext));
|
|
@@ -260,16 +264,22 @@ export class CodeModelBuilder {
|
|
|
260
264
|
}
|
|
261
265
|
}
|
|
262
266
|
processOperation(groupName, operation, clientContext, fromLinkedOperation = false) {
|
|
263
|
-
var _a;
|
|
267
|
+
var _a, _b, _c;
|
|
264
268
|
const op = ignoreDiagnostics(getHttpOperation(this.program, operation));
|
|
265
269
|
const operationGroup = this.codeModel.getOperationGroup(groupName);
|
|
266
270
|
const operationName = this.getName(operation);
|
|
267
271
|
const opId = groupName ? `${groupName}_${operationName}` : `${operationName}`;
|
|
272
|
+
const operationExample = this.operationExamples.get(operation);
|
|
268
273
|
const codeModelOperation = new CodeModelOperation(operationName, this.getDoc(operation), {
|
|
269
274
|
operationId: opId,
|
|
270
275
|
summary: this.getSummary(operation),
|
|
276
|
+
extensions: {
|
|
277
|
+
"x-ms-examples": operationExample
|
|
278
|
+
? { [(_b = (_a = operationExample.title) !== null && _a !== void 0 ? _a : operationExample.operationId) !== null && _b !== void 0 ? _b : operation.name]: operationExample }
|
|
279
|
+
: undefined,
|
|
280
|
+
},
|
|
271
281
|
});
|
|
272
|
-
if (
|
|
282
|
+
if (!operationContainsJsonMergePatch(op)) {
|
|
273
283
|
// do not generate convenience method for JSON Merge Patch
|
|
274
284
|
const convenienceApiName = this.getConvenienceApiName(operation);
|
|
275
285
|
if (convenienceApiName) {
|
|
@@ -304,7 +314,7 @@ export class CodeModelBuilder {
|
|
|
304
314
|
let bodyType = this.getEffectiveSchemaType(op.parameters.body.type);
|
|
305
315
|
if (bodyType.kind === "Model") {
|
|
306
316
|
// try use resource type as round-trip model
|
|
307
|
-
const resourceType = (
|
|
317
|
+
const resourceType = (_c = getResourceOperation(this.program, operation)) === null || _c === void 0 ? void 0 : _c.resourceType;
|
|
308
318
|
if (resourceType && op.responses && op.responses.length > 0) {
|
|
309
319
|
const resp = op.responses[0];
|
|
310
320
|
if (resp.responses && resp.responses.length > 0 && resp.responses[0].body) {
|
|
@@ -321,7 +331,9 @@ export class CodeModelBuilder {
|
|
|
321
331
|
}
|
|
322
332
|
}
|
|
323
333
|
// linked operations
|
|
324
|
-
const lroMetadata =
|
|
334
|
+
const lroMetadata = fromLinkedOperation
|
|
335
|
+
? new LongRunningMetadata(false)
|
|
336
|
+
: this.processLinkedOperation(codeModelOperation, groupName, operation, clientContext);
|
|
325
337
|
// responses
|
|
326
338
|
const candidateResponseSchema = lroMetadata.pollResultType; // candidate: response body type of pollingOperation
|
|
327
339
|
op.responses.map((it) => this.processResponse(codeModelOperation, it, candidateResponseSchema));
|
|
@@ -330,7 +342,7 @@ export class CodeModelBuilder {
|
|
|
330
342
|
// check for long-running operation
|
|
331
343
|
this.processRouteForLongRunning(codeModelOperation, op.responses, lroMetadata.longRunning);
|
|
332
344
|
// check for generating protocol api or not
|
|
333
|
-
codeModelOperation.generateProtocolApi = shouldGenerateProtocol(this.
|
|
345
|
+
codeModelOperation.generateProtocolApi = shouldGenerateProtocol(this.sdkContext, operation);
|
|
334
346
|
operationGroup.addOperation(codeModelOperation);
|
|
335
347
|
return codeModelOperation;
|
|
336
348
|
}
|
|
@@ -428,7 +440,7 @@ export class CodeModelBuilder {
|
|
|
428
440
|
}
|
|
429
441
|
processParameter(op, param, clientContext) {
|
|
430
442
|
var _a;
|
|
431
|
-
if (isApiVersion(this.
|
|
443
|
+
if (isApiVersion(this.sdkContext, param)) {
|
|
432
444
|
const parameter = param.type === "query" ? this.apiVersionParameter : this.apiVersionParameterInPath;
|
|
433
445
|
op.addParameter(parameter);
|
|
434
446
|
clientContext.addGlobalParameter(parameter);
|
|
@@ -436,15 +448,17 @@ export class CodeModelBuilder {
|
|
|
436
448
|
else if (specialHeaderNames.has(param.name.toLowerCase())) {
|
|
437
449
|
// special headers
|
|
438
450
|
op.specialHeaders = (_a = op.specialHeaders) !== null && _a !== void 0 ? _a : [];
|
|
439
|
-
if (!
|
|
451
|
+
if (!stringArrayContainsIgnoreCase(op.specialHeaders, param.name)) {
|
|
440
452
|
op.specialHeaders.push(param.name);
|
|
441
453
|
}
|
|
442
454
|
}
|
|
443
455
|
else {
|
|
444
456
|
// schema
|
|
445
457
|
let schema;
|
|
446
|
-
if (param.type === "header" &&
|
|
447
|
-
|
|
458
|
+
if (param.type === "header" &&
|
|
459
|
+
param.param.type.kind === "Scalar" &&
|
|
460
|
+
(param.param.type.name === "utcDateTime" || param.param.type.name === "offsetDateTime")) {
|
|
461
|
+
// utcDateTime in header maps to RFC 5322
|
|
448
462
|
schema = this.processDateTimeSchema(param.param.type, param.param.name, true);
|
|
449
463
|
}
|
|
450
464
|
else {
|
|
@@ -553,8 +567,8 @@ export class CodeModelBuilder {
|
|
|
553
567
|
var _a, _b, _c;
|
|
554
568
|
let schema;
|
|
555
569
|
if (body.kind === "ModelProperty" && body.type.kind === "Scalar" && body.type.name === "bytes") {
|
|
556
|
-
//handle
|
|
557
|
-
schema = this.processBinarySchema(body.
|
|
570
|
+
// handle binary request body
|
|
571
|
+
schema = this.processBinarySchema(body.type);
|
|
558
572
|
}
|
|
559
573
|
else {
|
|
560
574
|
schema = this.processSchema(body.kind === "Model" ? body : body.type, body.name);
|
|
@@ -881,7 +895,8 @@ export class CodeModelBuilder {
|
|
|
881
895
|
return this.processTimeSchema(type, nameHint);
|
|
882
896
|
case "plainDate":
|
|
883
897
|
return this.processDateSchema(type, nameHint);
|
|
884
|
-
case "
|
|
898
|
+
case "utcDateTime":
|
|
899
|
+
case "offsetDateTime":
|
|
885
900
|
return this.processDateTimeSchema(type, nameHint, false);
|
|
886
901
|
case "duration":
|
|
887
902
|
return this.processDurationSchema(type, nameHint);
|
|
@@ -928,9 +943,7 @@ export class CodeModelBuilder {
|
|
|
928
943
|
}
|
|
929
944
|
}
|
|
930
945
|
processAnySchema(type, name) {
|
|
931
|
-
return this.
|
|
932
|
-
summary: this.getSummary(type),
|
|
933
|
-
}));
|
|
946
|
+
return this.anySchema;
|
|
934
947
|
}
|
|
935
948
|
processStringSchema(type, name) {
|
|
936
949
|
return this.codeModel.schemas.add(new StringSchema(name, this.getDoc(type), {
|
|
@@ -972,6 +985,10 @@ export class CodeModelBuilder {
|
|
|
972
985
|
this.schemaCache.set(type, dictSchema);
|
|
973
986
|
const elementSchema = this.processSchema(type.indexer.value, name);
|
|
974
987
|
dictSchema.elementType = elementSchema;
|
|
988
|
+
if (type.indexer.value.kind === "Union") {
|
|
989
|
+
dictSchema.nullableItems =
|
|
990
|
+
Array.from(type.indexer.value.variants.values()).findIndex((it) => isNullType(it.type)) >= 0;
|
|
991
|
+
}
|
|
975
992
|
return this.codeModel.schemas.add(dictSchema);
|
|
976
993
|
}
|
|
977
994
|
processChoiceSchema(type, name, sealed) {
|
|
@@ -1274,8 +1291,10 @@ export class CodeModelBuilder {
|
|
|
1274
1291
|
});
|
|
1275
1292
|
return this.codeModel.schemas.add(unionSchema);
|
|
1276
1293
|
}
|
|
1277
|
-
processBinarySchema(
|
|
1278
|
-
return this.codeModel.schemas.add(new BinarySchema(
|
|
1294
|
+
processBinarySchema(type) {
|
|
1295
|
+
return this.codeModel.schemas.add(new BinarySchema(this.getDoc(type), {
|
|
1296
|
+
summary: this.getSummary(type),
|
|
1297
|
+
}));
|
|
1279
1298
|
}
|
|
1280
1299
|
getUnionVariantName(type, option) {
|
|
1281
1300
|
switch (type.kind) {
|
|
@@ -1291,7 +1310,7 @@ export class CodeModelBuilder {
|
|
|
1291
1310
|
else if (scalarName === "bytes") {
|
|
1292
1311
|
name = "ByteArray";
|
|
1293
1312
|
}
|
|
1294
|
-
else if (scalarName === "
|
|
1313
|
+
else if (scalarName === "utcDateTime" || scalarName === "offsetDateTime") {
|
|
1295
1314
|
name = "Time";
|
|
1296
1315
|
}
|
|
1297
1316
|
return pascalCase(name);
|
|
@@ -1420,7 +1439,7 @@ export class CodeModelBuilder {
|
|
|
1420
1439
|
}
|
|
1421
1440
|
getConvenienceApiName(op) {
|
|
1422
1441
|
// check @convenienceMethod
|
|
1423
|
-
if (shouldGenerateConvenient(this.
|
|
1442
|
+
if (shouldGenerateConvenient(this.sdkContext, op)) {
|
|
1424
1443
|
return this.getName(op);
|
|
1425
1444
|
}
|
|
1426
1445
|
else {
|
|
@@ -1448,9 +1467,6 @@ export class CodeModelBuilder {
|
|
|
1448
1467
|
return (this._booleanSchema ||
|
|
1449
1468
|
(this._booleanSchema = this.codeModel.schemas.add(new BooleanSchema("boolean", "simple boolean"))));
|
|
1450
1469
|
}
|
|
1451
|
-
get binarySchema() {
|
|
1452
|
-
return this._binarySchema || (this._binarySchema = this.codeModel.schemas.add(new BinarySchema("binary")));
|
|
1453
|
-
}
|
|
1454
1470
|
get anySchema() {
|
|
1455
1471
|
var _a;
|
|
1456
1472
|
return (_a = this._anySchema) !== null && _a !== void 0 ? _a : (this._anySchema = this.codeModel.schemas.add(new AnySchema("Anything")));
|
|
@@ -1533,7 +1549,8 @@ export class CodeModelBuilder {
|
|
|
1533
1549
|
schema instanceof GroupSchema ||
|
|
1534
1550
|
schema instanceof ChoiceSchema ||
|
|
1535
1551
|
schema instanceof SealedChoiceSchema ||
|
|
1536
|
-
schema instanceof OrSchema
|
|
1552
|
+
schema instanceof OrSchema ||
|
|
1553
|
+
schema instanceof ConstantSchema) {
|
|
1537
1554
|
if (schemaUsage.usage) {
|
|
1538
1555
|
pushDistinct((schema.usage = schema.usage || []), ...schemaUsage.usage);
|
|
1539
1556
|
}
|
|
@@ -1546,136 +1563,4 @@ export class CodeModelBuilder {
|
|
|
1546
1563
|
}
|
|
1547
1564
|
}
|
|
1548
1565
|
}
|
|
1549
|
-
/** Acts as a cache for processing inputs.
|
|
1550
|
-
*
|
|
1551
|
-
* If the input is undefined, the output is always undefined.
|
|
1552
|
-
* for a given input, the process is only ever called once.
|
|
1553
|
-
*
|
|
1554
|
-
*
|
|
1555
|
-
*/
|
|
1556
|
-
class ProcessingCache {
|
|
1557
|
-
constructor(transform) {
|
|
1558
|
-
this.transform = transform;
|
|
1559
|
-
this.results = new Map();
|
|
1560
|
-
}
|
|
1561
|
-
has(original) {
|
|
1562
|
-
return !!original && !!this.results.get(original);
|
|
1563
|
-
}
|
|
1564
|
-
set(original, result) {
|
|
1565
|
-
this.results.set(original, result);
|
|
1566
|
-
return result;
|
|
1567
|
-
}
|
|
1568
|
-
process(original, ...args) {
|
|
1569
|
-
if (original) {
|
|
1570
|
-
const result = this.results.get(original) || this.transform(original, ...args);
|
|
1571
|
-
this.results.set(original, result);
|
|
1572
|
-
return result;
|
|
1573
|
-
}
|
|
1574
|
-
return undefined;
|
|
1575
|
-
}
|
|
1576
|
-
}
|
|
1577
|
-
/** adds only if the item is not in the collection already
|
|
1578
|
-
*
|
|
1579
|
-
* @note While this isn't very efficient, it doesn't disturb the original
|
|
1580
|
-
* collection, so you won't get inadvertent side effects from using Set, etc.
|
|
1581
|
-
*/
|
|
1582
|
-
function pushDistinct(targetArray, ...items) {
|
|
1583
|
-
for (const i of items) {
|
|
1584
|
-
if (!targetArray.includes(i)) {
|
|
1585
|
-
targetArray.push(i);
|
|
1586
|
-
}
|
|
1587
|
-
}
|
|
1588
|
-
return targetArray;
|
|
1589
|
-
}
|
|
1590
|
-
function getNamespace(type) {
|
|
1591
|
-
let namespaceRef = type.namespace;
|
|
1592
|
-
let namespaceStr = undefined;
|
|
1593
|
-
while (namespaceRef && namespaceRef.name.length !== 0) {
|
|
1594
|
-
namespaceStr = namespaceRef.name + (namespaceStr ? "." + namespaceStr : "");
|
|
1595
|
-
namespaceRef = namespaceRef.namespace;
|
|
1596
|
-
}
|
|
1597
|
-
return namespaceStr;
|
|
1598
|
-
}
|
|
1599
|
-
function getJavaNamespace(namespace) {
|
|
1600
|
-
return namespace ? "com." + namespace.toLowerCase() : undefined;
|
|
1601
|
-
}
|
|
1602
|
-
function modelContainsDerivedModel(model) {
|
|
1603
|
-
return !isTemplateDeclaration(model) && !(isTemplateInstance(model) && model.derivedModels.length === 0);
|
|
1604
|
-
}
|
|
1605
|
-
function isModelReferredInTemplate(template, target) {
|
|
1606
|
-
var _a, _b, _c;
|
|
1607
|
-
return (template === target ||
|
|
1608
|
-
((_c = (_b = (_a = template === null || template === void 0 ? void 0 : template.templateMapper) === null || _a === void 0 ? void 0 : _a.args) === null || _b === void 0 ? void 0 : _b.some((it) => it.kind === "Model" || it.kind === "Union" ? isModelReferredInTemplate(it, target) : false)) !== null && _c !== void 0 ? _c : false));
|
|
1609
|
-
}
|
|
1610
|
-
function getNameForTemplate(target) {
|
|
1611
|
-
switch (target.kind) {
|
|
1612
|
-
case "Model": {
|
|
1613
|
-
let name = target.name;
|
|
1614
|
-
if (target.templateMapper && target.templateMapper.args) {
|
|
1615
|
-
name = name + target.templateMapper.args.map((it) => getNameForTemplate(it)).join("");
|
|
1616
|
-
}
|
|
1617
|
-
return name;
|
|
1618
|
-
}
|
|
1619
|
-
case "String":
|
|
1620
|
-
return target.value;
|
|
1621
|
-
default:
|
|
1622
|
-
return "";
|
|
1623
|
-
}
|
|
1624
|
-
}
|
|
1625
|
-
function containsIgnoreCase(stringList, str) {
|
|
1626
|
-
return stringList && str ? stringList.findIndex((s) => s.toLowerCase() === str.toLowerCase()) != -1 : false;
|
|
1627
|
-
}
|
|
1628
|
-
function operationContainsJsonMergePatch(op) {
|
|
1629
|
-
for (const param of op.parameters.parameters) {
|
|
1630
|
-
if (param.type === "header" && param.name.toLowerCase() === "content-type") {
|
|
1631
|
-
if (param.param.type.kind === "String" && param.param.type.value === "application/merge-patch+json") {
|
|
1632
|
-
return true;
|
|
1633
|
-
}
|
|
1634
|
-
}
|
|
1635
|
-
}
|
|
1636
|
-
return false;
|
|
1637
|
-
}
|
|
1638
|
-
function pascalCase(name) {
|
|
1639
|
-
if (name.length > 0) {
|
|
1640
|
-
return name[0].toUpperCase() + name.slice(1);
|
|
1641
|
-
}
|
|
1642
|
-
else {
|
|
1643
|
-
return name;
|
|
1644
|
-
}
|
|
1645
|
-
}
|
|
1646
|
-
function isPayloadProperty(program, property) {
|
|
1647
|
-
const headerInfo = getHeaderFieldName(program, property);
|
|
1648
|
-
const queryInfo = getQueryParamName(program, property);
|
|
1649
|
-
const pathInfo = getPathParamName(program, property);
|
|
1650
|
-
const statusCodeInfo = isStatusCode(program, property);
|
|
1651
|
-
return !(headerInfo || queryInfo || pathInfo || statusCodeInfo);
|
|
1652
|
-
}
|
|
1653
|
-
function getClientApiVersions(client) {
|
|
1654
|
-
var _a;
|
|
1655
|
-
if ((_a = client.globalParameters) === null || _a === void 0 ? void 0 : _a.find((it) => it.origin === originApiVersion)) {
|
|
1656
|
-
return client.apiVersions;
|
|
1657
|
-
}
|
|
1658
|
-
else {
|
|
1659
|
-
return undefined;
|
|
1660
|
-
}
|
|
1661
|
-
}
|
|
1662
|
-
function getServiceVersion(client) {
|
|
1663
|
-
let name = client.language.default.name;
|
|
1664
|
-
let description = name;
|
|
1665
|
-
if (name.endsWith("Client")) {
|
|
1666
|
-
name = name.substring(0, name.length - "Client".length);
|
|
1667
|
-
}
|
|
1668
|
-
else {
|
|
1669
|
-
description = description + "Client";
|
|
1670
|
-
}
|
|
1671
|
-
if (name.endsWith("Service")) {
|
|
1672
|
-
name = name + "Version";
|
|
1673
|
-
}
|
|
1674
|
-
else {
|
|
1675
|
-
name = name + "ServiceVersion";
|
|
1676
|
-
}
|
|
1677
|
-
return new ServiceVersion(name, description);
|
|
1678
|
-
}
|
|
1679
|
-
const specialHeaderNames = new Set(["repeatability-request-id", "repeatability-first-sent"]);
|
|
1680
|
-
const originApiVersion = "modelerfour:synthesized/api-version";
|
|
1681
1566
|
//# sourceMappingURL=code-model-builder.js.map
|