@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
@@ -230,7 +230,7 @@ export function writeAsyncIterators(
230
230
  * This method enforces Azure SDK Typescript guideline that paging methods should be named list*
231
231
  * https://azure.github.io/azure-sdk/typescript_design.html#ts-pagination-provide-list
232
232
  */
233
- function getPublicMethodName(operation: OperationDetails) {
233
+ export function getPublicMethodName(operation: OperationDetails) {
234
234
  let initialOperationName = normalizeName(operation.name, NameType.Operation);
235
235
  if (initialOperationName.indexOf("list") === 0) {
236
236
  initialOperationName = initialOperationName.replace("list", "");
package/src/main.ts CHANGED
@@ -1,7 +1,10 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT License.
3
3
 
4
- import { AutoRestExtension, Host } from "@autorest/extension-base";
4
+ import {
5
+ AutoRestExtension,
6
+ AutorestExtensionHost
7
+ } from "@autorest/extension-base";
5
8
  import { generateTypeScriptLibrary } from "./typescriptGenerator";
6
9
  import { generateRestLevelClient } from "./restLevelClient/generateRestLevel";
7
10
  import {
@@ -10,7 +13,7 @@ import {
10
13
  getAutorestOptions
11
14
  } from "./autorestSession";
12
15
 
13
- export async function processRequest(host: Host) {
16
+ export async function processRequest(host: AutorestExtensionHost) {
14
17
  await initializeSession(host);
15
18
  const session = getSession();
16
19
  const { restLevelClient } = getAutorestOptions();
@@ -19,7 +22,7 @@ export async function processRequest(host: Host) {
19
22
  restLevelClient
20
23
  ? await generateRestLevelClient()
21
24
  : await generateTypeScriptLibrary(session.model, host);
22
- session.log(`Autorest.Typescript took ${Date.now() - start}ms`, "");
25
+ session.info(`Autorest.Typescript took ${Date.now() - start}ms`);
23
26
  } catch (err) {
24
27
  session.error("An error was encountered while handling a request:", err);
25
28
  throw err;
@@ -28,8 +31,8 @@ export async function processRequest(host: Host) {
28
31
 
29
32
  async function main() {
30
33
  const pluginHost = new AutoRestExtension();
31
- pluginHost.Add("typescript", processRequest);
32
- await pluginHost.Run();
34
+ pluginHost.add("typescript", processRequest);
35
+ await pluginHost.run();
33
36
  }
34
37
 
35
38
  main();
@@ -9,6 +9,7 @@ import { ObjectDetails } from "./modelDetails";
9
9
  import { EndpointDetails } from "../transforms/urlTransforms";
10
10
  import { KnownMediaType } from "@azure-tools/codegen";
11
11
  import { Info } from "@autorest/codemodel";
12
+ import { SampleGroup } from "./sampleDetails";
12
13
 
13
14
  export interface ClientOptions {
14
15
  mediaTypes?: Set<KnownMediaType>;
@@ -20,6 +21,11 @@ export interface TracingInfo {
20
21
  packagePrefix: string;
21
22
  }
22
23
 
24
+ export interface DependencyInfo {
25
+ link: string;
26
+ description: string;
27
+ }
28
+
23
29
  export interface ClientDetails {
24
30
  name: string;
25
31
  className: string;
@@ -32,4 +38,6 @@ export interface ClientDetails {
32
38
  parameters: ParameterDetails[];
33
39
  options: ClientOptions;
34
40
  endpoint: EndpointDetails;
41
+ samples?: SampleGroup[];
42
+ allTypes: string[];
35
43
  }
@@ -65,7 +65,7 @@ export type PolymorphicObjectDetails = BasicObjectDetails & {
65
65
  export interface PropertyDetails {
66
66
  name: string;
67
67
  description?: string;
68
- defaultValue?: string;
68
+ defaultValue?: string | number | boolean;
69
69
  serializedName: string;
70
70
  type: string;
71
71
  required: boolean;
@@ -83,7 +83,7 @@ export interface TypeDetails {
83
83
  typeName: string;
84
84
  isConstant?: boolean;
85
85
  nullable?: boolean;
86
- defaultValue?: string;
86
+ defaultValue?: string | number | boolean;
87
87
  kind: PropertyKind;
88
88
  usedModels: string[];
89
89
  }
@@ -103,6 +103,7 @@ export interface OperationSpecDetails {
103
103
  export interface OperationGroupDetails {
104
104
  key: string;
105
105
  name: string;
106
+ originalKey: string;
106
107
  operations: OperationDetails[];
107
108
  mediaTypes: Set<KnownMediaType>;
108
109
  isTopLevel: boolean;
@@ -0,0 +1,22 @@
1
+ export interface SampleGroup {
2
+ sampleFileName: string,
3
+ clientClassName: string,
4
+ clientPackageName: string,
5
+ samples: SampleDetails[],
6
+ importedTypes?: string[],
7
+ }
8
+
9
+ export interface SampleDetails {
10
+ sampleFunctionName: string,
11
+ clientParameterNames: string,
12
+ methodParameterNames: string,
13
+ clientParamAssignments: string[],
14
+ methodParamAssignments: string[],
15
+ originalFileLocation?: string,
16
+ operationName: string,
17
+ isTopLevel: boolean,
18
+ isPaging: boolean,
19
+ operationGroupName: string,
20
+ operationDescription: string,
21
+ clientClassName: string,
22
+ }
@@ -2,136 +2,47 @@ import {
2
2
  CodeModel,
3
3
  Operation,
4
4
  ParameterLocation,
5
- ImplementationLocation,
6
- Schema,
7
- SchemaContext
5
+ ImplementationLocation
8
6
  } from "@autorest/codemodel";
9
7
 
10
- import { getResponseTypeName } from "./operationHelpers";
11
-
12
8
  import {
13
- CallSignatureDeclarationStructure,
14
- MethodSignatureStructure,
15
- OptionalKind,
16
9
  Project,
17
- SourceFile,
18
10
  StatementStructures,
19
11
  StructureKind,
20
12
  VariableDeclarationKind,
21
13
  VariableStatementStructure,
22
- WriterFunction,
23
- Writers
14
+ WriterFunction
24
15
  } from "ts-morph";
16
+ import * as path from "path";
25
17
 
26
18
  import { getAutorestOptions, getSession } from "../autorestSession";
27
19
  import { transformBaseUrl } from "../transforms/urlTransforms";
28
20
  import { NameType, normalizeName } from "../utils/nameUtils";
29
- import { isConstantSchema, getElementType } from "./schemaHelpers";
21
+ import { isConstantSchema } from "./schemaHelpers";
30
22
  import { getLanguageMetadata } from "../utils/languageHelpers";
31
- import { getOperationParameters } from "./helpers/getOperationParameters";
32
- import { ParameterPath } from "@azure/core-http";
33
-
34
- type PathParameter = { name: string; schema: Schema, description?: string };
23
+ import { generateMethodShortcutImplementation } from "./generateMethodShortcuts";
24
+ import { Paths } from "./interfaces";
25
+ import { pathDictionary } from "./generateClientDefinition";
35
26
 
36
- type Methods = {
37
- [key: string]: [
38
- {
39
- optionsName: string;
40
- description: string;
41
- hasOptionalOptions: boolean;
42
- returnType: string;
43
- }
44
- ];
45
- };
46
- type Paths = {
47
- [key: string]: {
48
- name: string;
49
- pathParameters: PathParameter[];
50
- methods: Methods;
51
- };
52
- };
53
-
54
- export function generatePathFirstClient(model: CodeModel, project: Project) {
27
+ export function generateClient(model: CodeModel, project: Project) {
55
28
  const name = normalizeName(
56
29
  getLanguageMetadata(model.language).name,
57
30
  NameType.File
58
31
  );
59
- const clientFile = project.createSourceFile(`src/${name}.ts`, undefined, {
60
- overwrite: true
61
- });
62
-
63
- // Get all paths
64
- const importedParameters = new Set<string>();
65
- const importedResponses = new Set<string>();
66
- const pathDictionary: Paths = {};
67
- for (const operationGroup of model.operationGroups) {
68
- for (const operation of operationGroup.operations) {
69
- const operationName = getLanguageMetadata(operation.language).name;
70
- const operationDescription = getLanguageMetadata(operation.language)
71
- .description;
72
- const pathParameters: PathParameter[] =
73
- operation.parameters
74
- ?.filter(p => p.protocol.http?.in === ParameterLocation.Path)
75
- .map(p => {
76
- const languageMetadata = getLanguageMetadata(p.language);
77
- return {
78
- name: languageMetadata.serializedName || languageMetadata.name,
79
- schema: p.schema,
80
- description: languageMetadata.description
81
- };
82
- }) || [];
83
- const path: string = operation.requests?.[0].protocol.http?.path;
84
- pathParameters.sort(function compare(a: PathParameter, b: PathParameter) {
85
- return path.indexOf(a.name) - path.indexOf(b.name);
86
- })
87
-
88
- for (const request of operation.requests || []) {
89
- const path: string = (request.protocol.http?.path as string) || "";
90
- const method = request.protocol.http?.method;
91
-
92
- if (path && method) {
93
- if (!pathDictionary[path]) {
94
- pathDictionary[path] = {
95
- pathParameters,
96
- methods: {},
97
- name: operationName
98
- };
99
- }
100
- const hasOptionalOptions = !hasRequiredOptions(operation);
101
-
102
- const newMethod = {
103
- description: operationDescription,
104
- optionsName: getOperationOptionsType(operation, importedParameters),
105
- hasOptionalOptions,
106
- returnType: `Promise<${getOperationReturnType(
107
- operation,
108
- importedResponses
109
- )}>`
110
- };
111
-
112
- if (pathDictionary[path].methods[`${method}`]) {
113
- pathDictionary[path].methods[`${method}`].push(newMethod);
114
- } else {
115
- pathDictionary[path].methods[`${method}`] = [newMethod];
116
- }
117
- }
118
- }
32
+ const { srcPath } = getAutorestOptions();
33
+ const clientFile = project.createSourceFile(
34
+ path.join(srcPath, `${name}.ts`),
35
+ undefined,
36
+ {
37
+ overwrite: true
119
38
  }
120
- }
121
-
122
- clientFile.addInterface({
123
- name: "Routes",
124
- isExported: true,
125
- callSignatures: getPathFirstRoutesInterfaceDefinition(
126
- pathDictionary,
127
- clientFile
128
- )
129
- });
39
+ );
130
40
 
41
+ // Get all paths
131
42
  const clientName = getLanguageMetadata(model.language).name;
132
43
  const uriParameter = getClientUriParameter();
133
44
 
134
- const { addCredentials, credentialKeyHeaderName } = getAutorestOptions();
45
+ const { addCredentials, credentialKeyHeaderName, multiClient, batch, credentialScopes } = getAutorestOptions();
135
46
  const credentialTypes = addCredentials ? ["TokenCredential"] : [];
136
47
 
137
48
  if (credentialKeyHeaderName) {
@@ -140,84 +51,59 @@ export function generatePathFirstClient(model: CodeModel, project: Project) {
140
51
 
141
52
  const commonClientParams = [
142
53
  ...(uriParameter ? [{ name: uriParameter, type: "string" }] : []),
143
- ...(addCredentials === false
54
+ ...(addCredentials === false || !credentialScopes || credentialScopes.length === 0
144
55
  ? []
145
56
  : [{ name: "credentials", type: credentialTypes.join(" | ") }])
146
57
  ];
147
- const clientIterfaceName = `${clientName}RestClient`;
148
- // const factoryTypeName = `${clientName}Factory`;
149
- clientFile.addTypeAlias({
150
- isExported: true,
151
- name: clientIterfaceName,
152
- type: Writers.intersectionType(
153
- "Client",
154
- Writers.objectType({ properties: [{ name: "path", type: "Routes" }] })
155
- )
156
- });
58
+ const clientInterfaceName = clientName.endsWith("Client")? `${clientName}`: `${clientName}Client`;
157
59
 
158
- clientFile.addFunction({
60
+ const functionStatement = {
159
61
  isExported: true,
160
- name: clientName,
62
+ name: `createClient`,
161
63
  parameters: [
162
64
  ...commonClientParams,
163
65
  { name: "options", type: "ClientOptions = {}" }
164
66
  ],
165
- returnType: clientIterfaceName,
166
- isDefaultExport: true,
167
- statements: getClientFactoryBody(clientIterfaceName)
168
- });
169
-
170
- if (importedParameters.size) {
171
- clientFile.addImportDeclaration({
172
- namedImports: [...importedParameters],
173
- moduleSpecifier: "./parameters"
174
- });
175
- }
67
+ returnType: clientInterfaceName,
68
+ isDefaultExport: false,
69
+ statements: getClientFactoryBody(clientInterfaceName, pathDictionary)
70
+ };
176
71
 
177
- if (importedResponses.size) {
178
- clientFile.addImportDeclaration({
179
- namedImports: [...importedResponses],
180
- moduleSpecifier: "./responses"
181
- });
72
+ if (!multiClient || !batch || batch.length === 1) {
73
+ functionStatement.isDefaultExport = true;
182
74
  }
75
+ clientFile.addFunction(functionStatement);
183
76
 
184
77
  clientFile.addImportDeclarations([
185
78
  {
186
- namedImports: ["getClient", "ClientOptions", "Client"],
79
+ namedImports: ["getClient", "ClientOptions"],
187
80
  moduleSpecifier: "@azure-rest/core-client"
188
81
  }
189
82
  ]);
190
83
 
84
+ if (addCredentials && credentialScopes && credentialScopes.length > 0) {
85
+ clientFile.addImportDeclarations([
86
+ {
87
+ namedImports: credentialTypes,
88
+ moduleSpecifier: "@azure/core-auth"
89
+ }
90
+ ]);
91
+ }
191
92
  clientFile.addImportDeclarations([
192
93
  {
193
- namedImports: credentialTypes,
194
- moduleSpecifier: "@azure/core-auth"
94
+ namedImports: [`${clientInterfaceName}`],
95
+ moduleSpecifier: "./clientDefinitions"
195
96
  }
196
97
  ]);
197
98
  }
198
99
 
199
- function hasRequiredOptions(operation: Operation) {
200
- return getOperationParameters(operation)
201
- .filter(p => p.implementation === ImplementationLocation.Method)
202
- .filter(p => ["query", "body", "headers"].includes(p.protocol.http?.in))
203
- .some(p => p.required);
204
- }
205
-
206
- function getOperationOptionsType(
207
- operation: Operation,
208
- importedParameters = new Set<string>()
209
- ) {
210
- const paramsName = `${
211
- getLanguageMetadata(operation.language).name
212
- }Parameters`;
213
- importedParameters.add(paramsName);
214
-
215
- return paramsName;
216
- }
217
-
218
100
  function getClientFactoryBody(
219
- clientTypeName: string
101
+ clientTypeName: string,
102
+ paths: Paths
220
103
  ): string | WriterFunction | (string | WriterFunction | StatementStructures)[] {
104
+ const { rlcShortcut, packageDetails } = getAutorestOptions();
105
+ let clientPackageName = packageDetails.nameWithoutScope;
106
+ const packageVersion = packageDetails.version;
221
107
  const { model } = getSession();
222
108
  const { endpoint, parameterName } = transformBaseUrl(model);
223
109
  let baseUrl: string;
@@ -237,6 +123,30 @@ function getClientFactoryBody(
237
123
  apiVersionStatement = `options.apiVersion = options.apiVersion ?? "${apiVersion}"`;
238
124
  }
239
125
 
126
+ if (!clientPackageName.endsWith("-rest")) {
127
+ clientPackageName = clientPackageName + "-rest";
128
+ }
129
+ const userAgentInfoStatement =
130
+ "const userAgentInfo = `azsdk-js-" +
131
+ clientPackageName +
132
+ "/" +
133
+ packageVersion +
134
+ "`;";
135
+ const userAgentPrefix =
136
+ "options.userAgentOptions && options.userAgentOptions.userAgentPrefix ? `${options.userAgentOptions.userAgentPrefix} ${userAgentInfo}`: `${userAgentInfo}`;";
137
+ const userAgentStatement: VariableStatementStructure = {
138
+ kind: StructureKind.VariableStatement,
139
+ declarationKind: VariableDeclarationKind.Const,
140
+ declarations: [{ name: "userAgentPrefix", initializer: userAgentPrefix }]
141
+ };
142
+
143
+ const userAgentOptionsStatement = `options = {
144
+ ...options,
145
+ userAgentOptions: {
146
+ userAgentPrefix
147
+ }
148
+ }`;
149
+
240
150
  const baseUrlStatement: VariableStatementStructure = {
241
151
  kind: StructureKind.VariableStatement,
242
152
  declarationKind: VariableDeclarationKind.Const,
@@ -262,17 +172,43 @@ function getClientFactoryBody(
262
172
  credentials: {
263
173
  ${scopes}
264
174
  ${apiKeyHeaderName}
265
- }
175
+ },
266
176
  }`
267
177
  : "";
268
178
 
269
- const getClient = `return getClient(
270
- baseUrl,
271
- ${credentials ? "credentials," : ""}
272
- options
273
- ) as ${clientTypeName};`;
179
+ const getClient = `const client = getClient(
180
+ baseUrl, ${credentials ? "credentials," : ""} options
181
+ ) as ${clientTypeName};
182
+ `;
274
183
 
275
- return [baseUrlStatement, apiVersionStatement, credentials, getClient];
184
+ let returnStatement = `return client;`;
185
+
186
+ if (rlcShortcut) {
187
+ const shortcutImplementations = generateMethodShortcutImplementation(
188
+ model,
189
+ paths
190
+ );
191
+ const shortcutBody = Object.keys(shortcutImplementations).map(key => {
192
+ // If the operation group has an empty name, it means its operations are client
193
+ // level operations so we need to spread the definitions. Otherwise they are
194
+ // within an operation group so we add them as key: value
195
+ return `${key ? `"${key}":` : "..."} {${shortcutImplementations[
196
+ key
197
+ ].join()}}`;
198
+ });
199
+ returnStatement = `return { ...client, ${shortcutBody.join()} };`;
200
+ }
201
+
202
+ return [
203
+ baseUrlStatement,
204
+ apiVersionStatement,
205
+ credentials,
206
+ userAgentInfoStatement,
207
+ userAgentStatement,
208
+ userAgentOptionsStatement,
209
+ getClient,
210
+ returnStatement
211
+ ];
276
212
  }
277
213
 
278
214
  function getApiVersion(): string | undefined {
@@ -299,103 +235,8 @@ function getApiVersion(): string | undefined {
299
235
  return undefined;
300
236
  }
301
237
 
302
- function getOperationReturnType(
303
- operation: Operation,
304
- importedResponses = new Set<string>()
305
- ) {
306
- let returnType: string = "HttpResponse";
307
- if (operation.responses && operation.responses.length) {
308
- const responses = [...operation.responses, ...(operation.exceptions || [])];
309
-
310
- const responseTypes = responses
311
- .filter(
312
- r => r.protocol.http?.statusCodes && r.protocol.http?.statusCodes.length
313
- )
314
- .map(r => {
315
- const responseName = getResponseTypeName(operation, r);
316
- importedResponses.add(responseName);
317
- return responseName;
318
- });
319
-
320
- if (responseTypes.length) {
321
- returnType = responseTypes.join(" | ");
322
- }
323
- }
324
-
325
- return returnType;
326
- }
327
-
328
- function getPathFirstRoutesInterfaceDefinition(
329
- paths: Paths,
330
- sourcefile: SourceFile
331
- ): CallSignatureDeclarationStructure[] {
332
- const signatures: CallSignatureDeclarationStructure[] = [];
333
- for (const key of Object.keys(paths)) {
334
- generatePathFirstRouteMethodsDefinition(
335
- paths[key].name,
336
- paths[key].methods,
337
- sourcefile
338
- );
339
- const pathParams = paths[key].pathParameters;
340
- signatures.push({
341
- docs: [
342
- `Resource for '${key
343
- .replace(/}/g, "\\}")
344
- .replace(
345
- /{/g,
346
- "\\{"
347
- )}' has methods for the following verbs: ${Object.keys(
348
- paths[key].methods
349
- ).join(", ")}`
350
- ],
351
- parameters: [
352
- { name: "path", type: `"${key}"` },
353
- ...pathParams.map(p => {
354
- return { name: p.name, type: getElementType(p.schema, [SchemaContext.Input, SchemaContext.Exception]), description: p.description };
355
- })
356
- ],
357
- returnType: paths[key].name,
358
- kind: StructureKind.CallSignature
359
- });
360
- }
361
- return signatures;
362
- }
363
-
364
238
  function getClientUriParameter() {
365
239
  const { model } = getSession();
366
240
  const { parameterName } = transformBaseUrl(model);
367
241
  return parameterName;
368
242
  }
369
-
370
- function generatePathFirstRouteMethodsDefinition(
371
- operationName: string,
372
- methods: Methods,
373
- file: SourceFile
374
- ): void {
375
- const methodDefinitions: OptionalKind<MethodSignatureStructure>[] = [];
376
- for (const key of Object.keys(methods)) {
377
- const method = methods[key];
378
- const description = methods[key][0].description;
379
-
380
- let areAllOptional = !method.some(m => !m.hasOptionalOptions);
381
-
382
- methodDefinitions.push({
383
- name: key,
384
- ...(description && { docs: [{ description }] }),
385
- parameters: [
386
- {
387
- name: "options",
388
- hasQuestionToken: areAllOptional,
389
- type: method.map(m => m.optionsName).join(" | ")
390
- }
391
- ],
392
- returnType: method.map(m => m.returnType).join(" | ")
393
- });
394
- }
395
-
396
- file.addInterface({
397
- methods: methodDefinitions,
398
- name: operationName,
399
- isExported: true
400
- });
401
- }