@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,343 @@
1
+ import {
2
+ CodeModel,
3
+ Operation,
4
+ ParameterLocation,
5
+ ImplementationLocation
6
+ } from "@autorest/codemodel";
7
+
8
+ import { getResponseTypeName } from "./operationHelpers";
9
+
10
+ import {
11
+ CallSignatureDeclarationStructure,
12
+ Project,
13
+ SourceFile,
14
+ StructureKind,
15
+ Writers
16
+ } from "ts-morph";
17
+ import * as path from "path";
18
+
19
+ import { getAutorestOptions, getSession } from "../autorestSession";
20
+ import { transformBaseUrl } from "../transforms/urlTransforms";
21
+ import { CasingConvention, NameType, normalizeName } from "../utils/nameUtils";
22
+ import { getLanguageMetadata } from "../utils/languageHelpers";
23
+ import {
24
+ buildMethodDefinitions,
25
+ getOperationParameters,
26
+ getPathParamDefinitions
27
+ } from "./helpers/operationHelpers";
28
+ import {
29
+ generateMethodShortcuts,
30
+ REST_CLIENT_RESERVED
31
+ } from "./generateMethodShortcuts";
32
+ import { Methods, PathParameter, Paths } from "./interfaces";
33
+ export let pathDictionary: Paths = {};
34
+
35
+ export function generatePathFirstClient(model: CodeModel, project: Project) {
36
+ const name = normalizeName(
37
+ getLanguageMetadata(model.language).name,
38
+ NameType.File
39
+ );
40
+ const { srcPath } = getAutorestOptions();
41
+ const clientFile = project.createSourceFile(
42
+ path.join(srcPath, `clientDefinitions.ts`),
43
+ undefined,
44
+ {
45
+ overwrite: true
46
+ }
47
+ );
48
+
49
+ // Get all paths
50
+ const importedParameters = new Set<string>();
51
+ const importedResponses = new Set<string>();
52
+ const clientImports = new Set<string>();
53
+ pathDictionary = {};
54
+ for (const operationGroup of model.operationGroups) {
55
+ for (const operation of operationGroup.operations) {
56
+ const operationName = getLanguageMetadata(operation.language).name;
57
+ const operationDescription = getLanguageMetadata(operation.language)
58
+ .description;
59
+ const pathParameters: PathParameter[] =
60
+ operation.parameters
61
+ ?.filter(p => p.protocol.http?.in === ParameterLocation.Path)
62
+ .map(p => {
63
+ const languageMetadata = getLanguageMetadata(p.language);
64
+ return {
65
+ name: languageMetadata.serializedName || languageMetadata.name,
66
+ schema: p.schema,
67
+ description: languageMetadata.description
68
+ };
69
+ }) || [];
70
+ const path: string = operation.requests?.[0].protocol.http?.path;
71
+ pathParameters.sort(function compare(a: PathParameter, b: PathParameter) {
72
+ return path.indexOf(a.name) - path.indexOf(b.name);
73
+ });
74
+
75
+ for (const request of operation.requests || []) {
76
+ const path: string = (request.protocol.http?.path as string) || "";
77
+ const method = request.protocol.http?.method;
78
+
79
+ if (path && method) {
80
+ if (!pathDictionary[path]) {
81
+ pathDictionary[path] = {
82
+ pathParameters,
83
+ methods: {},
84
+ name: operationName
85
+ };
86
+ }
87
+ const hasOptionalOptions = !hasRequiredOptions(operation);
88
+
89
+ const newMethod = {
90
+ description: operationDescription,
91
+ optionsName: getOperationOptionsType(operation, importedParameters),
92
+ hasOptionalOptions,
93
+ returnType: `Promise<${getOperationReturnType(
94
+ operation,
95
+ importedResponses,
96
+ clientImports
97
+ )}>`
98
+ };
99
+
100
+ if (pathDictionary[path].methods[`${method}`]) {
101
+ pathDictionary[path].methods[`${method}`].push(newMethod);
102
+ } else {
103
+ pathDictionary[path].methods[`${method}`] = [newMethod];
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+
110
+ writeShortcutInterface(model, pathDictionary, clientFile);
111
+ clientFile.addInterface({
112
+ name: "Routes",
113
+ isExported: true,
114
+ callSignatures: getPathFirstRoutesInterfaceDefinition(
115
+ pathDictionary,
116
+ clientFile
117
+ )
118
+ });
119
+
120
+ const clientName = getLanguageMetadata(model.language).name;
121
+
122
+ const clientInterfaceName = `${clientName}Like`;
123
+
124
+ const { rlcShortcut } = getAutorestOptions();
125
+
126
+ let shortcutElements = !rlcShortcut
127
+ ? []
128
+ : model.operationGroups.map(og => {
129
+ const groupName = og.language.default.name;
130
+ const name = normalizeName(
131
+ groupName,
132
+ NameType.OperationGroup,
133
+ true,
134
+ REST_CLIENT_RESERVED,
135
+ CasingConvention.Camel
136
+ );
137
+ const interfaceName = normalizeName(
138
+ `${name}Operations`,
139
+ NameType.Interface,
140
+ true,
141
+ REST_CLIENT_RESERVED
142
+ );
143
+ return { name, type: interfaceName };
144
+ });
145
+
146
+ // There may be operations without an operation group, those shortcut
147
+ // methods need to be handled differently.
148
+ const shortcutsInOperationGroup = shortcutElements.filter(s => s.name);
149
+
150
+ clientFile.addTypeAlias({
151
+ isExported: true,
152
+ name: clientInterfaceName,
153
+ type: Writers.intersectionType(
154
+ "Client",
155
+ Writers.objectType({
156
+ properties: [
157
+ { name: "path", type: "Routes" },
158
+ ...shortcutsInOperationGroup
159
+ ]
160
+ }),
161
+ // If the length of shortcutMethods in operation group and all shortcutMethods
162
+ // is the same, then we don't have any operations at the client level
163
+ // Otherwise we need to make the client interface name an union with the
164
+ // definition of all client level shortcut methods
165
+ ...(shortcutsInOperationGroup.length !== shortcutElements.length
166
+ ? [`ClientOperations`]
167
+ : [])
168
+ )
169
+ });
170
+
171
+ if (importedParameters.size) {
172
+ clientFile.addImportDeclaration({
173
+ namedImports: [...importedParameters],
174
+ moduleSpecifier: "./parameters"
175
+ });
176
+ }
177
+
178
+ if (importedResponses.size) {
179
+ clientFile.addImportDeclaration({
180
+ namedImports: [...importedResponses],
181
+ moduleSpecifier: "./responses"
182
+ });
183
+ }
184
+
185
+ clientImports.add("Client");
186
+ clientFile.addImportDeclarations([
187
+ {
188
+ namedImports: [...clientImports],
189
+ moduleSpecifier: "@azure-rest/core-client"
190
+ }
191
+ ]);
192
+ }
193
+
194
+ function writeShortcutInterface(
195
+ model: CodeModel,
196
+ pathDictionary: Paths,
197
+ clientFile: SourceFile
198
+ ) {
199
+ const { rlcShortcut } = getAutorestOptions();
200
+ if (!rlcShortcut) {
201
+ return;
202
+ }
203
+
204
+ // Create a map of Operation group descriptions
205
+ const descriptions = model.operationGroups.reduce((map, current) => {
206
+ const { name, description } = current.language.default;
207
+ map.set(name, description);
208
+
209
+ return map;
210
+ }, new Map<string, string>());
211
+
212
+ const shortcuts = generateMethodShortcuts(model, pathDictionary);
213
+
214
+ for (const group of Object.keys(shortcuts)) {
215
+ const groupName =
216
+ normalizeName(group, NameType.Interface, true, REST_CLIENT_RESERVED) ||
217
+ "Client";
218
+ const groupOperations = shortcuts[group];
219
+
220
+ clientFile.addInterface({
221
+ docs: [
222
+ descriptions.get(group) ||
223
+ `Contains operations for ${groupName} operations`
224
+ ],
225
+ name: `${groupName}Operations`,
226
+ isExported: true,
227
+ methods: groupOperations
228
+ });
229
+ }
230
+ }
231
+
232
+ function hasRequiredOptions(operation: Operation) {
233
+ return getOperationParameters(operation)
234
+ .filter(p => p.implementation === ImplementationLocation.Method)
235
+ .filter(p => ["query", "body", "headers"].includes(p.protocol.http?.in))
236
+ .some(p => p.required);
237
+ }
238
+
239
+ function getOperationOptionsType(
240
+ operation: Operation,
241
+ importedParameters = new Set<string>()
242
+ ) {
243
+ const paramsName = `${
244
+ getLanguageMetadata(operation.language).name
245
+ }Parameters`;
246
+ importedParameters.add(paramsName);
247
+
248
+ return paramsName;
249
+ }
250
+
251
+ function getOperationReturnType(
252
+ operation: Operation,
253
+ importedResponses = new Set<string>(),
254
+ coreClientImports = new Set<string>()
255
+ ) {
256
+ let returnType: string = "HttpResponse";
257
+ if (
258
+ (operation.responses && operation.responses.length) ||
259
+ (operation.exceptions && operation.exceptions.length)
260
+ ) {
261
+ const responses = [
262
+ ...(operation.responses ?? []),
263
+ ...(operation.exceptions ?? [])
264
+ ];
265
+ const responseTypes = responses
266
+ .filter(
267
+ r => r.protocol.http?.statusCodes && r.protocol.http?.statusCodes.length
268
+ )
269
+ .map(r => {
270
+ const responseName = getResponseTypeName(operation, r);
271
+ importedResponses.add(responseName);
272
+ return responseName;
273
+ });
274
+
275
+ if (responseTypes.length) {
276
+ if (
277
+ responseTypes.indexOf("HttpResponse") > -1 &&
278
+ !coreClientImports.has(returnType)
279
+ ) {
280
+ coreClientImports.add("HttpResponse");
281
+ }
282
+ returnType = responseTypes.join(" | ");
283
+ }
284
+ }
285
+ if (returnType === "HttpResponse" && !coreClientImports.has(returnType)) {
286
+ coreClientImports.add(returnType);
287
+ }
288
+ return returnType;
289
+ }
290
+
291
+ function getPathFirstRoutesInterfaceDefinition(
292
+ paths: Paths,
293
+ sourcefile: SourceFile
294
+ ): CallSignatureDeclarationStructure[] {
295
+ const signatures: CallSignatureDeclarationStructure[] = [];
296
+ for (const key of Object.keys(paths)) {
297
+ generatePathFirstRouteMethodsDefinition(
298
+ paths[key].name,
299
+ paths[key].methods,
300
+ sourcefile
301
+ );
302
+ const pathParams = paths[key].pathParameters;
303
+ signatures.push({
304
+ docs: [
305
+ `Resource for '${key
306
+ .replace(/}/g, "\\}")
307
+ .replace(
308
+ /{/g,
309
+ "\\{"
310
+ )}' has methods for the following verbs: ${Object.keys(
311
+ paths[key].methods
312
+ ).join(", ")}`
313
+ ],
314
+ parameters: [
315
+ { name: "path", type: `"${key}"` },
316
+ ...getPathParamDefinitions(pathParams)
317
+ ],
318
+ returnType: paths[key].name,
319
+ kind: StructureKind.CallSignature
320
+ });
321
+ }
322
+ return signatures;
323
+ }
324
+
325
+ function getClientUriParameter() {
326
+ const { model } = getSession();
327
+ const { parameterName } = transformBaseUrl(model);
328
+ return parameterName;
329
+ }
330
+
331
+ function generatePathFirstRouteMethodsDefinition(
332
+ operationName: string,
333
+ methods: Methods,
334
+ file: SourceFile
335
+ ): void {
336
+ const methodDefinitions = buildMethodDefinitions(methods);
337
+
338
+ file.addInterface({
339
+ methods: methodDefinitions,
340
+ name: operationName,
341
+ isExported: true
342
+ });
343
+ }
@@ -0,0 +1,121 @@
1
+ import { CodeModel, Operation } from "@autorest/codemodel";
2
+ import { OptionalKind, MethodSignatureStructure } from "ts-morph";
3
+ import {
4
+ CasingConvention,
5
+ NameType,
6
+ normalizeName,
7
+ ReservedName
8
+ } from "../utils/nameUtils";
9
+ import { buildMethodDefinitions } from "./helpers/operationHelpers";
10
+ import { PathParameter, Paths } from "./interfaces";
11
+
12
+ export const REST_CLIENT_RESERVED: ReservedName[] = [
13
+ { name: "path", reservedFor: [NameType.Property, NameType.OperationGroup] },
14
+ {
15
+ name: "pathUnchecked",
16
+ reservedFor: [NameType.Property, NameType.OperationGroup]
17
+ },
18
+ {
19
+ name: "pipeline",
20
+ reservedFor: [NameType.Property, NameType.OperationGroup]
21
+ }
22
+ ];
23
+ export function generateMethodShortcuts(model: CodeModel, paths: Paths) {
24
+ const operationGroups = model.operationGroups;
25
+ let keys: Record<string, OptionalKind<MethodSignatureStructure>[]> = {};
26
+ for (const group of operationGroups) {
27
+ const groupName = normalizeName(
28
+ group.language.default.name,
29
+ NameType.OperationGroup,
30
+ true,
31
+ REST_CLIENT_RESERVED,
32
+ CasingConvention.Camel
33
+ );
34
+
35
+ keys[groupName] = buildOperationDefinitions(group.operations, paths);
36
+ }
37
+ return keys;
38
+ }
39
+
40
+ export function generateMethodShortcutImplementation(
41
+ model: CodeModel,
42
+ paths: Paths
43
+ ) {
44
+ const operationGroups = model.operationGroups;
45
+ let keys: Record<string, string[]> = {};
46
+ for (const group of operationGroups) {
47
+ const groupName = normalizeName(
48
+ group.language.default.name,
49
+ NameType.OperationGroup,
50
+ true,
51
+ REST_CLIENT_RESERVED,
52
+ CasingConvention.Camel
53
+ );
54
+
55
+ keys[groupName] = buildOperationDeclarations(group.operations, paths);
56
+ }
57
+ return keys;
58
+ }
59
+
60
+ function buildOperationDeclarations(operations: Operation[], paths: Paths) {
61
+ let ops: string[] = [];
62
+
63
+ for (const operation of operations) {
64
+ const name = normalizeName(
65
+ operation.language.default.name,
66
+ NameType.Property,
67
+ true
68
+ );
69
+
70
+ const path = operation.requests![0].protocol.http?.path;
71
+ const method = operation.requests![0].protocol.http?.method;
72
+ const pathParams = paths[path]?.pathParameters;
73
+ const methodDefinitions = generateOperationDeclaration(
74
+ path,
75
+ name,
76
+ method,
77
+ pathParams
78
+ );
79
+ ops = [...ops, methodDefinitions];
80
+ }
81
+
82
+ return ops;
83
+ }
84
+
85
+ function generateOperationDeclaration(
86
+ path: string,
87
+ operationName: string,
88
+ method: string,
89
+ pathParams: PathParameter[] = []
90
+ ): string {
91
+ const pathParamNames = `${
92
+ pathParams.length > 0 ? `${pathParams.map(p => p.name)},` : ""
93
+ }`;
94
+ return `"${operationName}": (${pathParamNames} options) => {
95
+ return client.path("${path}", ${pathParamNames}).${method}(options);
96
+ }`;
97
+ }
98
+
99
+ function buildOperationDefinitions(operations: Operation[], paths: Paths) {
100
+ let ops: OptionalKind<MethodSignatureStructure>[] = [];
101
+
102
+ for (const operation of operations) {
103
+ const name = normalizeName(
104
+ operation.language.default.name,
105
+ NameType.Property,
106
+ true
107
+ );
108
+
109
+ const path = operation.requests![0].protocol.http?.path;
110
+ const method: string = operation.requests![0].protocol.http?.method;
111
+ const methods = paths[path]?.methods[method];
112
+ const pathParams = paths[path]?.pathParameters;
113
+ const methodDefinitions = buildMethodDefinitions(
114
+ { [name]: methods },
115
+ pathParams
116
+ );
117
+ ops = [...ops, ...methodDefinitions];
118
+ }
119
+
120
+ return ops;
121
+ }
@@ -4,13 +4,11 @@ import {
4
4
  isObjectSchema,
5
5
  ObjectSchema,
6
6
  Property,
7
- SchemaContext,
8
- SchemaUsage
7
+ SchemaContext
9
8
  } from "@autorest/codemodel";
10
9
  import { Channel } from "@autorest/extension-base";
11
10
  import {
12
11
  InterfaceDeclarationStructure,
13
- Program,
14
12
  PropertySignatureStructure,
15
13
  StructureKind,
16
14
  TypeAliasDeclarationStructure
@@ -1,5 +1,5 @@
1
1
  import { readFileSync } from "fs";
2
- import { getSession } from "../autorestSession";
2
+ import { getAutorestOptions, getSession } from "../autorestSession";
3
3
  import { extractPaginationDetails } from "../utils/extractPaginationDetails";
4
4
  import * as path from "path";
5
5
  import * as hbs from "handlebars";
@@ -29,9 +29,10 @@ export function generatePagingHelper(project: Project) {
29
29
  return `"${value}"`;
30
30
  });
31
31
 
32
+ const { srcPath } = getAutorestOptions();
32
33
  const readmeFileContents = hbs.compile(file, { noEscape: true });
33
34
  project.createSourceFile(
34
- "src/paginateHelper.ts",
35
+ path.join(srcPath, "paginateHelper.ts"),
35
36
  readmeFileContents(pagingInfo),
36
37
  {
37
38
  overwrite: true