@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.
Files changed (245) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +37 -3
  3. package/dist/src/autorestSession.d.ts +12 -4
  4. package/dist/src/autorestSession.d.ts.map +1 -1
  5. package/dist/src/autorestSession.js +3 -9
  6. package/dist/src/autorestSession.js.map +1 -1
  7. package/dist/src/conflictResolver.d.ts.map +1 -1
  8. package/dist/src/conflictResolver.js.map +1 -1
  9. package/dist/src/generators/clientFileGenerator.d.ts.map +1 -1
  10. package/dist/src/generators/clientFileGenerator.js +181 -31
  11. package/dist/src/generators/clientFileGenerator.js.map +1 -1
  12. package/dist/src/generators/indexGenerator.d.ts.map +1 -1
  13. package/dist/src/generators/indexGenerator.js +70 -9
  14. package/dist/src/generators/indexGenerator.js.map +1 -1
  15. package/dist/src/generators/modelsGenerator.d.ts.map +1 -1
  16. package/dist/src/generators/modelsGenerator.js +21 -3
  17. package/dist/src/generators/modelsGenerator.js.map +1 -1
  18. package/dist/src/generators/operationGenerator.d.ts.map +1 -1
  19. package/dist/src/generators/operationGenerator.js +10 -8
  20. package/dist/src/generators/operationGenerator.js.map +1 -1
  21. package/dist/src/generators/samples/sampleEnv.hbs +4 -0
  22. package/dist/src/generators/samples/sampleEnvGenerator.d.ts +3 -0
  23. package/dist/src/generators/samples/sampleEnvGenerator.d.ts.map +1 -0
  24. package/dist/src/generators/samples/sampleEnvGenerator.js +17 -0
  25. package/dist/src/generators/samples/sampleEnvGenerator.js.map +1 -0
  26. package/dist/src/generators/samples/sampleGenerator.d.ts +13 -0
  27. package/dist/src/generators/samples/sampleGenerator.d.ts.map +1 -0
  28. package/dist/src/generators/samples/sampleGenerator.js +43 -0
  29. package/dist/src/generators/samples/sampleGenerator.js.map +1 -0
  30. package/dist/src/generators/static/apiExtractorConfig.js +2 -2
  31. package/dist/src/generators/static/apiExtractorConfig.js.map +1 -1
  32. package/dist/src/generators/static/esLintConfigGenerator.d.ts +3 -0
  33. package/dist/src/generators/static/esLintConfigGenerator.d.ts.map +1 -0
  34. package/dist/src/generators/static/esLintConfigGenerator.js +26 -0
  35. package/dist/src/generators/static/esLintConfigGenerator.js.map +1 -0
  36. package/dist/src/generators/static/{README.md.hbs → hlcREADME.md.hbs} +19 -0
  37. package/dist/src/generators/static/karma.conf.js.hbs +141 -0
  38. package/dist/src/generators/static/karmaConfigFileGenerator.d.ts +3 -0
  39. package/dist/src/generators/static/karmaConfigFileGenerator.d.ts.map +1 -0
  40. package/dist/src/generators/static/karmaConfigFileGenerator.js +23 -0
  41. package/dist/src/generators/static/karmaConfigFileGenerator.js.map +1 -0
  42. package/dist/src/generators/static/packageFileGenerator.d.ts.map +1 -1
  43. package/dist/src/generators/static/packageFileGenerator.js +171 -46
  44. package/dist/src/generators/static/packageFileGenerator.js.map +1 -1
  45. package/dist/src/generators/static/readmeFileGenerator.d.ts +2 -2
  46. package/dist/src/generators/static/readmeFileGenerator.d.ts.map +1 -1
  47. package/dist/src/generators/static/readmeFileGenerator.js +31 -17
  48. package/dist/src/generators/static/readmeFileGenerator.js.map +1 -1
  49. package/dist/src/generators/static/rlcREADME.md.hbs +71 -0
  50. package/dist/src/generators/static/rollupConfigFileGenerator.d.ts.map +1 -1
  51. package/dist/src/generators/static/rollupConfigFileGenerator.js +12 -71
  52. package/dist/src/generators/static/rollupConfigFileGenerator.js.map +1 -1
  53. package/dist/src/generators/static/samples.ts.hbs +49 -0
  54. package/dist/src/generators/static/tsConfigFileGenerator.d.ts.map +1 -1
  55. package/dist/src/generators/static/tsConfigFileGenerator.js +40 -18
  56. package/dist/src/generators/static/tsConfigFileGenerator.js.map +1 -1
  57. package/dist/src/generators/test/envBrowserFileGenerator.d.ts +3 -0
  58. package/dist/src/generators/test/envBrowserFileGenerator.d.ts.map +1 -0
  59. package/dist/src/generators/test/envBrowserFileGenerator.js +15 -0
  60. package/dist/src/generators/test/envBrowserFileGenerator.js.map +1 -0
  61. package/dist/src/generators/test/envFileGenerator.d.ts +3 -0
  62. package/dist/src/generators/test/envFileGenerator.d.ts.map +1 -0
  63. package/dist/src/generators/test/envFileGenerator.js +23 -0
  64. package/dist/src/generators/test/envFileGenerator.js.map +1 -0
  65. package/dist/src/generators/test/recordedClientFileGenerator.d.ts +3 -0
  66. package/dist/src/generators/test/recordedClientFileGenerator.d.ts.map +1 -0
  67. package/dist/src/generators/test/recordedClientFileGenerator.js +23 -0
  68. package/dist/src/generators/test/recordedClientFileGenerator.js.map +1 -0
  69. package/dist/src/generators/test/rlcEnv.ts.hbs +3 -0
  70. package/dist/src/generators/test/rlcRecordedClient.ts.hbs +35 -0
  71. package/dist/src/generators/test/rlcSampleTest.spec.ts.hbs +19 -0
  72. package/dist/src/generators/{static → test}/sampleTest.ts.hbs +0 -0
  73. package/dist/src/generators/test/sampleTestGenerator.d.ts.map +1 -1
  74. package/dist/src/generators/test/sampleTestGenerator.js +23 -7
  75. package/dist/src/generators/test/sampleTestGenerator.js.map +1 -1
  76. package/dist/src/generators/utils/pagingOperations.d.ts +5 -0
  77. package/dist/src/generators/utils/pagingOperations.d.ts.map +1 -1
  78. package/dist/src/generators/utils/pagingOperations.js +2 -1
  79. package/dist/src/generators/utils/pagingOperations.js.map +1 -1
  80. package/dist/src/main.d.ts +2 -2
  81. package/dist/src/main.d.ts.map +1 -1
  82. package/dist/src/main.js +3 -3
  83. package/dist/src/main.js.map +1 -1
  84. package/dist/src/models/clientDetails.d.ts +7 -0
  85. package/dist/src/models/clientDetails.d.ts.map +1 -1
  86. package/dist/src/models/modelDetails.d.ts +2 -2
  87. package/dist/src/models/modelDetails.d.ts.map +1 -1
  88. package/dist/src/models/operationDetails.d.ts +1 -0
  89. package/dist/src/models/operationDetails.d.ts.map +1 -1
  90. package/dist/src/models/sampleDetails.d.ts +22 -0
  91. package/dist/src/models/sampleDetails.d.ts.map +1 -0
  92. package/dist/src/models/sampleDetails.js +3 -0
  93. package/dist/src/models/sampleDetails.js.map +1 -0
  94. package/dist/src/restLevelClient/generateClient.d.ts +1 -1
  95. package/dist/src/restLevelClient/generateClient.d.ts.map +1 -1
  96. package/dist/src/restLevelClient/generateClient.js +81 -168
  97. package/dist/src/restLevelClient/generateClient.js.map +1 -1
  98. package/dist/src/restLevelClient/generateClientDefinition.d.ts +6 -0
  99. package/dist/src/restLevelClient/generateClientDefinition.d.ts.map +1 -0
  100. package/dist/src/restLevelClient/generateClientDefinition.js +231 -0
  101. package/dist/src/restLevelClient/generateClientDefinition.js.map +1 -0
  102. package/dist/src/restLevelClient/generateMethodShortcuts.d.ts +8 -0
  103. package/dist/src/restLevelClient/generateMethodShortcuts.d.ts.map +1 -0
  104. package/dist/src/restLevelClient/generateMethodShortcuts.js +70 -0
  105. package/dist/src/restLevelClient/generateMethodShortcuts.js.map +1 -0
  106. package/dist/src/restLevelClient/generateObjectTypes.d.ts.map +1 -1
  107. package/dist/src/restLevelClient/generateObjectTypes.js.map +1 -1
  108. package/dist/src/restLevelClient/generatePagingHelper.d.ts.map +1 -1
  109. package/dist/src/restLevelClient/generatePagingHelper.js +2 -1
  110. package/dist/src/restLevelClient/generatePagingHelper.js.map +1 -1
  111. package/dist/src/restLevelClient/generateParameterTypes.d.ts.map +1 -1
  112. package/dist/src/restLevelClient/generateParameterTypes.js +104 -18
  113. package/dist/src/restLevelClient/generateParameterTypes.js.map +1 -1
  114. package/dist/src/restLevelClient/generatePollingHelper.d.ts.map +1 -1
  115. package/dist/src/restLevelClient/generatePollingHelper.js +3 -1
  116. package/dist/src/restLevelClient/generatePollingHelper.js.map +1 -1
  117. package/dist/src/restLevelClient/generateResponseTypes.d.ts.map +1 -1
  118. package/dist/src/restLevelClient/generateResponseTypes.js +4 -1
  119. package/dist/src/restLevelClient/generateResponseTypes.js.map +1 -1
  120. package/dist/src/restLevelClient/generateRestLevel.d.ts.map +1 -1
  121. package/dist/src/restLevelClient/generateRestLevel.js +31 -4
  122. package/dist/src/restLevelClient/generateRestLevel.js.map +1 -1
  123. package/dist/src/restLevelClient/generateSchemaTypes.d.ts.map +1 -1
  124. package/dist/src/restLevelClient/generateSchemaTypes.js +5 -2
  125. package/dist/src/restLevelClient/generateSchemaTypes.js.map +1 -1
  126. package/dist/src/restLevelClient/generateTopLevelIndexFile.d.ts +4 -0
  127. package/dist/src/restLevelClient/generateTopLevelIndexFile.d.ts.map +1 -0
  128. package/dist/src/restLevelClient/generateTopLevelIndexFile.js +37 -0
  129. package/dist/src/restLevelClient/generateTopLevelIndexFile.js.map +1 -0
  130. package/dist/src/restLevelClient/helpers/operationHelpers.d.ts +10 -0
  131. package/dist/src/restLevelClient/helpers/operationHelpers.d.ts.map +1 -0
  132. package/dist/src/restLevelClient/helpers/operationHelpers.js +64 -0
  133. package/dist/src/restLevelClient/helpers/operationHelpers.js.map +1 -0
  134. package/dist/src/restLevelClient/interfaces.d.ts +24 -0
  135. package/dist/src/restLevelClient/interfaces.d.ts.map +1 -0
  136. package/dist/src/restLevelClient/interfaces.js +3 -0
  137. package/dist/src/restLevelClient/interfaces.js.map +1 -0
  138. package/dist/src/restLevelClient/operationHelpers.d.ts.map +1 -1
  139. package/dist/src/restLevelClient/operationHelpers.js +4 -1
  140. package/dist/src/restLevelClient/operationHelpers.js.map +1 -1
  141. package/dist/src/restLevelClient/schemaHelpers.d.ts.map +1 -1
  142. package/dist/src/restLevelClient/schemaHelpers.js +10 -2
  143. package/dist/src/restLevelClient/schemaHelpers.js.map +1 -1
  144. package/dist/src/transforms/mapperTransforms.js +1 -1
  145. package/dist/src/transforms/mapperTransforms.js.map +1 -1
  146. package/dist/src/transforms/objectTransforms.js +1 -1
  147. package/dist/src/transforms/objectTransforms.js.map +1 -1
  148. package/dist/src/transforms/operationTransforms.d.ts.map +1 -1
  149. package/dist/src/transforms/operationTransforms.js +1 -0
  150. package/dist/src/transforms/operationTransforms.js.map +1 -1
  151. package/dist/src/transforms/parameterTransforms.d.ts.map +1 -1
  152. package/dist/src/transforms/parameterTransforms.js +20 -4
  153. package/dist/src/transforms/parameterTransforms.js.map +1 -1
  154. package/dist/src/transforms/samplesTransforms.d.ts +7 -0
  155. package/dist/src/transforms/samplesTransforms.d.ts.map +1 -0
  156. package/dist/src/transforms/samplesTransforms.js +283 -0
  157. package/dist/src/transforms/samplesTransforms.js.map +1 -0
  158. package/dist/src/transforms/transforms.d.ts +1 -2
  159. package/dist/src/transforms/transforms.d.ts.map +1 -1
  160. package/dist/src/transforms/transforms.js +5 -4
  161. package/dist/src/transforms/transforms.js.map +1 -1
  162. package/dist/src/typescriptGenerator.d.ts +2 -2
  163. package/dist/src/typescriptGenerator.d.ts.map +1 -1
  164. package/dist/src/typescriptGenerator.js +19 -8
  165. package/dist/src/typescriptGenerator.js.map +1 -1
  166. package/dist/src/utils/autorestOptions.d.ts +2 -2
  167. package/dist/src/utils/autorestOptions.d.ts.map +1 -1
  168. package/dist/src/utils/autorestOptions.js +107 -30
  169. package/dist/src/utils/autorestOptions.js.map +1 -1
  170. package/dist/src/utils/nameUtils.d.ts +6 -2
  171. package/dist/src/utils/nameUtils.d.ts.map +1 -1
  172. package/dist/src/utils/nameUtils.js +9 -5
  173. package/dist/src/utils/nameUtils.js.map +1 -1
  174. package/dist/src/utils/schemaHelpers.js +8 -3
  175. package/dist/src/utils/schemaHelpers.js.map +1 -1
  176. package/package.json +26 -10
  177. package/src/autorestSession.ts +20 -16
  178. package/src/conflictResolver.ts +0 -1
  179. package/src/generators/clientFileGenerator.ts +264 -33
  180. package/src/generators/indexGenerator.ts +78 -9
  181. package/src/generators/modelsGenerator.ts +22 -2
  182. package/src/generators/operationGenerator.ts +11 -9
  183. package/src/generators/samples/sampleEnv.hbs +4 -0
  184. package/src/generators/samples/sampleEnvGenerator.ts +14 -0
  185. package/src/generators/samples/sampleGenerator.ts +50 -0
  186. package/src/generators/static/apiExtractorConfig.ts +2 -2
  187. package/src/generators/static/esLintConfigGenerator.ts +24 -0
  188. package/src/generators/static/{README.md.hbs → hlcREADME.md.hbs} +19 -0
  189. package/src/generators/static/karma.conf.js.hbs +141 -0
  190. package/src/generators/static/karmaConfigFileGenerator.ts +20 -0
  191. package/src/generators/static/packageFileGenerator.ts +183 -46
  192. package/src/generators/static/readmeFileGenerator.ts +57 -34
  193. package/src/generators/static/rlcREADME.md.hbs +71 -0
  194. package/src/generators/static/rollupConfigFileGenerator.ts +13 -71
  195. package/src/generators/static/samples.ts.hbs +49 -0
  196. package/src/generators/static/tsConfigFileGenerator.ts +47 -20
  197. package/src/generators/test/envBrowserFileGenerator.ts +14 -0
  198. package/src/generators/test/envFileGenerator.ts +22 -0
  199. package/src/generators/test/recordedClientFileGenerator.ts +22 -0
  200. package/src/generators/test/rlcEnv.ts.hbs +3 -0
  201. package/src/generators/test/rlcRecordedClient.ts.hbs +35 -0
  202. package/src/generators/test/rlcSampleTest.spec.ts.hbs +19 -0
  203. package/src/generators/{static → test}/sampleTest.ts.hbs +0 -0
  204. package/src/generators/test/sampleTestGenerator.ts +23 -8
  205. package/src/generators/utils/pagingOperations.ts +1 -1
  206. package/src/main.ts +8 -5
  207. package/src/models/clientDetails.ts +8 -0
  208. package/src/models/modelDetails.ts +2 -2
  209. package/src/models/operationDetails.ts +1 -0
  210. package/src/models/sampleDetails.ts +22 -0
  211. package/src/restLevelClient/generateClient.ts +101 -260
  212. package/src/restLevelClient/generateClientDefinition.ts +343 -0
  213. package/src/restLevelClient/generateMethodShortcuts.ts +121 -0
  214. package/src/restLevelClient/generateObjectTypes.ts +1 -3
  215. package/src/restLevelClient/generatePagingHelper.ts +3 -2
  216. package/src/restLevelClient/generateParameterTypes.ts +155 -25
  217. package/src/restLevelClient/generatePollingHelper.ts +3 -3
  218. package/src/restLevelClient/generateResponseTypes.ts +4 -1
  219. package/src/restLevelClient/generateRestLevel.ts +36 -8
  220. package/src/restLevelClient/generateSchemaTypes.ts +5 -3
  221. package/src/restLevelClient/generateTopLevelIndexFile.ts +37 -0
  222. package/src/restLevelClient/helpers/operationHelpers.ts +93 -0
  223. package/src/restLevelClient/interfaces.ts +26 -0
  224. package/src/restLevelClient/operationHelpers.ts +8 -2
  225. package/src/restLevelClient/schemaHelpers.ts +10 -3
  226. package/src/transforms/mapperTransforms.ts +1 -1
  227. package/src/transforms/objectTransforms.ts +1 -1
  228. package/src/transforms/operationTransforms.ts +1 -0
  229. package/src/transforms/parameterTransforms.ts +20 -4
  230. package/src/transforms/samplesTransforms.ts +300 -0
  231. package/src/transforms/transforms.ts +6 -6
  232. package/src/typescriptGenerator.ts +20 -11
  233. package/src/utils/autorestOptions.ts +170 -59
  234. package/src/utils/nameUtils.ts +16 -8
  235. package/src/utils/schemaHelpers.ts +2 -2
  236. package/dist/src/generators/clientContextFileGenerator.d.ts +0 -5
  237. package/dist/src/generators/clientContextFileGenerator.d.ts.map +0 -1
  238. package/dist/src/generators/clientContextFileGenerator.js +0 -263
  239. package/dist/src/generators/clientContextFileGenerator.js.map +0 -1
  240. package/dist/src/restLevelClient/helpers/getOperationParameters.d.ts +0 -6
  241. package/dist/src/restLevelClient/helpers/getOperationParameters.d.ts.map +0 -1
  242. package/dist/src/restLevelClient/helpers/getOperationParameters.js +0 -29
  243. package/dist/src/restLevelClient/helpers/getOperationParameters.js.map +0 -1
  244. package/src/generators/clientContextFileGenerator.ts +0 -405
  245. 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 => ({ parameter: p, operationName }));
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.forEach(request => {
157
- request.parameters?.forEach(parameter => {
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, parameters] = await Promise.all([
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 { Host } from "@autorest/extension-base";
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: 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, host);
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(clientDetails, project);
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.WriteFile(
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
  }