@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
@@ -1,22 +1,26 @@
1
-
2
1
  import {
3
2
  CodeModel,
4
3
  Operation,
5
4
  Parameter,
6
- SchemaContext
5
+ SchemaContext,
6
+ Request as OperationRequest,
7
+ ParameterLocation
7
8
  } from "@autorest/codemodel";
8
9
  import {
9
10
  InterfaceDeclarationStructure,
10
11
  Project,
12
+ PropertySignatureStructure,
11
13
  SourceFile,
12
14
  StructureKind
13
15
  } from "ts-morph";
16
+ import * as path from 'path';
14
17
  import { getLanguageMetadata } from "../utils/languageHelpers";
15
18
  import { NameType, normalizeName } from "../utils/nameUtils";
16
- import { getDocs, getPropertySignature } from "./getPropertySignature";
19
+ import { getPropertySignature } from "./getPropertySignature";
17
20
  import { primitiveSchemaToType } from "./schemaHelpers";
18
- import { getOperationParameters } from "./helpers/getOperationParameters";
21
+ import { getOperationParameters } from "./helpers/operationHelpers";
19
22
  import { hasInputModels } from "./helpers/modelHelpers";
23
+ import { getAutorestOptions } from "../autorestSession";
20
24
 
21
25
  /**
22
26
  * Generates the interfaces describing each operation parameters
@@ -25,8 +29,9 @@ export function generateParameterInterfaces(
25
29
  model: CodeModel,
26
30
  project: Project
27
31
  ) {
32
+ const { srcPath } = getAutorestOptions();
28
33
  const parametersFile = project.createSourceFile(
29
- `src/parameters.ts`,
34
+ path.join(srcPath, `parameters.ts`),
30
35
  undefined,
31
36
  {
32
37
  overwrite: true
@@ -41,56 +46,106 @@ export function generateParameterInterfaces(
41
46
  let hasHeaders = false;
42
47
 
43
48
  for (const operation of operations) {
44
- const internalReferences = new Set<string>();
45
49
  const operationName = normalizeName(
46
50
  getLanguageMetadata(operation.language).name,
47
51
  NameType.Interface
48
52
  );
49
- const parameterInterfaceName = `${operationName}Parameters`;
50
- const parameters = getOperationParameters(operation);
51
-
52
- const headerParameterDefinitions = buildHeaderParameterDefinitions(
53
- operationName,
54
- parameters,
55
- parametersFile,
56
- internalReferences,
57
- );
58
-
59
-
60
- const queryParameterDefinitions = buildQueryParameterDefinition(
61
- operationName,
62
- parameters,
63
- [SchemaContext.Input],
64
- importedModels,
65
- internalReferences
66
- );
67
-
68
- const bodyParameterDefinition = buildBodyParametersDefinition(
69
- operationName,
70
- parameters,
71
- [SchemaContext.Input],
72
- importedModels,
73
- internalReferences
74
- );
75
-
76
- // Add interfaces for body and query parameters
77
- parametersFile.addInterfaces([
78
- ...(bodyParameterDefinition ? [bodyParameterDefinition] : []),
79
- ...(queryParameterDefinitions ?? []),
80
- ...(headerParameterDefinitions ? [headerParameterDefinitions] : [])
81
- ]);
82
53
 
83
- if (headerParameterDefinitions !== undefined) {
84
- hasHeaders = true;
54
+ const requestCount = operation?.requests?.length ?? 0;
55
+ const topParamName = `${operationName}Parameters`;
56
+ const subParamNames: string[] = [];
57
+
58
+ // We need to loop the requests. An operation with multiple requests means that
59
+ // the operation can get different values for content-type and each value may
60
+ // have a different type associated to it.
61
+ for (let i = 0; i < requestCount; i++) {
62
+ const internalReferences = new Set<string>();
63
+ // In case we have more than one request to model we need to add a suffix to differentiate
64
+ const nameSuffix = i > 0 ? `${i}` : "";
65
+ const parameterInterfaceName =
66
+ requestCount > 1
67
+ ? `${operationName}RequestParameters${nameSuffix}`
68
+ : topParamName;
69
+ const parameters = getOperationParameters(operation, i);
70
+ const queryParameterDefinitions = buildQueryParameterDefinition(
71
+ operationName,
72
+ parameters,
73
+ [SchemaContext.Input],
74
+ importedModels,
75
+ internalReferences,
76
+ i
77
+ );
78
+
79
+ const request = operation.requests ? operation.requests[i] : undefined;
80
+
81
+ const pathParameterDefinitions = buildPathParameterDefinitions(
82
+ operationName,
83
+ parameters,
84
+ model,
85
+ parametersFile,
86
+ internalReferences,
87
+ i
88
+ )
89
+
90
+ const headerParameterDefinitions = buildHeaderParameterDefinitions(
91
+ operationName,
92
+ parameters,
93
+ parametersFile,
94
+ internalReferences,
95
+ i
96
+ );
97
+
98
+ const contentTypeParameterDefinition = buildContentTypeParametersDefinition(
99
+ operationName,
100
+ request,
101
+ internalReferences,
102
+ i
103
+ );
104
+
105
+ const bodyParameterDefinition = buildBodyParametersDefinition(
106
+ operationName,
107
+ parameters,
108
+ [SchemaContext.Input],
109
+ importedModels,
110
+ internalReferences,
111
+ i
112
+ );
113
+
114
+ // Add interfaces for body and query parameters
115
+ parametersFile.addInterfaces([
116
+ ...(bodyParameterDefinition ?? []),
117
+ ...(queryParameterDefinitions ?? []),
118
+ ...(pathParameterDefinitions ? [pathParameterDefinitions]: []),
119
+ ...(headerParameterDefinitions ? [headerParameterDefinitions] : []),
120
+ ...(contentTypeParameterDefinition
121
+ ? [contentTypeParameterDefinition]
122
+ : [])
123
+ ]);
124
+
125
+ // Add Operation parameters type alias which is composed of the types we generated above
126
+ // plus the common type RequestParameters
127
+ parametersFile.addTypeAlias({
128
+ name: parameterInterfaceName,
129
+ isExported: true,
130
+ type: [...internalReferences, "RequestParameters"].join(" & ")
131
+ });
132
+
133
+ subParamNames.push(parameterInterfaceName);
134
+
135
+ if (headerParameterDefinitions !== undefined) {
136
+ hasHeaders = true;
137
+ }
85
138
  }
86
139
 
87
140
  // Add Operation parameters type alias which is composed of the types we generated above
88
141
  // plus the common type RequestParameters
89
- parametersFile.addTypeAlias({
90
- name: parameterInterfaceName,
91
- isExported: true,
92
- type: [...internalReferences, "RequestParameters"].join(" & ")
93
- });
142
+ if (requestCount > 1) {
143
+ parametersFile.addTypeAlias({
144
+ name: topParamName,
145
+ isExported: true,
146
+ type: [...subParamNames].join(" | ")
147
+ });
148
+ }
94
149
  }
95
150
 
96
151
  if (hasHeaders) {
@@ -124,7 +179,9 @@ function getRequestHeaderInterfaceDefinition(
124
179
  baseName: string
125
180
  ): undefined | InterfaceDeclarationStructure {
126
181
  // Check if there are any required headers
127
- const headerParameters = parameters.filter(p => p.protocol.http?.in === "header");
182
+ const headerParameters = parameters.filter(
183
+ p => p.protocol.http?.in === "header"
184
+ );
128
185
  if (!headerParameters.length) {
129
186
  return undefined;
130
187
  }
@@ -138,27 +195,37 @@ function getRequestHeaderInterfaceDefinition(
138
195
  return {
139
196
  name: `"${getLanguageMetadata(h.language).serializedName}"`,
140
197
  ...(description && { docs: [{ description }] }),
141
- type: primitiveSchemaToType(h.schema, [SchemaContext.Input, SchemaContext.Exception]),
198
+ type: primitiveSchemaToType(h.schema, [
199
+ SchemaContext.Input,
200
+ SchemaContext.Exception
201
+ ]),
142
202
  hasQuestionToken: !h.required
143
203
  };
144
204
  })
145
- }
205
+ };
146
206
  }
147
207
 
148
208
  function buildHeaderParameterDefinitions(
149
209
  operationName: string,
150
210
  parameters: Parameter[],
151
211
  parametersFile: SourceFile,
152
- internalReferences: Set<string>
212
+ internalReferences: Set<string>,
213
+ requestIndex: number
153
214
  ): InterfaceDeclarationStructure | undefined {
154
- const headerParameters = parameters.filter(p => p.protocol.http?.in === "header");
215
+ const headerParameters = parameters.filter(
216
+ p => p.protocol.http?.in === "header"
217
+ );
155
218
  if (!headerParameters.length) {
156
219
  return undefined;
157
220
  }
158
221
 
159
- const headerParameterInterfaceName = `${operationName}HeaderParam`;
222
+ const nameSuffix = requestIndex > 0 ? `${requestIndex}` : "";
223
+ const headerParameterInterfaceName = `${operationName}HeaderParam${nameSuffix}`;
160
224
 
161
- const headersInterface = getRequestHeaderInterfaceDefinition(headerParameters, operationName);
225
+ const headersInterface = getRequestHeaderInterfaceDefinition(
226
+ headerParameters,
227
+ operationName
228
+ );
162
229
 
163
230
  if (headersInterface) {
164
231
  parametersFile.addInterface(headersInterface);
@@ -180,6 +247,81 @@ function buildHeaderParameterDefinitions(
180
247
  };
181
248
  }
182
249
 
250
+ function getPathInterfaceDefinition(
251
+ parameters: Parameter[],
252
+ baseName: string,
253
+ model: CodeModel
254
+ ): undefined | InterfaceDeclarationStructure {
255
+ // Check if there are any path parameters
256
+ const pathParameters = parameters.filter(
257
+ p => p.protocol.http?.in === ParameterLocation.Uri && model.globalParameters?.indexOf(p) === -1
258
+ );
259
+ if (!pathParameters.length) {
260
+ return undefined;
261
+ }
262
+ const pathInterfaceName = `${baseName}PathParameters`;
263
+ return {
264
+ kind: StructureKind.Interface,
265
+ isExported: true,
266
+ name: pathInterfaceName,
267
+ properties: pathParameters.map((h: Parameter) => {
268
+ const description = getLanguageMetadata(h.language).description;
269
+ return {
270
+ name: `"${getLanguageMetadata(h.language).serializedName}"`,
271
+ ...(description && { docs: [{ description }] }),
272
+ type: primitiveSchemaToType(h.schema, [
273
+ SchemaContext.Input,
274
+ SchemaContext.Exception
275
+ ]),
276
+ hasQuestionToken: !h.required
277
+ };
278
+ })
279
+ };
280
+ }
281
+
282
+ function buildPathParameterDefinitions(
283
+ operationName: string,
284
+ parameters: Parameter[],
285
+ model: CodeModel,
286
+ parametersFile: SourceFile,
287
+ internalReferences: Set<string>,
288
+ requestIndex: number
289
+ ): InterfaceDeclarationStructure | undefined {
290
+ const pathParameters = parameters.filter(
291
+ p => p.protocol.http?.in === ParameterLocation.Uri && model.globalParameters?.indexOf(p) === -1
292
+ );
293
+ if (!pathParameters.length) {
294
+ return undefined;
295
+ }
296
+
297
+ const nameSuffix = requestIndex > 0 ? `${requestIndex}` : "";
298
+ const pathParameterInterfaceName = `${operationName}PathParam${nameSuffix}`;
299
+
300
+ const pathInterface = getPathInterfaceDefinition(
301
+ pathParameters,
302
+ operationName,
303
+ model
304
+ );
305
+
306
+ if (pathInterface) {
307
+ parametersFile.addInterface(pathInterface);
308
+ }
309
+
310
+ internalReferences.add(pathParameterInterfaceName);
311
+
312
+ return {
313
+ isExported: true,
314
+ kind: StructureKind.Interface,
315
+ name: pathParameterInterfaceName,
316
+ properties: [
317
+ {
318
+ name: "pathParameters",
319
+ type: `${operationName}PathParameters`,
320
+ kind: StructureKind.PropertySignature
321
+ }
322
+ ]
323
+ };
324
+ }
183
325
  /**
184
326
  * Gets the interface definition for an operation bodyParameters
185
327
  */
@@ -188,33 +330,114 @@ function buildBodyParametersDefinition(
188
330
  parameters: Parameter[],
189
331
  schemaUsage: SchemaContext[],
190
332
  importedModels: Set<string>,
191
- internalReferences: Set<string>
192
- ): InterfaceDeclarationStructure | undefined {
333
+ internalReferences: Set<string>,
334
+ requestIndex: number
335
+ ): InterfaceDeclarationStructure[] {
193
336
  const bodyParameters = parameters.filter(p => p.protocol.http?.in === "body");
194
337
  if (!bodyParameters.length) {
338
+ return [];
339
+ }
340
+
341
+ const nameSuffix = requestIndex > 0 ? `${requestIndex}` : "";
342
+ const bodyParameterInterfaceName = `${operationName}BodyParam${nameSuffix}`;
343
+ internalReferences.add(bodyParameterInterfaceName);
344
+
345
+ // In case of formData we'd get multiple properties in body marked as partialBody
346
+ if (bodyParameters.some(p => p.isPartialBody)) {
347
+ let allOptionalParts = true;
348
+ const propertiesDefinitions: PropertySignatureStructure[] = [];
349
+ for (const param of bodyParameters) {
350
+ if (param.required) {
351
+ allOptionalParts = false;
352
+ }
353
+
354
+ propertiesDefinitions.push(
355
+ getPropertySignature(param, schemaUsage, importedModels)
356
+ );
357
+ }
358
+
359
+ const formBodyName = `${operationName}FormBody`;
360
+ const formBodyInterface: InterfaceDeclarationStructure = {
361
+ isExported: true,
362
+ kind: StructureKind.Interface,
363
+ name: formBodyName,
364
+ properties: propertiesDefinitions
365
+ };
366
+
367
+ return [
368
+ {
369
+ isExported: true,
370
+ kind: StructureKind.Interface,
371
+ name: bodyParameterInterfaceName,
372
+ properties: [
373
+ {
374
+ name: "body",
375
+ type: formBodyName,
376
+ hasQuestionToken: allOptionalParts
377
+ }
378
+ ]
379
+ },
380
+ formBodyInterface
381
+ ];
382
+ } else {
383
+ const bodySignature = getPropertySignature(
384
+ bodyParameters[0],
385
+ schemaUsage,
386
+ importedModels
387
+ );
388
+
389
+ return [
390
+ {
391
+ isExported: true,
392
+ kind: StructureKind.Interface,
393
+ name: bodyParameterInterfaceName,
394
+ properties: [
395
+ {
396
+ docs: bodySignature.docs,
397
+ name: "body",
398
+ type: bodySignature.type,
399
+ hasQuestionToken: bodySignature.hasQuestionToken
400
+ }
401
+ ]
402
+ }
403
+ ];
404
+ }
405
+ }
406
+
407
+ /**
408
+ * Gets the interface definition for an operation bodyParameters
409
+ */
410
+ function buildContentTypeParametersDefinition(
411
+ operationName: string,
412
+ request: OperationRequest | undefined,
413
+ internalReferences: Set<string>,
414
+ requestIndex: number
415
+ ): InterfaceDeclarationStructure | undefined {
416
+ if (!request) {
195
417
  return undefined;
196
418
  }
419
+ const mediaTypes: string[] = request.protocol.http?.mediaTypes ?? [];
197
420
 
198
- const bodyParameterInterfaceName = `${operationName}BodyParam`;
199
- // There is only one body parameter can't be more than one so we can safely take the first
200
- const bodySignature = getPropertySignature(
201
- bodyParameters[0],
202
- schemaUsage,
203
- importedModels
204
- );
421
+ if (!mediaTypes.length) {
422
+ return undefined;
423
+ }
205
424
 
206
- internalReferences.add(bodyParameterInterfaceName);
425
+ const nameSuffix = requestIndex > 0 ? `${requestIndex}` : "";
426
+ const mediaTypesParameterInterfaceName = `${operationName}MediaTypesParam${nameSuffix}`;
427
+
428
+ // Mark the queryParameter interface for importing
429
+ internalReferences.add(mediaTypesParameterInterfaceName);
207
430
 
208
431
  return {
209
432
  isExported: true,
210
433
  kind: StructureKind.Interface,
211
- name: bodyParameterInterfaceName,
434
+ name: mediaTypesParameterInterfaceName,
212
435
  properties: [
213
436
  {
214
- docs: bodySignature.docs,
215
- name: "body",
216
- type: bodySignature.type,
217
- hasQuestionToken: bodySignature.hasQuestionToken
437
+ docs: ["Request content type"],
438
+ name: "contentType",
439
+ type: mediaTypes.map(mt => `"${mt}"`).join(" | "),
440
+ hasQuestionToken: true
218
441
  }
219
442
  ]
220
443
  };
@@ -228,7 +451,8 @@ function buildQueryParameterDefinition(
228
451
  parameters: Parameter[],
229
452
  schemaUsage: SchemaContext[],
230
453
  importedModels: Set<string>,
231
- internalReferences: Set<string>
454
+ internalReferences: Set<string>,
455
+ requestIndex: number
232
456
  ): InterfaceDeclarationStructure[] | undefined {
233
457
  const queryParameters = parameters.filter(
234
458
  p => p.protocol.http?.in === "query"
@@ -238,7 +462,8 @@ function buildQueryParameterDefinition(
238
462
  return undefined;
239
463
  }
240
464
 
241
- const queryParameterInterfaceName = `${operationName}QueryParam`;
465
+ const nameSuffix = requestIndex > 0 ? `${requestIndex}` : "";
466
+ const queryParameterInterfaceName = `${operationName}QueryParam${nameSuffix}`;
242
467
  const queryParameterPropertiesName = `${operationName}QueryParamProperties`;
243
468
 
244
469
  // Get the property signature for each query parameter
@@ -1,9 +1,8 @@
1
1
  import { readFileSync } from "fs";
2
- import { getSession } from "../autorestSession";
3
- import { extractPaginationDetails } from "../utils/extractPaginationDetails";
4
2
  import * as path from "path";
5
3
  import * as hbs from "handlebars";
6
4
  import { Project } from "ts-morph";
5
+ import { getAutorestOptions } from "../autorestSession";
7
6
 
8
7
  export function generatePollingHelper(project: Project) {
9
8
  let file: string = "";
@@ -13,7 +12,8 @@ export function generatePollingHelper(project: Project) {
13
12
  });
14
13
 
15
14
  const readmeFileContents = hbs.compile(file, { noEscape: true });
16
- project.createSourceFile("src/pollingHelper.ts", readmeFileContents({}), {
15
+ const { srcPath } = getAutorestOptions();
16
+ project.createSourceFile(path.join(srcPath, "pollingHelper.ts"), readmeFileContents({}), {
17
17
  overwrite: true
18
18
  });
19
19
  }
@@ -21,10 +21,14 @@ import {
21
21
  import { NameType, normalizeName } from "../utils/nameUtils";
22
22
  import { getElementType, getFormatDocs, primitiveSchemaToType } from "./schemaHelpers";
23
23
  import { getLanguageMetadata } from "../utils/languageHelpers";
24
+ import { hasOutputModels } from "./helpers/modelHelpers";
25
+ import { getAutorestOptions } from "../autorestSession";
26
+ import * as path from 'path';
24
27
 
25
28
  export function generateResponseInterfaces(model: CodeModel, project: Project) {
29
+ const { srcPath } = getAutorestOptions();
26
30
  const responsesFile = project.createSourceFile(
27
- `src/responses.ts`,
31
+ path.join(srcPath, `responses.ts`),
28
32
  undefined,
29
33
  {
30
34
  overwrite: true
@@ -118,12 +122,14 @@ export function generateResponseInterfaces(model: CodeModel, project: Project) {
118
122
 
119
123
 
120
124
 
121
- responsesFile.addImportDeclarations([
122
- {
123
- namedImports: [...importedModels],
124
- moduleSpecifier: "./outputModels"
125
- }
126
- ]);
125
+ if (hasOutputModels(model)) {
126
+ responsesFile.addImportDeclarations([
127
+ {
128
+ namedImports: [...importedModels],
129
+ moduleSpecifier: "./outputModels"
130
+ }
131
+ ]);
132
+ }
127
133
  }
128
134
 
129
135
  /**
@@ -1,4 +1,4 @@
1
- import { getHost, getSession } from "../autorestSession";
1
+ import { getAutorestOptions, getHost, getSession } from "../autorestSession";
2
2
  import { Project, IndentationText } from "ts-morph";
3
3
  import { generatePackageJson } from "../generators/static/packageFileGenerator";
4
4
  import { generateLicenseFile } from "../generators/static/licenseFileGenerator";
@@ -10,12 +10,23 @@ import { generateSchemaTypes } from "./generateSchemaTypes";
10
10
  import { format } from "prettier";
11
11
  import { prettierJSONOptions, prettierTypeScriptOptions } from "./config";
12
12
  import { generateParameterInterfaces } from "./generateParameterTypes";
13
- import { generatePathFirstClient } from "./generateClient";
13
+ import { generatePathFirstClient } from "./generateClientDefinition";
14
+ import { generateClient } from './generateClient';
14
15
  import { generateIndexFile } from "../generators/indexGenerator";
15
16
  import { generatePagingHelper } from "./generatePagingHelper";
16
17
  import { generatePollingHelper } from "./generatePollingHelper";
18
+ import { generateTopLevelIndexFile } from './generateTopLevelIndexFile';
17
19
  import { hasPagingOperations } from "../utils/extractPaginationDetails";
18
20
  import { hasPollingOperations } from "./helpers/hasPollingOperations";
21
+ import { generateKarmaConfigFile } from "../generators/static/karmaConfigFileGenerator";
22
+ import { generateEnvFile } from "../generators/test/envFileGenerator";
23
+ import { generateEnvBrowserFile } from "../generators/test/envBrowserFileGenerator";
24
+ import { generateRecordedClientFile } from "../generators/test/recordedClientFileGenerator";
25
+ import { generateSampleTestFile } from "../generators/test/sampleTestGenerator";
26
+ import { generateEsLintConfig } from "../generators/static/esLintConfigGenerator";
27
+ import { generateRollupConfig } from "../generators/static/rollupConfigFileGenerator";
28
+ import { generateReadmeFile } from "../generators/static/readmeFileGenerator";
29
+
19
30
  /**
20
31
  * Generates a Rest Level Client library
21
32
  */
@@ -38,17 +49,31 @@ export async function generateRestLevelClient() {
38
49
  generatePollingHelper(project);
39
50
  }
40
51
 
52
+
41
53
  performCodeModelMutations(model);
54
+ generateReadmeFile(model.language, model.info, project);
42
55
  generatePackageJson(project);
43
56
  generateLicenseFile(project);
44
57
  generateTsConfig(project);
45
58
  generateApiExtractorConfig(project);
59
+ generateRollupConfig(project);
60
+ generateEsLintConfig(project);
61
+
62
+ generateKarmaConfigFile(project)
63
+ generateEnvFile(project);
64
+ generateEnvBrowserFile(project);
65
+ generateRecordedClientFile(project);
66
+ generateSampleTestFile(project);
67
+
46
68
  generateResponseInterfaces(model, project);
47
69
  generateSchemaTypes(model, project);
48
70
  generateParameterInterfaces(model, project);
49
71
  generatePathFirstClient(model, project);
72
+ generateClient(model, project);
50
73
  generateIndexFile(project);
51
74
 
75
+ generateTopLevelIndexFile(model, project);
76
+
52
77
  // Save the source files to the virtual filesystem
53
78
  project.saveSync();
54
79
  const fs = project.getFileSystem();
@@ -61,7 +86,7 @@ export async function generateRestLevelClient() {
61
86
  let fileContents = fs.readFileSync(filePath);
62
87
  const licenseHeader = `// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n`;
63
88
 
64
- if (!isJson) {
89
+ if (isSourceCode) {
65
90
  fileContents = `${licenseHeader.trimLeft()}\n${fileContents}`;
66
91
  }
67
92
 
@@ -74,9 +99,9 @@ export async function generateRestLevelClient() {
74
99
  }
75
100
 
76
101
  // Write the file to the AutoRest host
77
- host.WriteFile(
78
- filePath.substr(1), // Get rid of the leading slash '/'
79
- fileContents
80
- );
102
+ host.writeFile({
103
+ filename: filePath.substr(1), // Get rid of the leading slash '/'
104
+ content: fileContents
105
+ });
81
106
  }
82
107
  }
@@ -1,9 +1,11 @@
1
1
  import { CodeModel, SchemaContext } from "@autorest/codemodel";
2
2
  import { Project } from "ts-morph";
3
+ import * as path from 'path';
3
4
  import {
4
5
  buildObjectInterfaces,
5
6
  buildPolymorphicAliases
6
7
  } from "./generateObjectTypes";
8
+ import { getAutorestOptions } from "../autorestSession";
7
9
 
8
10
  /**
9
11
  * Generates types to represent schema definitions in the swagger
@@ -18,10 +20,10 @@ export function generateSchemaTypes(model: CodeModel, project: Project) {
18
20
  const objectTypeAliases = buildPolymorphicAliases(model, [
19
21
  SchemaContext.Input
20
22
  ]);
21
-
23
+ const { srcPath } = getAutorestOptions();
22
24
  if (objectTypeAliases.length || objectsDefinitions.length) {
23
25
  const inputModelsFile = project.createSourceFile(
24
- `src/models.ts`,
26
+ path.join(srcPath, `models.ts`),
25
27
  undefined,
26
28
  {
27
29
  overwrite: true
@@ -42,7 +44,7 @@ export function generateSchemaTypes(model: CodeModel, project: Project) {
42
44
 
43
45
  if (outputObjectTypeAliases.length || outputObjectsDefinitions.length) {
44
46
  const outputModelsFile = project.createSourceFile(
45
- `src/outputModels.ts`,
47
+ path.join(srcPath, `outputModels.ts`),
46
48
  undefined,
47
49
  {
48
50
  overwrite: true
@@ -0,0 +1,41 @@
1
+ import { Project } from 'ts-morph';
2
+ import * as path from 'path';
3
+ import { getAutorestOptions } from '../autorestSession';
4
+ import { CodeModel } from '@autorest/codemodel';
5
+ import { NameType, normalizeName } from '../utils/nameUtils';
6
+
7
+ const batchOutputFolder: [string, string, string][] = [];
8
+
9
+ export function generateTopLevelIndexFile(model: CodeModel, project: Project) {
10
+ const { multiClient, batch, srcPath } = getAutorestOptions();
11
+ if (srcPath) {
12
+ const clientName = model.language.default.name;
13
+ const moduleName = normalizeName(clientName, NameType.File);
14
+ const relativePath = srcPath.replace('/src', '');
15
+ batchOutputFolder.push([relativePath, clientName, moduleName]);
16
+ }
17
+
18
+ if (multiClient && batch && batch.length > 1 && batchOutputFolder.length === batch.length) {
19
+ const { srcPath } = getAutorestOptions();
20
+ const fileDirectory= path.join(srcPath as string, '../../');
21
+ const file = project.createSourceFile('/src/index.ts', undefined, {
22
+ overwrite: true
23
+ });
24
+ file.moveToDirectory(fileDirectory);
25
+ const allModules: string[] = [];
26
+ batchOutputFolder.forEach(item => {
27
+ file.addImportDeclaration({
28
+ namespaceImport: item[1],
29
+ moduleSpecifier: `${item[0]}`
30
+ });
31
+ file.addExportDeclaration({
32
+ moduleSpecifier: `${item[0]}/${item[2]}`,
33
+ namedExports: [`${item[1]} as ${item[1]}Client`]
34
+ })
35
+ allModules.push(item[1]);
36
+ });
37
+ file.addExportDeclaration({
38
+ namedExports: [...allModules]
39
+ });
40
+ }
41
+ }