@autorest/typescript 6.0.0-beta.15 → 6.0.0-beta.16
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/CHANGELOG.md +5 -0
- package/README.md +37 -3
- package/dist/src/autorestSession.d.ts +8 -3
- package/dist/src/autorestSession.d.ts.map +1 -1
- package/dist/src/autorestSession.js +3 -9
- package/dist/src/autorestSession.js.map +1 -1
- package/dist/src/conflictResolver.d.ts.map +1 -1
- package/dist/src/conflictResolver.js.map +1 -1
- package/dist/src/generators/clientFileGenerator.d.ts.map +1 -1
- package/dist/src/generators/clientFileGenerator.js +181 -31
- package/dist/src/generators/clientFileGenerator.js.map +1 -1
- package/dist/src/generators/indexGenerator.d.ts.map +1 -1
- package/dist/src/generators/indexGenerator.js +70 -9
- package/dist/src/generators/indexGenerator.js.map +1 -1
- package/dist/src/generators/modelsGenerator.d.ts.map +1 -1
- package/dist/src/generators/modelsGenerator.js +20 -2
- package/dist/src/generators/modelsGenerator.js.map +1 -1
- package/dist/src/generators/operationGenerator.js +6 -6
- package/dist/src/generators/operationGenerator.js.map +1 -1
- package/dist/src/generators/samples/sampleEnv.hbs +4 -0
- package/dist/src/generators/samples/sampleEnvGenerator.d.ts +3 -0
- package/dist/src/generators/samples/sampleEnvGenerator.d.ts.map +1 -0
- package/dist/src/generators/samples/sampleEnvGenerator.js +17 -0
- package/dist/src/generators/samples/sampleEnvGenerator.js.map +1 -0
- package/dist/src/generators/samples/sampleGenerator.d.ts +13 -0
- package/dist/src/generators/samples/sampleGenerator.d.ts.map +1 -0
- package/dist/src/generators/samples/sampleGenerator.js +43 -0
- package/dist/src/generators/samples/sampleGenerator.js.map +1 -0
- package/dist/src/generators/static/README.md.hbs +19 -0
- package/dist/src/generators/static/karma.conf.js.hbs +141 -0
- package/dist/src/generators/static/karmaConfigFileGenerator.d.ts +3 -0
- package/dist/src/generators/static/karmaConfigFileGenerator.d.ts.map +1 -0
- package/dist/src/generators/static/karmaConfigFileGenerator.js +23 -0
- package/dist/src/generators/static/karmaConfigFileGenerator.js.map +1 -0
- package/dist/src/generators/static/packageFileGenerator.d.ts.map +1 -1
- package/dist/src/generators/static/packageFileGenerator.js +90 -14
- package/dist/src/generators/static/packageFileGenerator.js.map +1 -1
- package/dist/src/generators/static/rollupConfigFileGenerator.d.ts.map +1 -1
- package/dist/src/generators/static/rollupConfigFileGenerator.js +7 -70
- package/dist/src/generators/static/rollupConfigFileGenerator.js.map +1 -1
- package/dist/src/generators/static/samples.ts.hbs +49 -0
- package/dist/src/generators/static/tsConfigFileGenerator.d.ts.map +1 -1
- package/dist/src/generators/static/tsConfigFileGenerator.js +9 -10
- package/dist/src/generators/static/tsConfigFileGenerator.js.map +1 -1
- package/dist/src/generators/test/envBrowserFileGenerator.d.ts +3 -0
- package/dist/src/generators/test/envBrowserFileGenerator.d.ts.map +1 -0
- package/dist/src/generators/test/envBrowserFileGenerator.js +15 -0
- package/dist/src/generators/test/envBrowserFileGenerator.js.map +1 -0
- package/dist/src/generators/test/envFileGenerator.d.ts +3 -0
- package/dist/src/generators/test/envFileGenerator.d.ts.map +1 -0
- package/dist/src/generators/test/envFileGenerator.js +23 -0
- package/dist/src/generators/test/envFileGenerator.js.map +1 -0
- package/dist/src/generators/test/recordedClientFileGenerator.d.ts +3 -0
- package/dist/src/generators/test/recordedClientFileGenerator.d.ts.map +1 -0
- package/dist/src/generators/test/recordedClientFileGenerator.js +23 -0
- package/dist/src/generators/test/recordedClientFileGenerator.js.map +1 -0
- package/dist/src/generators/test/rlcEnv.ts.hbs +3 -0
- package/dist/src/generators/test/rlcRecordedClient.ts.hbs +35 -0
- package/dist/src/generators/test/rlcSampleTest.spec.ts.hbs +19 -0
- package/dist/src/generators/{static → test}/sampleTest.ts.hbs +0 -0
- package/dist/src/generators/test/sampleTestGenerator.d.ts.map +1 -1
- package/dist/src/generators/test/sampleTestGenerator.js +23 -7
- package/dist/src/generators/test/sampleTestGenerator.js.map +1 -1
- package/dist/src/generators/utils/pagingOperations.d.ts +5 -0
- package/dist/src/generators/utils/pagingOperations.d.ts.map +1 -1
- package/dist/src/generators/utils/pagingOperations.js +2 -1
- package/dist/src/generators/utils/pagingOperations.js.map +1 -1
- package/dist/src/main.d.ts +2 -2
- package/dist/src/main.d.ts.map +1 -1
- package/dist/src/main.js +3 -3
- package/dist/src/main.js.map +1 -1
- package/dist/src/models/clientDetails.d.ts +3 -0
- package/dist/src/models/clientDetails.d.ts.map +1 -1
- package/dist/src/models/modelDetails.d.ts +2 -2
- package/dist/src/models/modelDetails.d.ts.map +1 -1
- package/dist/src/models/operationDetails.d.ts +1 -0
- package/dist/src/models/operationDetails.d.ts.map +1 -1
- package/dist/src/models/sampleDetails.d.ts +22 -0
- package/dist/src/models/sampleDetails.d.ts.map +1 -0
- package/dist/src/models/sampleDetails.js +3 -0
- package/dist/src/models/sampleDetails.js.map +1 -0
- package/dist/src/restLevelClient/generateClient.d.ts +1 -1
- package/dist/src/restLevelClient/generateClient.d.ts.map +1 -1
- package/dist/src/restLevelClient/generateClient.js +48 -164
- package/dist/src/restLevelClient/generateClient.js.map +1 -1
- package/dist/src/restLevelClient/generateClientDefinition.d.ts +6 -0
- package/dist/src/restLevelClient/generateClientDefinition.d.ts.map +1 -0
- package/dist/src/restLevelClient/generateClientDefinition.js +231 -0
- package/dist/src/restLevelClient/generateClientDefinition.js.map +1 -0
- package/dist/src/restLevelClient/generateMethodShortcuts.d.ts +8 -0
- package/dist/src/restLevelClient/generateMethodShortcuts.d.ts.map +1 -0
- package/dist/src/restLevelClient/generateMethodShortcuts.js +70 -0
- package/dist/src/restLevelClient/generateMethodShortcuts.js.map +1 -0
- package/dist/src/restLevelClient/generateObjectTypes.d.ts.map +1 -1
- package/dist/src/restLevelClient/generateObjectTypes.js.map +1 -1
- package/dist/src/restLevelClient/generatePagingHelper.d.ts.map +1 -1
- package/dist/src/restLevelClient/generatePagingHelper.js +2 -1
- package/dist/src/restLevelClient/generatePagingHelper.js.map +1 -1
- package/dist/src/restLevelClient/generateParameterTypes.d.ts.map +1 -1
- package/dist/src/restLevelClient/generateParameterTypes.js +104 -18
- package/dist/src/restLevelClient/generateParameterTypes.js.map +1 -1
- package/dist/src/restLevelClient/generatePollingHelper.d.ts.map +1 -1
- package/dist/src/restLevelClient/generatePollingHelper.js +3 -1
- package/dist/src/restLevelClient/generatePollingHelper.js.map +1 -1
- package/dist/src/restLevelClient/generateResponseTypes.d.ts.map +1 -1
- package/dist/src/restLevelClient/generateResponseTypes.js +4 -1
- package/dist/src/restLevelClient/generateResponseTypes.js.map +1 -1
- package/dist/src/restLevelClient/generateRestLevel.d.ts.map +1 -1
- package/dist/src/restLevelClient/generateRestLevel.js +19 -3
- package/dist/src/restLevelClient/generateRestLevel.js.map +1 -1
- package/dist/src/restLevelClient/generateSchemaTypes.d.ts.map +1 -1
- package/dist/src/restLevelClient/generateSchemaTypes.js +5 -2
- package/dist/src/restLevelClient/generateSchemaTypes.js.map +1 -1
- package/dist/src/restLevelClient/generateTopLevelIndexFile.d.ts +4 -0
- package/dist/src/restLevelClient/generateTopLevelIndexFile.d.ts.map +1 -0
- package/dist/src/restLevelClient/generateTopLevelIndexFile.js +41 -0
- package/dist/src/restLevelClient/generateTopLevelIndexFile.js.map +1 -0
- package/dist/src/restLevelClient/helpers/operationHelpers.d.ts +10 -0
- package/dist/src/restLevelClient/helpers/operationHelpers.d.ts.map +1 -0
- package/dist/src/restLevelClient/helpers/operationHelpers.js +64 -0
- package/dist/src/restLevelClient/helpers/operationHelpers.js.map +1 -0
- package/dist/src/restLevelClient/interfaces.d.ts +24 -0
- package/dist/src/restLevelClient/interfaces.d.ts.map +1 -0
- package/dist/src/restLevelClient/interfaces.js +3 -0
- package/dist/src/restLevelClient/interfaces.js.map +1 -0
- package/dist/src/restLevelClient/operationHelpers.d.ts.map +1 -1
- package/dist/src/restLevelClient/operationHelpers.js +4 -1
- package/dist/src/restLevelClient/operationHelpers.js.map +1 -1
- package/dist/src/restLevelClient/schemaHelpers.d.ts.map +1 -1
- package/dist/src/restLevelClient/schemaHelpers.js +4 -1
- package/dist/src/restLevelClient/schemaHelpers.js.map +1 -1
- package/dist/src/transforms/operationTransforms.d.ts.map +1 -1
- package/dist/src/transforms/operationTransforms.js +1 -0
- package/dist/src/transforms/operationTransforms.js.map +1 -1
- package/dist/src/transforms/samplesTransforms.d.ts +7 -0
- package/dist/src/transforms/samplesTransforms.d.ts.map +1 -0
- package/dist/src/transforms/samplesTransforms.js +283 -0
- package/dist/src/transforms/samplesTransforms.js.map +1 -0
- package/dist/src/transforms/transforms.d.ts +1 -2
- package/dist/src/transforms/transforms.d.ts.map +1 -1
- package/dist/src/transforms/transforms.js +4 -3
- package/dist/src/transforms/transforms.js.map +1 -1
- package/dist/src/typescriptGenerator.d.ts +2 -2
- package/dist/src/typescriptGenerator.d.ts.map +1 -1
- package/dist/src/typescriptGenerator.js +18 -7
- package/dist/src/typescriptGenerator.js.map +1 -1
- package/dist/src/utils/autorestOptions.d.ts +2 -2
- package/dist/src/utils/autorestOptions.d.ts.map +1 -1
- package/dist/src/utils/autorestOptions.js +70 -30
- package/dist/src/utils/autorestOptions.js.map +1 -1
- package/dist/src/utils/nameUtils.d.ts +6 -2
- package/dist/src/utils/nameUtils.d.ts.map +1 -1
- package/dist/src/utils/nameUtils.js +9 -5
- package/dist/src/utils/nameUtils.js.map +1 -1
- package/dist/src/utils/schemaHelpers.js +8 -3
- package/dist/src/utils/schemaHelpers.js.map +1 -1
- package/package.json +11 -5
- package/src/autorestSession.ts +16 -15
- package/src/conflictResolver.ts +0 -1
- package/src/generators/clientFileGenerator.ts +262 -33
- package/src/generators/indexGenerator.ts +78 -9
- package/src/generators/modelsGenerator.ts +21 -1
- package/src/generators/operationGenerator.ts +7 -7
- package/src/generators/samples/sampleEnv.hbs +4 -0
- package/src/generators/samples/sampleEnvGenerator.ts +14 -0
- package/src/generators/samples/sampleGenerator.ts +50 -0
- package/src/generators/static/README.md.hbs +19 -0
- package/src/generators/static/karma.conf.js.hbs +141 -0
- package/src/generators/static/karmaConfigFileGenerator.ts +20 -0
- package/src/generators/static/packageFileGenerator.ts +99 -14
- package/src/generators/static/rollupConfigFileGenerator.ts +7 -70
- package/src/generators/static/samples.ts.hbs +49 -0
- package/src/generators/static/tsConfigFileGenerator.ts +12 -12
- package/src/generators/test/envBrowserFileGenerator.ts +14 -0
- package/src/generators/test/envFileGenerator.ts +22 -0
- package/src/generators/test/recordedClientFileGenerator.ts +22 -0
- package/src/generators/test/rlcEnv.ts.hbs +3 -0
- package/src/generators/test/rlcRecordedClient.ts.hbs +35 -0
- package/src/generators/test/rlcSampleTest.spec.ts.hbs +19 -0
- package/src/generators/{static → test}/sampleTest.ts.hbs +0 -0
- package/src/generators/test/sampleTestGenerator.ts +23 -8
- package/src/generators/utils/pagingOperations.ts +1 -1
- package/src/main.ts +9 -5
- package/src/models/clientDetails.ts +3 -0
- package/src/models/modelDetails.ts +2 -2
- package/src/models/operationDetails.ts +1 -0
- package/src/models/sampleDetails.ts +22 -0
- package/src/restLevelClient/generateClient.ts +57 -253
- package/src/restLevelClient/generateClientDefinition.ts +343 -0
- package/src/restLevelClient/generateMethodShortcuts.ts +121 -0
- package/src/restLevelClient/generateObjectTypes.ts +1 -3
- package/src/restLevelClient/generatePagingHelper.ts +3 -2
- package/src/restLevelClient/generateParameterTypes.ts +155 -25
- package/src/restLevelClient/generatePollingHelper.ts +3 -3
- package/src/restLevelClient/generateResponseTypes.ts +4 -1
- package/src/restLevelClient/generateRestLevel.ts +24 -6
- package/src/restLevelClient/generateSchemaTypes.ts +5 -3
- package/src/restLevelClient/generateTopLevelIndexFile.ts +41 -0
- package/src/restLevelClient/helpers/operationHelpers.ts +93 -0
- package/src/restLevelClient/interfaces.ts +26 -0
- package/src/restLevelClient/operationHelpers.ts +8 -2
- package/src/restLevelClient/schemaHelpers.ts +4 -2
- package/src/transforms/operationTransforms.ts +1 -0
- package/src/transforms/samplesTransforms.ts +300 -0
- package/src/transforms/transforms.ts +6 -6
- package/src/typescriptGenerator.ts +19 -10
- package/src/utils/autorestOptions.ts +121 -58
- package/src/utils/nameUtils.ts +16 -8
- package/src/utils/schemaHelpers.ts +2 -2
- package/dist/src/generators/clientContextFileGenerator.d.ts +0 -5
- package/dist/src/generators/clientContextFileGenerator.d.ts.map +0 -1
- package/dist/src/generators/clientContextFileGenerator.js +0 -263
- package/dist/src/generators/clientContextFileGenerator.js.map +0 -1
- package/dist/src/restLevelClient/helpers/getOperationParameters.d.ts +0 -6
- package/dist/src/restLevelClient/helpers/getOperationParameters.d.ts.map +0 -1
- package/dist/src/restLevelClient/helpers/getOperationParameters.js +0 -29
- package/dist/src/restLevelClient/helpers/getOperationParameters.js.map +0 -1
- package/src/generators/clientContextFileGenerator.ts +0 -405
- package/src/restLevelClient/helpers/getOperationParameters.ts +0 -37
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ChoiceSchema,
|
|
3
|
+
CodeModel,
|
|
4
|
+
ConstantSchema,
|
|
5
|
+
ImplementationLocation,
|
|
6
|
+
Operation,
|
|
7
|
+
OperationGroup,
|
|
8
|
+
SchemaType
|
|
9
|
+
} from "@autorest/codemodel";
|
|
10
|
+
import { ClientDetails } from "../models/clientDetails";
|
|
11
|
+
import { SampleGroup, SampleDetails } from "../models/sampleDetails";
|
|
12
|
+
import { ExampleValue, TestCodeModel } from "@autorest/testmodeler";
|
|
13
|
+
import { getLanguageMetadata } from "../utils/languageHelpers";
|
|
14
|
+
import { getAutorestOptions, getSession } from "../autorestSession";
|
|
15
|
+
import { getOperationFullName, NameType, normalizeName } from "../utils/nameUtils";
|
|
16
|
+
import { calculateMethodName } from "../generators/utils/operationsUtils";
|
|
17
|
+
import { camelCase } from "@azure-tools/codegen";
|
|
18
|
+
import { OperationGroupDetails } from "../models/operationDetails";
|
|
19
|
+
import { getPublicMethodName } from '../generators/utils/pagingOperations';
|
|
20
|
+
import { getTypeForSchema } from "../utils/schemaHelpers";
|
|
21
|
+
|
|
22
|
+
export async function transformSamples(
|
|
23
|
+
codeModel: CodeModel,
|
|
24
|
+
clientDetails: ClientDetails
|
|
25
|
+
): Promise<SampleGroup[]> {
|
|
26
|
+
return await getAllExamples(codeModel as TestCodeModel, clientDetails);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function getTransformedOperationGroup(operationGroup: OperationGroup, operationGroupDetails: OperationGroupDetails[]) {
|
|
30
|
+
return operationGroupDetails.filter(operationGroupDetail => operationGroup.$key === operationGroupDetail.originalKey)[0];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function getTransformedOperation(operationGroup: OperationGroup, operation: Operation, operationGroupDetails: OperationGroupDetails, clientName: string) {
|
|
34
|
+
return operationGroupDetails.operations.filter(operationDetail => operationDetail.fullName === getOperationFullName(operationGroup, operation, clientName))[0];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export async function getAllExamples(codeModel: TestCodeModel, clientDetails: ClientDetails) {
|
|
38
|
+
const operationGroupDetails = clientDetails.operationGroups;
|
|
39
|
+
const { packageDetails } = getAutorestOptions();
|
|
40
|
+
const session = getSession();
|
|
41
|
+
let examplesModels: SampleGroup[] = [];
|
|
42
|
+
if (codeModel?.testModel?.mockTest?.exampleGroups !== undefined) {
|
|
43
|
+
for (const exampleGroup of codeModel.testModel.mockTest.exampleGroups) {
|
|
44
|
+
const clientName = getLanguageMetadata(codeModel.language).name;
|
|
45
|
+
const ogDetails = getTransformedOperationGroup(exampleGroup.operationGroup, operationGroupDetails);
|
|
46
|
+
if (ogDetails === undefined) {
|
|
47
|
+
session.error("An error was encountered while transforming sample", [
|
|
48
|
+
exampleGroup.operationId
|
|
49
|
+
]);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (!(exampleGroup?.examples?.length > 0)) {
|
|
53
|
+
// Skip tranforming sample detail no given example in group
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const opDetails = getTransformedOperation(
|
|
57
|
+
exampleGroup.operationGroup,
|
|
58
|
+
exampleGroup.operation,
|
|
59
|
+
ogDetails,
|
|
60
|
+
clientName
|
|
61
|
+
);
|
|
62
|
+
let methodName = calculateMethodName(opDetails);
|
|
63
|
+
if (opDetails.isLro && opDetails.pagination === undefined) {
|
|
64
|
+
methodName = `${methodName}AndWait`;
|
|
65
|
+
} else if (opDetails.pagination) {
|
|
66
|
+
methodName = getPublicMethodName(opDetails);
|
|
67
|
+
}
|
|
68
|
+
const opGroupName = ogDetails.name;
|
|
69
|
+
const importedTypeSet = new Set<string>();
|
|
70
|
+
const operatonConcante = `${exampleGroup?.operationGroup?.language?.default?.name}${exampleGroup?.operation?.language?.default?.name}`;
|
|
71
|
+
const sampleGroup: SampleGroup = {
|
|
72
|
+
sampleFileName: `${camelCase(_transformSpecialLetterToSpace(operatonConcante))}Sample`,
|
|
73
|
+
clientClassName: clientName,
|
|
74
|
+
clientPackageName: packageDetails.name,
|
|
75
|
+
samples: [],
|
|
76
|
+
importedTypes: []
|
|
77
|
+
};
|
|
78
|
+
try {
|
|
79
|
+
for (const example of exampleGroup.examples) {
|
|
80
|
+
const sample: SampleDetails = {
|
|
81
|
+
sampleFunctionName: camelCase(_transformSpecialLetterToSpace(example?.name)),
|
|
82
|
+
clientParameterNames: "",
|
|
83
|
+
methodParameterNames: "",
|
|
84
|
+
clientParamAssignments: [],
|
|
85
|
+
methodParamAssignments: [],
|
|
86
|
+
originalFileLocation: example.originalFile,
|
|
87
|
+
isTopLevel: ogDetails.isTopLevel,
|
|
88
|
+
isPaging: opDetails.pagination !== undefined,
|
|
89
|
+
operationName: methodName,
|
|
90
|
+
clientClassName: clientName,
|
|
91
|
+
operationGroupName: normalizeName(opGroupName, NameType.Property, true),
|
|
92
|
+
operationDescription: getLanguageMetadata(
|
|
93
|
+
exampleGroup.operation.language
|
|
94
|
+
).description,
|
|
95
|
+
};
|
|
96
|
+
const clientParameterNames = ["credential"];
|
|
97
|
+
const requiredParams = clientDetails.parameters.filter(
|
|
98
|
+
param =>
|
|
99
|
+
param.required &&
|
|
100
|
+
param.implementationLocation === ImplementationLocation.Client &&
|
|
101
|
+
!param.defaultValue &&
|
|
102
|
+
param.schemaType !== SchemaType.Constant
|
|
103
|
+
);
|
|
104
|
+
for (const clientParameter of example.clientParameters) {
|
|
105
|
+
if (
|
|
106
|
+
clientParameter.exampleValue.schema.type === SchemaType.Constant
|
|
107
|
+
) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const parameterName = normalizeName(
|
|
111
|
+
getLanguageMetadata(clientParameter.exampleValue.language).name,
|
|
112
|
+
NameType.Parameter,
|
|
113
|
+
true
|
|
114
|
+
);
|
|
115
|
+
const paramAssignment =
|
|
116
|
+
`const ${parameterName} = ` +
|
|
117
|
+
getParameterAssignment(clientParameter.exampleValue);
|
|
118
|
+
sample.clientParamAssignments.push(paramAssignment);
|
|
119
|
+
clientParameterNames.push(parameterName);
|
|
120
|
+
}
|
|
121
|
+
if (clientParameterNames.indexOf("subscriptionId") < 0 && requiredParams.find(param => param.name === 'subscriptionId')) {
|
|
122
|
+
const subscriptionIdAssignment = `const subscriptionId = "00000000-0000-0000-0000-000000000000"`;
|
|
123
|
+
sample.clientParamAssignments.push(subscriptionIdAssignment);
|
|
124
|
+
clientParameterNames.push('subscriptionId');
|
|
125
|
+
}
|
|
126
|
+
if (clientParameterNames.length > 0) {
|
|
127
|
+
sample.clientParameterNames = clientParameterNames.join(", ");
|
|
128
|
+
}
|
|
129
|
+
const methodParameterNames = [];
|
|
130
|
+
const optionalParams: [string, string][] = [];
|
|
131
|
+
for (const methodParameter of example.methodParameters) {
|
|
132
|
+
if (
|
|
133
|
+
methodParameter.exampleValue.schema.type === SchemaType.Constant
|
|
134
|
+
) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const parameterName = normalizeName(
|
|
138
|
+
getLanguageMetadata(methodParameter.exampleValue.language).name,
|
|
139
|
+
NameType.Parameter,
|
|
140
|
+
true
|
|
141
|
+
);
|
|
142
|
+
const parameterTypeDetails = getTypeForSchema(
|
|
143
|
+
methodParameter.exampleValue.schema
|
|
144
|
+
);
|
|
145
|
+
const parameterTypeName = parameterTypeDetails.typeName;
|
|
146
|
+
let paramAssignment = "";
|
|
147
|
+
if (methodParameter.parameter.protocol?.http?.["in"] === "body") {
|
|
148
|
+
let bodySchemaName = parameterTypeName;
|
|
149
|
+
if (methodParameter.exampleValue.schema.type === SchemaType.AnyObject || methodParameter.exampleValue.schema.type === SchemaType.Any) {
|
|
150
|
+
bodySchemaName = "Record<string, unknown>";
|
|
151
|
+
} else {
|
|
152
|
+
importedTypeSet.add(parameterTypeName);
|
|
153
|
+
}
|
|
154
|
+
paramAssignment =
|
|
155
|
+
`const ${parameterName}: ${bodySchemaName} = ` +
|
|
156
|
+
getParameterAssignment(methodParameter.exampleValue);
|
|
157
|
+
} else {
|
|
158
|
+
paramAssignment =
|
|
159
|
+
`const ${parameterName} = ` +
|
|
160
|
+
getParameterAssignment(methodParameter.exampleValue);
|
|
161
|
+
}
|
|
162
|
+
if (!methodParameter.parameter.required) {
|
|
163
|
+
optionalParams.push([parameterName, parameterTypeName]);
|
|
164
|
+
} else {
|
|
165
|
+
methodParameterNames.push(parameterName);
|
|
166
|
+
}
|
|
167
|
+
sample.methodParamAssignments.push(paramAssignment);
|
|
168
|
+
}
|
|
169
|
+
if (optionalParams.length > 0) {
|
|
170
|
+
const optionTypeName = `${opDetails.typeDetails.typeName}OptionalParams`;
|
|
171
|
+
importedTypeSet.add(optionTypeName);
|
|
172
|
+
const optionAssignment = `const options: ${optionTypeName} = {${optionalParams
|
|
173
|
+
.map(item => { return item[0]; })
|
|
174
|
+
.join(", ")}}`;
|
|
175
|
+
sample.methodParamAssignments.push(optionAssignment);
|
|
176
|
+
methodParameterNames.push("options");
|
|
177
|
+
}
|
|
178
|
+
if (methodParameterNames.length > 0) {
|
|
179
|
+
sample.methodParameterNames = methodParameterNames.join(", ");
|
|
180
|
+
}
|
|
181
|
+
sampleGroup.samples.push(sample);
|
|
182
|
+
}
|
|
183
|
+
} catch (error) {
|
|
184
|
+
session.error("An error was encountered while transforming sample", [
|
|
185
|
+
exampleGroup.operationId
|
|
186
|
+
]);
|
|
187
|
+
throw error;
|
|
188
|
+
}
|
|
189
|
+
if (sampleGroup.samples.length > 0) {
|
|
190
|
+
// enrich the importedTypes after all examples resolved
|
|
191
|
+
sampleGroup.importedTypes = Array.from(importedTypeSet);
|
|
192
|
+
examplesModels.push(sampleGroup);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return examplesModels;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function _transformSpecialLetterToSpace(str: string) {
|
|
200
|
+
if (!str) {
|
|
201
|
+
return str;
|
|
202
|
+
}
|
|
203
|
+
return str.replace(/_/g, ' ').replace(/\//g, ' Or ').replace(/,|\.|\(|\)/g, ' ').replace('\'s ', ' ');
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function getParameterAssignment(exampleValue: ExampleValue) {
|
|
207
|
+
let schemaType = exampleValue.schema.type;
|
|
208
|
+
const rawValue = exampleValue.rawValue;
|
|
209
|
+
let retValue = rawValue;
|
|
210
|
+
switch (schemaType) {
|
|
211
|
+
case SchemaType.Constant:
|
|
212
|
+
const contentSchema = exampleValue.schema as ConstantSchema;
|
|
213
|
+
schemaType = contentSchema.valueType.type;
|
|
214
|
+
break;
|
|
215
|
+
case SchemaType.Choice:
|
|
216
|
+
case SchemaType.SealedChoice:
|
|
217
|
+
const choiceSchema = exampleValue.schema as ChoiceSchema;
|
|
218
|
+
schemaType = choiceSchema.choiceType.type;
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
if (rawValue === null) {
|
|
222
|
+
switch (schemaType) {
|
|
223
|
+
case SchemaType.Object:
|
|
224
|
+
case SchemaType.Any:
|
|
225
|
+
case SchemaType.Dictionary:
|
|
226
|
+
case SchemaType.AnyObject:
|
|
227
|
+
retValue = `{}`;
|
|
228
|
+
break;
|
|
229
|
+
case SchemaType.Array:
|
|
230
|
+
retValue = `[]`;
|
|
231
|
+
break;
|
|
232
|
+
default:
|
|
233
|
+
retValue = undefined;
|
|
234
|
+
}
|
|
235
|
+
return retValue;
|
|
236
|
+
}
|
|
237
|
+
switch (schemaType) {
|
|
238
|
+
case SchemaType.String:
|
|
239
|
+
case SchemaType.Char:
|
|
240
|
+
case SchemaType.Time:
|
|
241
|
+
case SchemaType.Uuid:
|
|
242
|
+
case SchemaType.Uri:
|
|
243
|
+
case SchemaType.Credential:
|
|
244
|
+
case SchemaType.Duration:
|
|
245
|
+
retValue = `"${rawValue?.toString().replace(/"/g, '\\"').replace(/\n/g, '\\n')}"`;
|
|
246
|
+
break;
|
|
247
|
+
case SchemaType.Boolean:
|
|
248
|
+
(retValue = rawValue), toString();
|
|
249
|
+
break;
|
|
250
|
+
case SchemaType.Object:
|
|
251
|
+
case SchemaType.Dictionary:
|
|
252
|
+
const values = [];
|
|
253
|
+
for (const prop in exampleValue.properties) {
|
|
254
|
+
const property = exampleValue.properties[prop];
|
|
255
|
+
if (property === undefined || property === null) {
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
const initPropName = property.language?.default?.name
|
|
259
|
+
? property.language?.default?.name
|
|
260
|
+
: prop;
|
|
261
|
+
const propName = normalizeName(initPropName, NameType.Property, true);
|
|
262
|
+
let propRetValue: string;
|
|
263
|
+
if (propName.indexOf("/") > -1 || propName.match(/^\d/)) {
|
|
264
|
+
propRetValue = `"${propName}": ` + getParameterAssignment(property);
|
|
265
|
+
} else {
|
|
266
|
+
propRetValue = `${propName}: ` + getParameterAssignment(property);
|
|
267
|
+
}
|
|
268
|
+
values.push(propRetValue);
|
|
269
|
+
}
|
|
270
|
+
if (values.length > 0) {
|
|
271
|
+
retValue = `{${values.join(", ")}}`;
|
|
272
|
+
} else {
|
|
273
|
+
retValue = "{}";
|
|
274
|
+
}
|
|
275
|
+
break;
|
|
276
|
+
case SchemaType.Array:
|
|
277
|
+
const valuesArr = [];
|
|
278
|
+
for (const element of <ExampleValue[]>exampleValue.elements) {
|
|
279
|
+
let propRetValueArr = getParameterAssignment(element);
|
|
280
|
+
valuesArr.push(propRetValueArr);
|
|
281
|
+
}
|
|
282
|
+
if (valuesArr.length > 0) {
|
|
283
|
+
retValue = `[${valuesArr.join(", ")}]`;
|
|
284
|
+
} else {
|
|
285
|
+
retValue = "[]";
|
|
286
|
+
}
|
|
287
|
+
break;
|
|
288
|
+
case SchemaType.Date:
|
|
289
|
+
case SchemaType.DateTime:
|
|
290
|
+
retValue = `new Date("${rawValue}")`;
|
|
291
|
+
break;
|
|
292
|
+
case SchemaType.Any:
|
|
293
|
+
case SchemaType.AnyObject:
|
|
294
|
+
retValue = `${JSON.stringify(rawValue)}`;
|
|
295
|
+
break;
|
|
296
|
+
default:
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
return retValue;
|
|
300
|
+
}
|
|
@@ -18,8 +18,8 @@ import { transformOperationGroups } from "./operationTransforms";
|
|
|
18
18
|
import { transformOptions } from "./optionsTransforms";
|
|
19
19
|
import { transformParameters } from "./parameterTransforms";
|
|
20
20
|
import { transformObjects, transformObject } from "./objectTransforms";
|
|
21
|
+
import { transformSamples } from "./samplesTransforms";
|
|
21
22
|
import { ObjectDetails } from "../models/modelDetails";
|
|
22
|
-
import { Host } from "@autorest/extension-base";
|
|
23
23
|
import { transformBaseUrl } from "./urlTransforms";
|
|
24
24
|
import { normalizeModelWithExtensions } from "./extensions";
|
|
25
25
|
import { transformGroups } from "./groupTransforms";
|
|
@@ -80,8 +80,7 @@ export function transformChoice(
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
export async function transformCodeModel(
|
|
83
|
-
codeModel: CodeModel
|
|
84
|
-
host: Host
|
|
83
|
+
codeModel: CodeModel
|
|
85
84
|
): Promise<ClientDetails> {
|
|
86
85
|
const { name: clientName } = getLanguageMetadata(codeModel.language);
|
|
87
86
|
const className = normalizeName(
|
|
@@ -101,12 +100,12 @@ export async function transformCodeModel(
|
|
|
101
100
|
|
|
102
101
|
const options = await transformOptions(operationGroups);
|
|
103
102
|
|
|
104
|
-
const [objects, groups, mappers, unions, parameters] = await Promise.all([
|
|
103
|
+
const [objects, groups, mappers, unions, parameters ] = await Promise.all([
|
|
105
104
|
transformObjects(codeModel, uberParents),
|
|
106
105
|
transformGroups(codeModel),
|
|
107
106
|
transformMappers(codeModel, uberParents, options),
|
|
108
107
|
transformChoices(codeModel),
|
|
109
|
-
transformParameters(codeModel, options)
|
|
108
|
+
transformParameters(codeModel, options),
|
|
110
109
|
]);
|
|
111
110
|
|
|
112
111
|
const baseUrl = transformBaseUrl(codeModel);
|
|
@@ -122,7 +121,8 @@ export async function transformCodeModel(
|
|
|
122
121
|
operationGroups,
|
|
123
122
|
parameters,
|
|
124
123
|
options,
|
|
125
|
-
endpoint: baseUrl
|
|
124
|
+
endpoint: baseUrl,
|
|
125
|
+
allTypes: []
|
|
126
126
|
};
|
|
127
127
|
}
|
|
128
128
|
|
|
@@ -6,10 +6,10 @@ import * as fsextra from "fs-extra";
|
|
|
6
6
|
import * as path from "path";
|
|
7
7
|
import { CodeModel } from "@autorest/codemodel";
|
|
8
8
|
import { Project, IndentationText } from "ts-morph";
|
|
9
|
-
import {
|
|
9
|
+
import { AutorestExtensionHost } from "@autorest/extension-base";
|
|
10
10
|
import { transformCodeModel } from "./transforms/transforms";
|
|
11
|
+
import { transformSamples } from './transforms/samplesTransforms';
|
|
11
12
|
import { generateClient } from "./generators/clientFileGenerator";
|
|
12
|
-
import { generateClientContext } from "./generators/clientContextFileGenerator";
|
|
13
13
|
import { generateModels } from "./generators/modelsGenerator";
|
|
14
14
|
import { generateMappers } from "./generators/mappersGenerator";
|
|
15
15
|
import { generateIndexFile } from "./generators/indexGenerator";
|
|
@@ -22,6 +22,8 @@ import { generateTsConfig } from "./generators/static/tsConfigFileGenerator";
|
|
|
22
22
|
import { generateRollupConfig } from "./generators/static/rollupConfigFileGenerator";
|
|
23
23
|
import { generateOperations } from "./generators/operationGenerator";
|
|
24
24
|
import { generateOperationsInterfaces } from "./generators/operationInterfaceGenerator";
|
|
25
|
+
import { generateSampleEnv } from './generators/samples/sampleEnvGenerator';
|
|
26
|
+
import { generateSamples } from './generators/samples/sampleGenerator';
|
|
25
27
|
import { generateParameters } from "./generators/parametersGenerator";
|
|
26
28
|
import { generateLroFiles } from "./generators/LROGenerator";
|
|
27
29
|
import { generateTracingFile } from "./generators/tracingFileGenerator";
|
|
@@ -48,7 +50,7 @@ const prettierJSONOptions: prettier.Options = {
|
|
|
48
50
|
|
|
49
51
|
export async function generateTypeScriptLibrary(
|
|
50
52
|
codeModel: CodeModel,
|
|
51
|
-
host:
|
|
53
|
+
host: AutorestExtensionHost
|
|
52
54
|
): Promise<void> {
|
|
53
55
|
const project = new Project({
|
|
54
56
|
useInMemoryFileSystem: true,
|
|
@@ -61,13 +63,18 @@ export async function generateTypeScriptLibrary(
|
|
|
61
63
|
packageDetails,
|
|
62
64
|
licenseHeader: shouldGenerateLicense,
|
|
63
65
|
generateTest,
|
|
66
|
+
generateSample,
|
|
64
67
|
outputPath,
|
|
65
68
|
srcPath
|
|
66
69
|
} = getAutorestOptions();
|
|
67
70
|
|
|
68
|
-
const clientDetails = await transformCodeModel(codeModel
|
|
71
|
+
const clientDetails = await transformCodeModel(codeModel);
|
|
69
72
|
conflictResolver(clientDetails);
|
|
70
73
|
|
|
74
|
+
generateModels(clientDetails, project);
|
|
75
|
+
if (generateSample) {
|
|
76
|
+
clientDetails.samples = await transformSamples(codeModel, clientDetails);
|
|
77
|
+
}
|
|
71
78
|
// Skip metadata generation if `generate-metadata` is explicitly false
|
|
72
79
|
generatePackageJson(project, clientDetails);
|
|
73
80
|
generateLicenseFile(project);
|
|
@@ -80,12 +87,14 @@ export async function generateTypeScriptLibrary(
|
|
|
80
87
|
generateApiExtractorConfig(project);
|
|
81
88
|
|
|
82
89
|
generateClient(clientDetails, project);
|
|
83
|
-
generateClientContext(clientDetails, packageDetails, project);
|
|
84
|
-
generateModels(clientDetails, project);
|
|
85
90
|
|
|
86
91
|
generateMappers(clientDetails, project);
|
|
87
92
|
generateOperations(clientDetails, project);
|
|
88
93
|
generateOperationsInterfaces(clientDetails, project);
|
|
94
|
+
if (generateSample && clientDetails?.samples?.length && clientDetails?.samples?.length > 0) {
|
|
95
|
+
generateSamples(clientDetails, project);
|
|
96
|
+
generateSampleEnv(project);
|
|
97
|
+
}
|
|
89
98
|
generateParameters(clientDetails, project);
|
|
90
99
|
generateIndexFile(project, clientDetails);
|
|
91
100
|
await generateLroFiles(clientDetails, project);
|
|
@@ -128,9 +137,9 @@ export async function generateTypeScriptLibrary(
|
|
|
128
137
|
}
|
|
129
138
|
|
|
130
139
|
// Write the file to the AutoRest host
|
|
131
|
-
host.
|
|
132
|
-
filePath.substr(1), // Get rid of the leading slash '/'
|
|
133
|
-
fileContents
|
|
134
|
-
);
|
|
140
|
+
host.writeFile({
|
|
141
|
+
filename: filePath.substr(1), // Get rid of the leading slash '/'
|
|
142
|
+
content: fileContents
|
|
143
|
+
});
|
|
135
144
|
}
|
|
136
145
|
}
|