@autorest/typescript 6.0.0-beta.15 → 6.0.0-beta.18
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 +14 -0
- package/README.md +37 -3
- package/dist/src/autorestSession.d.ts +12 -4
- 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 +21 -3
- package/dist/src/generators/modelsGenerator.js.map +1 -1
- package/dist/src/generators/operationGenerator.d.ts.map +1 -1
- package/dist/src/generators/operationGenerator.js +10 -8
- 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/apiExtractorConfig.js +2 -2
- package/dist/src/generators/static/apiExtractorConfig.js.map +1 -1
- package/dist/src/generators/static/esLintConfigGenerator.d.ts +3 -0
- package/dist/src/generators/static/esLintConfigGenerator.d.ts.map +1 -0
- package/dist/src/generators/static/esLintConfigGenerator.js +26 -0
- package/dist/src/generators/static/esLintConfigGenerator.js.map +1 -0
- package/dist/src/generators/static/{README.md.hbs → hlcREADME.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 +171 -46
- package/dist/src/generators/static/packageFileGenerator.js.map +1 -1
- package/dist/src/generators/static/readmeFileGenerator.d.ts +2 -2
- package/dist/src/generators/static/readmeFileGenerator.d.ts.map +1 -1
- package/dist/src/generators/static/readmeFileGenerator.js +31 -17
- package/dist/src/generators/static/readmeFileGenerator.js.map +1 -1
- package/dist/src/generators/static/rlcREADME.md.hbs +71 -0
- package/dist/src/generators/static/rollupConfigFileGenerator.d.ts.map +1 -1
- package/dist/src/generators/static/rollupConfigFileGenerator.js +12 -71
- 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 +40 -18
- 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 +7 -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 +81 -168
- 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 +31 -4
- 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 +37 -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 +10 -2
- package/dist/src/restLevelClient/schemaHelpers.js.map +1 -1
- package/dist/src/transforms/mapperTransforms.js +1 -1
- package/dist/src/transforms/mapperTransforms.js.map +1 -1
- package/dist/src/transforms/objectTransforms.js +1 -1
- package/dist/src/transforms/objectTransforms.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/parameterTransforms.d.ts.map +1 -1
- package/dist/src/transforms/parameterTransforms.js +20 -4
- package/dist/src/transforms/parameterTransforms.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 +5 -4
- 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 +19 -8
- 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 +107 -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 +26 -10
- package/src/autorestSession.ts +20 -16
- package/src/conflictResolver.ts +0 -1
- package/src/generators/clientFileGenerator.ts +264 -33
- package/src/generators/indexGenerator.ts +78 -9
- package/src/generators/modelsGenerator.ts +22 -2
- package/src/generators/operationGenerator.ts +11 -9
- 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/apiExtractorConfig.ts +2 -2
- package/src/generators/static/esLintConfigGenerator.ts +24 -0
- package/src/generators/static/{README.md.hbs → hlcREADME.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 +183 -46
- package/src/generators/static/readmeFileGenerator.ts +57 -34
- package/src/generators/static/rlcREADME.md.hbs +71 -0
- package/src/generators/static/rollupConfigFileGenerator.ts +13 -71
- package/src/generators/static/samples.ts.hbs +49 -0
- package/src/generators/static/tsConfigFileGenerator.ts +47 -20
- 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 +8 -5
- package/src/models/clientDetails.ts +8 -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 +101 -260
- 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 +36 -8
- package/src/restLevelClient/generateSchemaTypes.ts +5 -3
- package/src/restLevelClient/generateTopLevelIndexFile.ts +37 -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 +10 -3
- package/src/transforms/mapperTransforms.ts +1 -1
- package/src/transforms/objectTransforms.ts +1 -1
- package/src/transforms/operationTransforms.ts +1 -0
- package/src/transforms/parameterTransforms.ts +20 -4
- package/src/transforms/samplesTransforms.ts +300 -0
- package/src/transforms/transforms.ts +6 -6
- package/src/typescriptGenerator.ts +20 -11
- package/src/utils/autorestOptions.ts +170 -59
- 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
|
@@ -147,20 +147,36 @@ const extractOperationParameters = (codeModel: CodeModel) =>
|
|
|
147
147
|
}
|
|
148
148
|
const operationParams: OperationParameterDetails[] = (
|
|
149
149
|
operation.parameters || []
|
|
150
|
-
).map(p =>
|
|
150
|
+
).map(p => {
|
|
151
|
+
if (p.required) {
|
|
152
|
+
p.language.default.isTopLevelParameter = true;
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
parameter: p,
|
|
156
|
+
operationName
|
|
157
|
+
}
|
|
158
|
+
});
|
|
151
159
|
|
|
152
160
|
// Operations may have multiple requests, each with their own set of parameters.
|
|
153
161
|
// This is known to be the case when an operation can consume multiple media types.
|
|
154
162
|
// We need to ensure that the parameters from each request (method overload) is accounted for.
|
|
155
163
|
const requestParams: OperationParameterDetails[] = [];
|
|
156
|
-
requests.
|
|
157
|
-
request.parameters?.
|
|
164
|
+
requests.map(request => {
|
|
165
|
+
request.parameters?.map(parameter => {
|
|
158
166
|
requestParams.push({
|
|
159
167
|
operationName,
|
|
160
168
|
parameter,
|
|
161
169
|
targetMediaType: request.protocol.http?.knownMediaType
|
|
162
170
|
});
|
|
171
|
+
if (parameter.required) {
|
|
172
|
+
if ((parameter as any)['targetProperty'] !== undefined) {
|
|
173
|
+
(parameter as any)['targetProperty'].language.default.isTopLevelParameter = true;
|
|
174
|
+
}
|
|
175
|
+
parameter.language.default.isTopLevelParameter = true;
|
|
176
|
+
}
|
|
177
|
+
return parameter;
|
|
163
178
|
});
|
|
179
|
+
return request;
|
|
164
180
|
});
|
|
165
181
|
return [...operations, ...requestParams, ...operationParams];
|
|
166
182
|
},
|
|
@@ -331,7 +347,7 @@ function getParameterPath(parameter: Parameter) {
|
|
|
331
347
|
const name = normalizeName(
|
|
332
348
|
metadata.name,
|
|
333
349
|
NameType.Parameter,
|
|
334
|
-
true /** shouldGuard */
|
|
350
|
+
parameter.language.default.isTopLevelParameter ? true: false /** shouldGuard */
|
|
335
351
|
);
|
|
336
352
|
|
|
337
353
|
if (parameter.groupedBy) {
|
|
@@ -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
|
|
103
|
+
const [objects, groups, parameters, mappers, unions ] = await Promise.all([
|
|
105
104
|
transformObjects(codeModel, uberParents),
|
|
106
105
|
transformGroups(codeModel),
|
|
106
|
+
transformParameters(codeModel, options),
|
|
107
107
|
transformMappers(codeModel, uberParents, options),
|
|
108
108
|
transformChoices(codeModel),
|
|
109
|
-
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,17 +63,22 @@ 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);
|
|
74
|
-
generateReadmeFile(
|
|
81
|
+
generateReadmeFile(codeModel.language, codeModel.info, project);
|
|
75
82
|
if (generateTest) {
|
|
76
83
|
generateSampleTestFile(project);
|
|
77
84
|
}
|
|
@@ -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
|
}
|