@autorest/typescript 6.0.0-beta.14 → 6.0.0-beta.17

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 (235) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +41 -5
  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 +20 -2
  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} +23 -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 +174 -48
  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 +35 -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 -163
  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 +186 -36
  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 +13 -7
  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 +26 -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 +41 -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 +4 -1
  143. package/dist/src/restLevelClient/schemaHelpers.js.map +1 -1
  144. package/dist/src/transforms/operationTransforms.d.ts.map +1 -1
  145. package/dist/src/transforms/operationTransforms.js +1 -0
  146. package/dist/src/transforms/operationTransforms.js.map +1 -1
  147. package/dist/src/transforms/samplesTransforms.d.ts +7 -0
  148. package/dist/src/transforms/samplesTransforms.d.ts.map +1 -0
  149. package/dist/src/transforms/samplesTransforms.js +283 -0
  150. package/dist/src/transforms/samplesTransforms.js.map +1 -0
  151. package/dist/src/transforms/transforms.d.ts +1 -2
  152. package/dist/src/transforms/transforms.d.ts.map +1 -1
  153. package/dist/src/transforms/transforms.js +4 -3
  154. package/dist/src/transforms/transforms.js.map +1 -1
  155. package/dist/src/typescriptGenerator.d.ts +2 -2
  156. package/dist/src/typescriptGenerator.d.ts.map +1 -1
  157. package/dist/src/typescriptGenerator.js +19 -8
  158. package/dist/src/typescriptGenerator.js.map +1 -1
  159. package/dist/src/utils/autorestOptions.d.ts +2 -2
  160. package/dist/src/utils/autorestOptions.d.ts.map +1 -1
  161. package/dist/src/utils/autorestOptions.js +107 -30
  162. package/dist/src/utils/autorestOptions.js.map +1 -1
  163. package/dist/src/utils/nameUtils.d.ts +6 -2
  164. package/dist/src/utils/nameUtils.d.ts.map +1 -1
  165. package/dist/src/utils/nameUtils.js +9 -5
  166. package/dist/src/utils/nameUtils.js.map +1 -1
  167. package/dist/src/utils/schemaHelpers.js +8 -3
  168. package/dist/src/utils/schemaHelpers.js.map +1 -1
  169. package/package.json +16 -10
  170. package/src/autorestSession.ts +20 -16
  171. package/src/conflictResolver.ts +0 -1
  172. package/src/generators/clientFileGenerator.ts +264 -33
  173. package/src/generators/indexGenerator.ts +78 -9
  174. package/src/generators/modelsGenerator.ts +21 -1
  175. package/src/generators/operationGenerator.ts +11 -9
  176. package/src/generators/samples/sampleEnv.hbs +4 -0
  177. package/src/generators/samples/sampleEnvGenerator.ts +14 -0
  178. package/src/generators/samples/sampleGenerator.ts +50 -0
  179. package/src/generators/static/apiExtractorConfig.ts +2 -2
  180. package/src/generators/static/esLintConfigGenerator.ts +24 -0
  181. package/src/generators/static/{README.md.hbs → hlcREADME.md.hbs} +23 -0
  182. package/src/generators/static/karma.conf.js.hbs +141 -0
  183. package/src/generators/static/karmaConfigFileGenerator.ts +20 -0
  184. package/src/generators/static/packageFileGenerator.ts +187 -48
  185. package/src/generators/static/readmeFileGenerator.ts +64 -35
  186. package/src/generators/static/rlcREADME.md.hbs +71 -0
  187. package/src/generators/static/rollupConfigFileGenerator.ts +13 -71
  188. package/src/generators/static/samples.ts.hbs +49 -0
  189. package/src/generators/static/tsConfigFileGenerator.ts +47 -20
  190. package/src/generators/test/envBrowserFileGenerator.ts +14 -0
  191. package/src/generators/test/envFileGenerator.ts +22 -0
  192. package/src/generators/test/recordedClientFileGenerator.ts +22 -0
  193. package/src/generators/test/rlcEnv.ts.hbs +3 -0
  194. package/src/generators/test/rlcRecordedClient.ts.hbs +35 -0
  195. package/src/generators/test/rlcSampleTest.spec.ts.hbs +19 -0
  196. package/src/generators/{static → test}/sampleTest.ts.hbs +0 -0
  197. package/src/generators/test/sampleTestGenerator.ts +23 -8
  198. package/src/generators/utils/pagingOperations.ts +1 -1
  199. package/src/main.ts +8 -5
  200. package/src/models/clientDetails.ts +8 -0
  201. package/src/models/modelDetails.ts +2 -2
  202. package/src/models/operationDetails.ts +1 -0
  203. package/src/models/sampleDetails.ts +22 -0
  204. package/src/restLevelClient/generateClient.ts +99 -250
  205. package/src/restLevelClient/generateClientDefinition.ts +343 -0
  206. package/src/restLevelClient/generateMethodShortcuts.ts +121 -0
  207. package/src/restLevelClient/generateObjectTypes.ts +1 -3
  208. package/src/restLevelClient/generatePagingHelper.ts +3 -2
  209. package/src/restLevelClient/generateParameterTypes.ts +295 -70
  210. package/src/restLevelClient/generatePollingHelper.ts +3 -3
  211. package/src/restLevelClient/generateResponseTypes.ts +13 -7
  212. package/src/restLevelClient/generateRestLevel.ts +32 -7
  213. package/src/restLevelClient/generateSchemaTypes.ts +5 -3
  214. package/src/restLevelClient/generateTopLevelIndexFile.ts +41 -0
  215. package/src/restLevelClient/helpers/operationHelpers.ts +93 -0
  216. package/src/restLevelClient/interfaces.ts +26 -0
  217. package/src/restLevelClient/operationHelpers.ts +8 -2
  218. package/src/restLevelClient/schemaHelpers.ts +4 -2
  219. package/src/transforms/operationTransforms.ts +1 -0
  220. package/src/transforms/samplesTransforms.ts +300 -0
  221. package/src/transforms/transforms.ts +6 -6
  222. package/src/typescriptGenerator.ts +20 -11
  223. package/src/utils/autorestOptions.ts +170 -59
  224. package/src/utils/nameUtils.ts +16 -8
  225. package/src/utils/schemaHelpers.ts +2 -2
  226. package/dist/src/generators/clientContextFileGenerator.d.ts +0 -5
  227. package/dist/src/generators/clientContextFileGenerator.d.ts.map +0 -1
  228. package/dist/src/generators/clientContextFileGenerator.js +0 -263
  229. package/dist/src/generators/clientContextFileGenerator.js.map +0 -1
  230. package/dist/src/restLevelClient/helpers/getOperationParameters.d.ts +0 -6
  231. package/dist/src/restLevelClient/helpers/getOperationParameters.d.ts.map +0 -1
  232. package/dist/src/restLevelClient/helpers/getOperationParameters.js +0 -29
  233. package/dist/src/restLevelClient/helpers/getOperationParameters.js.map +0 -1
  234. package/src/generators/clientContextFileGenerator.ts +0 -405
  235. package/src/restLevelClient/helpers/getOperationParameters.ts +0 -34
@@ -0,0 +1,93 @@
1
+ import {
2
+ ImplementationLocation,
3
+ Operation,
4
+ Parameter,
5
+ SchemaContext
6
+ } from "@autorest/codemodel";
7
+ import {
8
+ OptionalKind,
9
+ MethodSignatureStructure,
10
+ ParameterDeclarationStructure
11
+ } from "ts-morph";
12
+ import { Methods, PathParameter } from "../interfaces";
13
+ import { getElementType } from "../schemaHelpers";
14
+
15
+ /**
16
+ * Given an operation, extract all its parameters
17
+ */
18
+ export function getOperationParameters(
19
+ operation: Operation,
20
+ requestIndex = 0
21
+ ): Parameter[] {
22
+ const operationParams = [
23
+ ...(operation.parameters ?? []),
24
+ ...(operation.signatureParameters ?? [])
25
+ ];
26
+
27
+ const distinctParams = new Set(operationParams);
28
+
29
+ if (operation.requests) {
30
+ [
31
+ ...(operation.requests[requestIndex].parameters ?? []),
32
+ ...(operation.requests[requestIndex].signatureParameters ?? [])
33
+ ].forEach(p => distinctParams.add(p));
34
+ }
35
+
36
+ return [...distinctParams].filter(filterMethodNotSynthetic);
37
+ }
38
+
39
+ function filterMethodNotSynthetic(parameter: Parameter) {
40
+ const isApiVersion =
41
+ parameter.origin &&
42
+ parameter.language.default.serializedName === "api-version" &&
43
+ parameter.implementation === ImplementationLocation.Method;
44
+ // Origin is added by M4 on synthetic parameters
45
+ return (
46
+ (!parameter.origin || isApiVersion) &&
47
+ parameter.implementation === ImplementationLocation.Method
48
+ );
49
+ }
50
+
51
+ export function buildMethodDefinitions(
52
+ methods: Methods,
53
+ pathParams: PathParameter[] = []
54
+ ): OptionalKind<MethodSignatureStructure>[] {
55
+ const methodDefinitions: OptionalKind<MethodSignatureStructure>[] = [];
56
+ for (const key of Object.keys(methods)) {
57
+ const method = methods[key];
58
+ const description = methods[key][0].description;
59
+
60
+ let areAllOptional = methods[key][0].hasOptionalOptions;
61
+
62
+ methodDefinitions.push({
63
+ name: key,
64
+ ...(description && { docs: [{ description }] }),
65
+ parameters: [
66
+ ...getPathParamDefinitions(pathParams),
67
+ {
68
+ name: "options",
69
+ hasQuestionToken: areAllOptional,
70
+ type: method.map(m => m.optionsName).join(" | ")
71
+ }
72
+ ],
73
+ returnType: method.map(m => m.returnType).join(" | ")
74
+ });
75
+ }
76
+
77
+ return methodDefinitions;
78
+ }
79
+
80
+ export function getPathParamDefinitions(
81
+ pathParams: PathParameter[]
82
+ ): OptionalKind<ParameterDeclarationStructure>[] {
83
+ return pathParams.map(p => {
84
+ return {
85
+ name: p.name,
86
+ type: getElementType(p.schema, [
87
+ SchemaContext.Input,
88
+ SchemaContext.Exception
89
+ ]),
90
+ description: p.description
91
+ };
92
+ });
93
+ }
@@ -0,0 +1,26 @@
1
+ import { Schema } from "@autorest/codemodel";
2
+
3
+ export type PathParameter = {
4
+ name: string;
5
+ schema: Schema;
6
+ description?: string;
7
+ };
8
+
9
+ export type Methods = {
10
+ [key: string]: [
11
+ {
12
+ optionsName: string;
13
+ description: string;
14
+ hasOptionalOptions: boolean;
15
+ returnType: string;
16
+ }
17
+ ];
18
+ };
19
+
20
+ export type Paths = {
21
+ [key: string]: {
22
+ name: string;
23
+ pathParameters: PathParameter[];
24
+ methods: Methods;
25
+ };
26
+ };
@@ -2,7 +2,9 @@ import {
2
2
  AnyObjectSchema,
3
3
  Operation,
4
4
  SchemaResponse,
5
- Response
5
+ Response,
6
+ Schema,
7
+ BinarySchema
6
8
  } from "@autorest/codemodel";
7
9
  import { getLanguageMetadata } from "../utils/languageHelpers";
8
10
  import { NameType, normalizeName } from "../utils/nameUtils";
@@ -22,7 +24,11 @@ export function getResponseTypeName(
22
24
 
23
25
  export function responseToSchemaResponse(response: Response | SchemaResponse) {
24
26
  if (!isSchemaResponse(response)) {
25
- return new SchemaResponse(new AnyObjectSchema("AnyObject schema"), {
27
+ let schema: Schema = (response as any).binary
28
+ ? new BinarySchema("Binary schema")
29
+ : new AnyObjectSchema("AnyObject schema");
30
+
31
+ return new SchemaResponse(schema, {
26
32
  ...response
27
33
  });
28
34
  } else {
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  AnyObjectSchema,
3
3
  ArraySchema,
4
- ByteArraySchema,
5
4
  ChoiceSchema,
6
5
  ConstantSchema,
7
6
  DictionarySchema,
@@ -115,7 +114,6 @@ export function primitiveSchemaToType(
115
114
  case SchemaType.Char:
116
115
  return "string";
117
116
  case SchemaType.ByteArray:
118
- case SchemaType.Binary:
119
117
  case SchemaType.Duration:
120
118
  case SchemaType.Credential:
121
119
  case SchemaType.UnixTime:
@@ -123,6 +121,10 @@ export function primitiveSchemaToType(
123
121
  case SchemaType.Uuid:
124
122
  case SchemaType.String:
125
123
  return "string";
124
+ case SchemaType.Binary:
125
+ return schemaUse.includes(SchemaContext.Output)
126
+ ? "Uint8Array"
127
+ : "string | Uint8Array";
126
128
  case SchemaType.Boolean:
127
129
  return "boolean";
128
130
  case SchemaType.Choice:
@@ -491,6 +491,7 @@ export async function transformOperationGroup(
491
491
  return {
492
492
  name: operationGroupClassName,
493
493
  key: operationGroup.$key,
494
+ originalKey: operationGroup.$key,
494
495
  operations,
495
496
  isTopLevel,
496
497
  mediaTypes
@@ -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 { 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
  }