@autorest/typescript 6.0.0-beta.9 → 6.0.0-rc.1

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 (366) hide show
  1. package/README.md +42 -5
  2. package/dist/{src/generators/static/README.md.hbs → hlcREADME.md.hbs} +35 -3
  3. package/dist/hlcSamples.ts.hbs +49 -0
  4. package/dist/karma.conf.js.hbs +126 -0
  5. package/dist/paginateHelper.ts.hbs +208 -0
  6. package/dist/pollingHelper.ts.hbs +72 -0
  7. package/dist/rlcEnv.ts.hbs +3 -0
  8. package/dist/rlcREADME.md.hbs +71 -0
  9. package/dist/rlcRecordedClient.ts.hbs +26 -0
  10. package/dist/rlcSampleTest.spec.ts.hbs +20 -0
  11. package/dist/rlcSamples.ts.hbs +28 -0
  12. package/dist/sampleEnv.hbs +4 -0
  13. package/dist/sampleTest.ts.hbs +32 -0
  14. package/dist/samples.ts.hbs +0 -0
  15. package/dist/src/autorestSession.d.ts +17 -6
  16. package/dist/src/autorestSession.d.ts.map +1 -1
  17. package/dist/src/autorestSession.js +3 -9
  18. package/dist/src/autorestSession.js.map +1 -1
  19. package/dist/src/conflictResolver.d.ts +3 -0
  20. package/dist/src/conflictResolver.d.ts.map +1 -0
  21. package/dist/src/conflictResolver.js +43 -0
  22. package/dist/src/conflictResolver.js.map +1 -0
  23. package/dist/src/generators/LROGenerator.js +4 -4
  24. package/dist/src/generators/LROGenerator.js.map +1 -1
  25. package/dist/src/generators/clientFileGenerator.d.ts.map +1 -1
  26. package/dist/src/generators/clientFileGenerator.js +300 -46
  27. package/dist/src/generators/clientFileGenerator.js.map +1 -1
  28. package/dist/src/generators/indexGenerator.d.ts.map +1 -1
  29. package/dist/src/generators/indexGenerator.js +106 -14
  30. package/dist/src/generators/indexGenerator.js.map +1 -1
  31. package/dist/src/generators/mappersGenerator.d.ts.map +1 -1
  32. package/dist/src/generators/mappersGenerator.js +93 -19
  33. package/dist/src/generators/mappersGenerator.js.map +1 -1
  34. package/dist/src/generators/modelsGenerator.d.ts.map +1 -1
  35. package/dist/src/generators/modelsGenerator.js +80 -81
  36. package/dist/src/generators/modelsGenerator.js.map +1 -1
  37. package/dist/src/generators/operationGenerator.d.ts.map +1 -1
  38. package/dist/src/generators/operationGenerator.js +85 -96
  39. package/dist/src/generators/operationGenerator.js.map +1 -1
  40. package/dist/src/generators/operationInterfaceGenerator.js +20 -20
  41. package/dist/src/generators/operationInterfaceGenerator.js.map +1 -1
  42. package/dist/src/generators/parametersGenerator.d.ts.map +1 -1
  43. package/dist/src/generators/parametersGenerator.js +7 -8
  44. package/dist/src/generators/parametersGenerator.js.map +1 -1
  45. package/dist/src/generators/samples/hlcSampleGenerator.d.ts +13 -0
  46. package/dist/src/generators/samples/hlcSampleGenerator.d.ts.map +1 -0
  47. package/dist/src/generators/samples/hlcSampleGenerator.js +43 -0
  48. package/dist/src/generators/samples/hlcSampleGenerator.js.map +1 -0
  49. package/dist/src/generators/samples/hlcSamples.ts.hbs +49 -0
  50. package/dist/src/generators/samples/rlcSampleGenerator.d.ts +4 -0
  51. package/dist/src/generators/samples/rlcSampleGenerator.d.ts.map +1 -0
  52. package/dist/src/generators/samples/rlcSampleGenerator.js +64 -0
  53. package/dist/src/generators/samples/rlcSampleGenerator.js.map +1 -0
  54. package/dist/src/generators/samples/rlcSamples.ts.hbs +28 -0
  55. package/dist/src/generators/samples/sampleEnv.hbs +4 -0
  56. package/dist/src/generators/samples/sampleEnvGenerator.d.ts +3 -0
  57. package/dist/src/generators/samples/sampleEnvGenerator.d.ts.map +1 -0
  58. package/dist/src/generators/samples/sampleEnvGenerator.js +17 -0
  59. package/dist/src/generators/samples/sampleEnvGenerator.js.map +1 -0
  60. package/dist/src/generators/static/apiExtractorConfig.js +2 -2
  61. package/dist/src/generators/static/apiExtractorConfig.js.map +1 -1
  62. package/dist/src/generators/static/esLintConfigGenerator.d.ts +3 -0
  63. package/dist/src/generators/static/esLintConfigGenerator.d.ts.map +1 -0
  64. package/dist/src/generators/static/esLintConfigGenerator.js +26 -0
  65. package/dist/src/generators/static/esLintConfigGenerator.js.map +1 -0
  66. package/{src/generators/static/README.md.hbs → dist/src/generators/static/hlcREADME.md.hbs} +35 -3
  67. package/dist/src/generators/static/karma.conf.js.hbs +126 -0
  68. package/dist/src/generators/static/karmaConfigFileGenerator.d.ts +3 -0
  69. package/dist/src/generators/static/karmaConfigFileGenerator.d.ts.map +1 -0
  70. package/dist/src/generators/static/karmaConfigFileGenerator.js +23 -0
  71. package/dist/src/generators/static/karmaConfigFileGenerator.js.map +1 -0
  72. package/dist/src/generators/static/licenseFileGenerator.js +1 -1
  73. package/dist/src/generators/static/licenseFileGenerator.js.map +1 -1
  74. package/dist/src/generators/static/packageFileGenerator.d.ts.map +1 -1
  75. package/dist/src/generators/static/packageFileGenerator.js +255 -67
  76. package/dist/src/generators/static/packageFileGenerator.js.map +1 -1
  77. package/dist/src/generators/static/readmeFileGenerator.d.ts +2 -2
  78. package/dist/src/generators/static/readmeFileGenerator.d.ts.map +1 -1
  79. package/dist/src/generators/static/readmeFileGenerator.js +50 -23
  80. package/dist/src/generators/static/readmeFileGenerator.js.map +1 -1
  81. package/dist/src/generators/static/rlcREADME.md.hbs +71 -0
  82. package/dist/src/generators/static/rollupConfigFileGenerator.d.ts.map +1 -1
  83. package/dist/src/generators/static/rollupConfigFileGenerator.js +12 -71
  84. package/dist/src/generators/static/rollupConfigFileGenerator.js.map +1 -1
  85. package/dist/src/generators/static/tsConfigFileGenerator.d.ts.map +1 -1
  86. package/dist/src/generators/static/tsConfigFileGenerator.js +46 -18
  87. package/dist/src/generators/static/tsConfigFileGenerator.js.map +1 -1
  88. package/dist/src/generators/test/envBrowserFileGenerator.d.ts +3 -0
  89. package/dist/src/generators/test/envBrowserFileGenerator.d.ts.map +1 -0
  90. package/dist/src/generators/test/envBrowserFileGenerator.js +15 -0
  91. package/dist/src/generators/test/envBrowserFileGenerator.js.map +1 -0
  92. package/dist/src/generators/test/envFileGenerator.d.ts +3 -0
  93. package/dist/src/generators/test/envFileGenerator.d.ts.map +1 -0
  94. package/dist/src/generators/test/envFileGenerator.js +23 -0
  95. package/dist/src/generators/test/envFileGenerator.js.map +1 -0
  96. package/dist/src/generators/test/recordedClientFileGenerator.d.ts +3 -0
  97. package/dist/src/generators/test/recordedClientFileGenerator.d.ts.map +1 -0
  98. package/dist/src/generators/test/recordedClientFileGenerator.js +23 -0
  99. package/dist/src/generators/test/recordedClientFileGenerator.js.map +1 -0
  100. package/dist/src/generators/test/rlcEnv.ts.hbs +3 -0
  101. package/dist/src/generators/test/rlcRecordedClient.ts.hbs +26 -0
  102. package/dist/src/generators/test/rlcSampleTest.spec.ts.hbs +20 -0
  103. package/dist/src/generators/test/sampleTest.ts.hbs +32 -0
  104. package/dist/src/generators/test/sampleTestGenerator.d.ts +3 -0
  105. package/dist/src/generators/test/sampleTestGenerator.d.ts.map +1 -0
  106. package/dist/src/generators/test/sampleTestGenerator.js +34 -0
  107. package/dist/src/generators/test/sampleTestGenerator.js.map +1 -0
  108. package/dist/src/generators/tracingFileGenerator.d.ts.map +1 -1
  109. package/dist/src/generators/tracingFileGenerator.js +7 -21
  110. package/dist/src/generators/tracingFileGenerator.js.map +1 -1
  111. package/dist/src/generators/utils/docsUtils.js +2 -2
  112. package/dist/src/generators/utils/docsUtils.js.map +1 -1
  113. package/dist/src/generators/utils/operationsUtils.js +1 -1
  114. package/dist/src/generators/utils/operationsUtils.js.map +1 -1
  115. package/dist/src/generators/utils/pagingOperations.d.ts +5 -0
  116. package/dist/src/generators/utils/pagingOperations.d.ts.map +1 -1
  117. package/dist/src/generators/utils/pagingOperations.js +15 -15
  118. package/dist/src/generators/utils/pagingOperations.js.map +1 -1
  119. package/dist/src/generators/utils/parameterUtils.js +9 -9
  120. package/dist/src/generators/utils/parameterUtils.js.map +1 -1
  121. package/dist/src/generators/utils/responseTypeUtils.js +2 -2
  122. package/dist/src/generators/utils/responseTypeUtils.js.map +1 -1
  123. package/dist/src/generators/utils/tracingUtils.d.ts.map +1 -1
  124. package/dist/src/generators/utils/tracingUtils.js +2 -6
  125. package/dist/src/generators/utils/tracingUtils.js.map +1 -1
  126. package/dist/src/main.d.ts +2 -2
  127. package/dist/src/main.d.ts.map +1 -1
  128. package/dist/src/main.js +8 -8
  129. package/dist/src/main.js.map +1 -1
  130. package/dist/src/models/clientDetails.d.ts +10 -1
  131. package/dist/src/models/clientDetails.d.ts.map +1 -1
  132. package/dist/src/models/modelDetails.d.ts +2 -2
  133. package/dist/src/models/modelDetails.d.ts.map +1 -1
  134. package/dist/src/models/operationDetails.d.ts +1 -0
  135. package/dist/src/models/operationDetails.d.ts.map +1 -1
  136. package/dist/src/models/sampleDetails.d.ts +22 -0
  137. package/dist/src/models/sampleDetails.d.ts.map +1 -0
  138. package/dist/src/models/sampleDetails.js +3 -0
  139. package/dist/src/models/sampleDetails.js.map +1 -0
  140. package/dist/src/restLevelClient/generateClient.d.ts +1 -1
  141. package/dist/src/restLevelClient/generateClient.d.ts.map +1 -1
  142. package/dist/src/restLevelClient/generateClient.js +108 -167
  143. package/dist/src/restLevelClient/generateClient.js.map +1 -1
  144. package/dist/src/restLevelClient/generateClientDefinition.d.ts +6 -0
  145. package/dist/src/restLevelClient/generateClientDefinition.d.ts.map +1 -0
  146. package/dist/src/restLevelClient/generateClientDefinition.js +261 -0
  147. package/dist/src/restLevelClient/generateClientDefinition.js.map +1 -0
  148. package/dist/src/restLevelClient/generateIsUnexpectedHelper.d.ts +8 -0
  149. package/dist/src/restLevelClient/generateIsUnexpectedHelper.d.ts.map +1 -0
  150. package/dist/src/restLevelClient/generateIsUnexpectedHelper.js +204 -0
  151. package/dist/src/restLevelClient/generateIsUnexpectedHelper.js.map +1 -0
  152. package/dist/src/restLevelClient/generateMethodShortcuts.d.ts +8 -0
  153. package/dist/src/restLevelClient/generateMethodShortcuts.d.ts.map +1 -0
  154. package/dist/src/restLevelClient/generateMethodShortcuts.js +70 -0
  155. package/dist/src/restLevelClient/generateMethodShortcuts.js.map +1 -0
  156. package/dist/src/restLevelClient/generateObjectTypes.d.ts +3 -3
  157. package/dist/src/restLevelClient/generateObjectTypes.d.ts.map +1 -1
  158. package/dist/src/restLevelClient/generateObjectTypes.js +43 -31
  159. package/dist/src/restLevelClient/generateObjectTypes.js.map +1 -1
  160. package/dist/src/restLevelClient/generatePagingHelper.d.ts +3 -0
  161. package/dist/src/restLevelClient/generatePagingHelper.d.ts.map +1 -0
  162. package/dist/src/restLevelClient/generatePagingHelper.js +54 -0
  163. package/dist/src/restLevelClient/generatePagingHelper.js.map +1 -0
  164. package/dist/src/restLevelClient/generateParameterTypes.d.ts.map +1 -1
  165. package/dist/src/restLevelClient/generateParameterTypes.js +247 -44
  166. package/dist/src/restLevelClient/generateParameterTypes.js.map +1 -1
  167. package/dist/src/restLevelClient/generatePollingHelper.d.ts +3 -0
  168. package/dist/src/restLevelClient/generatePollingHelper.d.ts.map +1 -0
  169. package/dist/src/restLevelClient/generatePollingHelper.js +20 -0
  170. package/dist/src/restLevelClient/generatePollingHelper.js.map +1 -0
  171. package/dist/src/restLevelClient/generateResponseTypes.d.ts.map +1 -1
  172. package/dist/src/restLevelClient/generateResponseTypes.js +35 -23
  173. package/dist/src/restLevelClient/generateResponseTypes.js.map +1 -1
  174. package/dist/src/restLevelClient/generateRestLevel.d.ts.map +1 -1
  175. package/dist/src/restLevelClient/generateRestLevel.js +63 -16
  176. package/dist/src/restLevelClient/generateRestLevel.js.map +1 -1
  177. package/dist/src/restLevelClient/generateSchemaTypes.d.ts.map +1 -1
  178. package/dist/src/restLevelClient/generateSchemaTypes.js +29 -7
  179. package/dist/src/restLevelClient/generateSchemaTypes.js.map +1 -1
  180. package/dist/src/restLevelClient/generateTopLevelIndexFile.d.ts +4 -0
  181. package/dist/src/restLevelClient/generateTopLevelIndexFile.d.ts.map +1 -0
  182. package/dist/src/restLevelClient/generateTopLevelIndexFile.js +37 -0
  183. package/dist/src/restLevelClient/generateTopLevelIndexFile.js.map +1 -0
  184. package/dist/src/restLevelClient/getPropertySignature.d.ts +2 -2
  185. package/dist/src/restLevelClient/getPropertySignature.d.ts.map +1 -1
  186. package/dist/src/restLevelClient/getPropertySignature.js +10 -7
  187. package/dist/src/restLevelClient/getPropertySignature.js.map +1 -1
  188. package/dist/src/restLevelClient/helpers/hasPollingOperations.d.ts +4 -0
  189. package/dist/src/restLevelClient/helpers/hasPollingOperations.d.ts.map +1 -0
  190. package/dist/src/restLevelClient/helpers/hasPollingOperations.js +12 -0
  191. package/dist/src/restLevelClient/helpers/hasPollingOperations.js.map +1 -0
  192. package/dist/src/restLevelClient/helpers/modelHelpers.d.ts +4 -0
  193. package/dist/src/restLevelClient/helpers/modelHelpers.d.ts.map +1 -0
  194. package/dist/src/restLevelClient/helpers/modelHelpers.js +19 -0
  195. package/dist/src/restLevelClient/helpers/modelHelpers.js.map +1 -0
  196. package/dist/src/restLevelClient/helpers/operationHelpers.d.ts +10 -0
  197. package/dist/src/restLevelClient/helpers/operationHelpers.d.ts.map +1 -0
  198. package/dist/src/restLevelClient/helpers/operationHelpers.js +64 -0
  199. package/dist/src/restLevelClient/helpers/operationHelpers.js.map +1 -0
  200. package/dist/src/restLevelClient/interfaces.d.ts +33 -0
  201. package/dist/src/restLevelClient/interfaces.d.ts.map +1 -0
  202. package/dist/src/restLevelClient/interfaces.js +3 -0
  203. package/dist/src/restLevelClient/interfaces.js.map +1 -0
  204. package/dist/src/restLevelClient/mutateCodeModel.js +2 -2
  205. package/dist/src/restLevelClient/mutateCodeModel.js.map +1 -1
  206. package/dist/src/restLevelClient/operationHelpers.d.ts +4 -0
  207. package/dist/src/restLevelClient/operationHelpers.d.ts.map +1 -1
  208. package/dist/src/restLevelClient/operationHelpers.js +21 -10
  209. package/dist/src/restLevelClient/operationHelpers.js.map +1 -1
  210. package/dist/src/restLevelClient/paginateHelper.ts.hbs +208 -0
  211. package/dist/src/restLevelClient/pollingHelper.ts.hbs +72 -0
  212. package/dist/src/restLevelClient/samples/generateSamples.d.ts +23 -0
  213. package/dist/src/restLevelClient/samples/generateSamples.d.ts.map +1 -0
  214. package/dist/src/restLevelClient/samples/generateSamples.js +3 -0
  215. package/dist/src/restLevelClient/samples/generateSamples.js.map +1 -0
  216. package/dist/src/restLevelClient/samples/samples.ts.hbs +0 -0
  217. package/dist/src/restLevelClient/schemaHelpers.d.ts +8 -2
  218. package/dist/src/restLevelClient/schemaHelpers.d.ts.map +1 -1
  219. package/dist/src/restLevelClient/schemaHelpers.js +27 -12
  220. package/dist/src/restLevelClient/schemaHelpers.js.map +1 -1
  221. package/dist/src/transforms/extensions.js +10 -10
  222. package/dist/src/transforms/extensions.js.map +1 -1
  223. package/dist/src/transforms/groupTransforms.js +2 -2
  224. package/dist/src/transforms/groupTransforms.js.map +1 -1
  225. package/dist/src/transforms/mapperTransforms.d.ts.map +1 -1
  226. package/dist/src/transforms/mapperTransforms.js +29 -26
  227. package/dist/src/transforms/mapperTransforms.js.map +1 -1
  228. package/dist/src/transforms/objectTransforms.d.ts.map +1 -1
  229. package/dist/src/transforms/objectTransforms.js +42 -26
  230. package/dist/src/transforms/objectTransforms.js.map +1 -1
  231. package/dist/src/transforms/operationTransforms.d.ts.map +1 -1
  232. package/dist/src/transforms/operationTransforms.js +29 -26
  233. package/dist/src/transforms/operationTransforms.js.map +1 -1
  234. package/dist/src/transforms/optionsTransforms.js +1 -1
  235. package/dist/src/transforms/optionsTransforms.js.map +1 -1
  236. package/dist/src/transforms/parameterTransforms.d.ts.map +1 -1
  237. package/dist/src/transforms/parameterTransforms.js +43 -27
  238. package/dist/src/transforms/parameterTransforms.js.map +1 -1
  239. package/dist/src/transforms/samplesTransforms.d.ts +7 -0
  240. package/dist/src/transforms/samplesTransforms.d.ts.map +1 -0
  241. package/dist/src/transforms/samplesTransforms.js +293 -0
  242. package/dist/src/transforms/samplesTransforms.js.map +1 -0
  243. package/dist/src/transforms/transforms.d.ts +1 -2
  244. package/dist/src/transforms/transforms.d.ts.map +1 -1
  245. package/dist/src/transforms/transforms.js +26 -24
  246. package/dist/src/transforms/transforms.js.map +1 -1
  247. package/dist/src/transforms/urlTransforms.js +3 -3
  248. package/dist/src/transforms/urlTransforms.js.map +1 -1
  249. package/dist/src/typescriptGenerator.d.ts +2 -2
  250. package/dist/src/typescriptGenerator.d.ts.map +1 -1
  251. package/dist/src/typescriptGenerator.js +46 -46
  252. package/dist/src/typescriptGenerator.js.map +1 -1
  253. package/dist/src/utils/autorestOptions.d.ts +2 -2
  254. package/dist/src/utils/autorestOptions.d.ts.map +1 -1
  255. package/dist/src/utils/autorestOptions.js +141 -62
  256. package/dist/src/utils/autorestOptions.js.map +1 -1
  257. package/dist/src/utils/cloneOperation.js +2 -2
  258. package/dist/src/utils/cloneOperation.js.map +1 -1
  259. package/dist/src/utils/copyFiles.d.ts +2 -0
  260. package/dist/src/utils/copyFiles.d.ts.map +1 -0
  261. package/dist/src/utils/copyFiles.js +33 -0
  262. package/dist/src/utils/copyFiles.js.map +1 -0
  263. package/dist/src/utils/extractHeaders.js +4 -4
  264. package/dist/src/utils/extractHeaders.js.map +1 -1
  265. package/dist/src/utils/extractPaginationDetails.d.ts +5 -1
  266. package/dist/src/utils/extractPaginationDetails.d.ts.map +1 -1
  267. package/dist/src/utils/extractPaginationDetails.js +23 -10
  268. package/dist/src/utils/extractPaginationDetails.js.map +1 -1
  269. package/dist/src/utils/headersToSchema.js +1 -1
  270. package/dist/src/utils/headersToSchema.js.map +1 -1
  271. package/dist/src/utils/logger.js +1 -1
  272. package/dist/src/utils/logger.js.map +1 -1
  273. package/dist/src/utils/nameUtils.d.ts +6 -2
  274. package/dist/src/utils/nameUtils.d.ts.map +1 -1
  275. package/dist/src/utils/nameUtils.js +13 -8
  276. package/dist/src/utils/nameUtils.js.map +1 -1
  277. package/dist/src/utils/schemaHelpers.d.ts +6 -1
  278. package/dist/src/utils/schemaHelpers.d.ts.map +1 -1
  279. package/dist/src/utils/schemaHelpers.js +50 -7
  280. package/dist/src/utils/schemaHelpers.js.map +1 -1
  281. package/dist/src/utils/sortObjectSchemasHierarchically.js +1 -1
  282. package/dist/src/utils/sortObjectSchemasHierarchically.js.map +1 -1
  283. package/dist/src/utils/valueHelpers.js +1 -1
  284. package/dist/src/utils/valueHelpers.js.map +1 -1
  285. package/package.json +58 -39
  286. package/src/autorestSession.ts +25 -18
  287. package/src/conflictResolver.ts +61 -0
  288. package/src/generators/clientFileGenerator.ts +397 -36
  289. package/src/generators/indexGenerator.ts +118 -12
  290. package/src/generators/mappersGenerator.ts +108 -8
  291. package/src/generators/modelsGenerator.ts +98 -97
  292. package/src/generators/operationGenerator.ts +54 -93
  293. package/src/generators/parametersGenerator.ts +2 -3
  294. package/src/generators/samples/hlcSampleGenerator.ts +50 -0
  295. package/src/generators/samples/hlcSamples.ts.hbs +49 -0
  296. package/src/generators/samples/rlcSampleGenerator.ts +72 -0
  297. package/src/generators/samples/rlcSamples.ts.hbs +28 -0
  298. package/src/generators/samples/sampleEnv.hbs +4 -0
  299. package/src/generators/samples/sampleEnvGenerator.ts +14 -0
  300. package/src/generators/static/apiExtractorConfig.ts +2 -2
  301. package/src/generators/static/esLintConfigGenerator.ts +24 -0
  302. package/src/generators/static/hlcREADME.md.hbs +144 -0
  303. package/src/generators/static/karma.conf.js.hbs +126 -0
  304. package/src/generators/static/karmaConfigFileGenerator.ts +20 -0
  305. package/src/generators/static/packageFileGenerator.ts +292 -71
  306. package/src/generators/static/readmeFileGenerator.ts +79 -42
  307. package/src/generators/static/rlcREADME.md.hbs +71 -0
  308. package/src/generators/static/rollupConfigFileGenerator.ts +13 -71
  309. package/src/generators/static/tsConfigFileGenerator.ts +54 -19
  310. package/src/generators/test/envBrowserFileGenerator.ts +14 -0
  311. package/src/generators/test/envFileGenerator.ts +22 -0
  312. package/src/generators/test/recordedClientFileGenerator.ts +22 -0
  313. package/src/generators/test/rlcEnv.ts.hbs +3 -0
  314. package/src/generators/test/rlcRecordedClient.ts.hbs +26 -0
  315. package/src/generators/test/rlcSampleTest.spec.ts.hbs +20 -0
  316. package/src/generators/test/sampleTest.ts.hbs +32 -0
  317. package/src/generators/test/sampleTestGenerator.ts +32 -0
  318. package/src/generators/tracingFileGenerator.ts +6 -24
  319. package/src/generators/utils/pagingOperations.ts +1 -2
  320. package/src/generators/utils/tracingUtils.ts +1 -5
  321. package/src/main.ts +8 -5
  322. package/src/models/clientDetails.ts +11 -1
  323. package/src/models/modelDetails.ts +2 -2
  324. package/src/models/operationDetails.ts +1 -0
  325. package/src/models/sampleDetails.ts +22 -0
  326. package/src/restLevelClient/generateClient.ts +134 -244
  327. package/src/restLevelClient/generateClientDefinition.ts +386 -0
  328. package/src/restLevelClient/generateIsUnexpectedHelper.ts +224 -0
  329. package/src/restLevelClient/generateMethodShortcuts.ts +121 -0
  330. package/src/restLevelClient/generateObjectTypes.ts +62 -21
  331. package/src/restLevelClient/generatePagingHelper.ts +69 -0
  332. package/src/restLevelClient/generateParameterTypes.ts +377 -56
  333. package/src/restLevelClient/generatePollingHelper.ts +19 -0
  334. package/src/restLevelClient/generateResponseTypes.ts +36 -17
  335. package/src/restLevelClient/generateRestLevel.ts +63 -8
  336. package/src/restLevelClient/generateSchemaTypes.ts +43 -8
  337. package/src/restLevelClient/generateTopLevelIndexFile.ts +37 -0
  338. package/src/restLevelClient/getPropertySignature.ts +12 -4
  339. package/src/restLevelClient/helpers/hasPollingOperations.ts +15 -0
  340. package/src/restLevelClient/helpers/modelHelpers.ts +15 -0
  341. package/src/restLevelClient/helpers/operationHelpers.ts +93 -0
  342. package/src/restLevelClient/interfaces.ts +39 -0
  343. package/src/restLevelClient/operationHelpers.ts +23 -9
  344. package/src/restLevelClient/paginateHelper.ts.hbs +208 -0
  345. package/src/restLevelClient/pollingHelper.ts.hbs +72 -0
  346. package/src/restLevelClient/samples/generateSamples.ts +23 -0
  347. package/src/restLevelClient/samples/samples.ts.hbs +0 -0
  348. package/src/restLevelClient/schemaHelpers.ts +30 -8
  349. package/src/transforms/mapperTransforms.ts +11 -5
  350. package/src/transforms/objectTransforms.ts +26 -6
  351. package/src/transforms/operationTransforms.ts +6 -1
  352. package/src/transforms/parameterTransforms.ts +26 -7
  353. package/src/transforms/samplesTransforms.ts +349 -0
  354. package/src/transforms/transforms.ts +14 -9
  355. package/src/typescriptGenerator.ts +40 -53
  356. package/src/utils/autorestOptions.ts +198 -88
  357. package/src/utils/copyFiles.ts +36 -0
  358. package/src/utils/extractPaginationDetails.ts +19 -1
  359. package/src/utils/nameUtils.ts +18 -9
  360. package/src/utils/schemaHelpers.ts +51 -4
  361. package/CHANGELOG.md +0 -56
  362. package/dist/src/generators/clientContextFileGenerator.d.ts +0 -5
  363. package/dist/src/generators/clientContextFileGenerator.d.ts.map +0 -1
  364. package/dist/src/generators/clientContextFileGenerator.js +0 -263
  365. package/dist/src/generators/clientContextFileGenerator.js.map +0 -1
  366. package/src/generators/clientContextFileGenerator.ts +0 -405
@@ -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,14 +10,40 @@ 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";
16
+ import { generatePagingHelper } from "./generatePagingHelper";
17
+ import { generatePollingHelper } from "./generatePollingHelper";
18
+ import { generateTopLevelIndexFile } from "./generateTopLevelIndexFile";
19
+ import { hasPagingOperations } from "../utils/extractPaginationDetails";
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
+ import * as path from "path";
30
+ import * as fsextra from "fs-extra";
31
+ import { generateSampleEnv } from "../generators/samples/sampleEnvGenerator";
32
+ import { generateRLCSamples } from "../generators/samples/rlcSampleGenerator";
33
+ import { generateIsUnexpectedHelper } from "./generateIsUnexpectedHelper";
34
+
15
35
  /**
16
36
  * Generates a Rest Level Client library
17
37
  */
18
38
  export async function generateRestLevelClient() {
19
39
  const host = getHost();
20
40
  const { model } = getSession();
41
+ const {
42
+ outputPath,
43
+ srcPath,
44
+ generateSample,
45
+ generateTest
46
+ } = getAutorestOptions();
21
47
 
22
48
  const project = new Project({
23
49
  useInMemoryFileSystem: true,
@@ -26,20 +52,50 @@ export async function generateRestLevelClient() {
26
52
  }
27
53
  });
28
54
 
55
+ if (hasPagingOperations(model)) {
56
+ generatePagingHelper(project);
57
+ }
58
+
59
+ if (hasPollingOperations(model)) {
60
+ generatePollingHelper(project);
61
+ }
62
+
29
63
  performCodeModelMutations(model);
64
+ generateReadmeFile(model, project);
30
65
  generatePackageJson(project);
31
66
  generateLicenseFile(project);
32
67
  generateTsConfig(project);
33
68
  generateApiExtractorConfig(project);
69
+ generateRollupConfig(project);
70
+ generateEsLintConfig(project);
71
+
72
+ generateKarmaConfigFile(project);
73
+ generateEnvFile(project);
74
+ generateEnvBrowserFile(project);
75
+ generateRecordedClientFile(project);
76
+ generateSampleTestFile(project);
77
+
34
78
  generateResponseInterfaces(model, project);
35
79
  generateSchemaTypes(model, project);
36
80
  generateParameterInterfaces(model, project);
37
81
  generatePathFirstClient(model, project);
82
+ generateClient(model, project);
38
83
  generateIndexFile(project);
84
+ generateIsUnexpectedHelper(project);
85
+
86
+ generateTopLevelIndexFile(model, project);
87
+ if (generateSample || generateTest) {
88
+ generateSampleEnv(project);
89
+ }
90
+ if (generateSample) {
91
+ generateRLCSamples(model, project);
92
+ }
39
93
 
40
94
  // Save the source files to the virtual filesystem
41
95
  project.saveSync();
42
96
  const fs = project.getFileSystem();
97
+ const pathToClear = outputPath ? path.join(outputPath, srcPath) : srcPath;
98
+ fsextra.emptyDirSync(`${pathToClear}`);
43
99
 
44
100
  // Loop over the files
45
101
  for (const file of project.getSourceFiles()) {
@@ -49,7 +105,7 @@ export async function generateRestLevelClient() {
49
105
  let fileContents = fs.readFileSync(filePath);
50
106
  const licenseHeader = `// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n`;
51
107
 
52
- if (!isJson) {
108
+ if (isSourceCode) {
53
109
  fileContents = `${licenseHeader.trimLeft()}\n${fileContents}`;
54
110
  }
55
111
 
@@ -60,11 +116,10 @@ export async function generateRestLevelClient() {
60
116
  isJson ? prettierJSONOptions : prettierTypeScriptOptions
61
117
  );
62
118
  }
63
-
64
119
  // Write the file to the AutoRest host
65
- host.WriteFile(
66
- filePath.substr(1), // Get rid of the leading slash '/'
67
- fileContents
68
- );
120
+ host.writeFile({
121
+ filename: filePath.substr(1), // Get rid of the leading slash '/'
122
+ content: fileContents
123
+ });
69
124
  }
70
125
  }
@@ -1,9 +1,11 @@
1
- import { CodeModel } from "@autorest/codemodel";
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
@@ -11,12 +13,45 @@ import {
11
13
  export function generateSchemaTypes(model: CodeModel, project: Project) {
12
14
  // Track models that need to be imported
13
15
  const importedModels = new Set<string>();
14
- const modelsFile = project.createSourceFile(`src/models.ts`, undefined, {
15
- overwrite: true
16
- });
17
16
 
18
- const objectsDefinitions = buildObjectInterfaces(model, importedModels);
19
- const objectTypeAliases = buildPolymorphicAliases(model);
20
- modelsFile.addInterfaces(objectsDefinitions);
21
- modelsFile.addTypeAliases(objectTypeAliases);
17
+ const objectsDefinitions = buildObjectInterfaces(model, importedModels, [
18
+ SchemaContext.Input
19
+ ]);
20
+ const objectTypeAliases = buildPolymorphicAliases(model, [
21
+ SchemaContext.Input
22
+ ]);
23
+ const { srcPath } = getAutorestOptions();
24
+ if (objectTypeAliases.length || objectsDefinitions.length) {
25
+ const inputModelsFile = project.createSourceFile(
26
+ path.join(srcPath, `models.ts`),
27
+ undefined,
28
+ {
29
+ overwrite: true
30
+ }
31
+ );
32
+ inputModelsFile.addInterfaces(objectsDefinitions);
33
+ inputModelsFile.addTypeAliases(objectTypeAliases);
34
+ }
35
+ const outputObjectsDefinitions = buildObjectInterfaces(
36
+ model,
37
+ importedModels,
38
+ [SchemaContext.Output, SchemaContext.Exception]
39
+ );
40
+ const outputObjectTypeAliases = buildPolymorphicAliases(model, [
41
+ SchemaContext.Output,
42
+ SchemaContext.Exception
43
+ ]);
44
+
45
+ if (outputObjectTypeAliases.length || outputObjectsDefinitions.length) {
46
+ const outputModelsFile = project.createSourceFile(
47
+ path.join(srcPath, `outputModels.ts`),
48
+ undefined,
49
+ {
50
+ overwrite: true
51
+ }
52
+ );
53
+
54
+ outputModelsFile.addInterfaces(outputObjectsDefinitions);
55
+ outputModelsFile.addTypeAliases(outputObjectTypeAliases);
56
+ }
22
57
  }
@@ -0,0 +1,37 @@
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
+ allModules.push(item[1]);
32
+ });
33
+ file.addExportDeclaration({
34
+ namedExports: [...allModules]
35
+ });
36
+ }
37
+ }
@@ -1,4 +1,4 @@
1
- import { Parameter, Property } from "@autorest/codemodel";
1
+ import { Parameter, Property, SchemaContext } from "@autorest/codemodel";
2
2
  import { PropertySignatureStructure, StructureKind } from "ts-morph";
3
3
  import { getLanguageMetadata } from "../utils/languageHelpers";
4
4
  import { getElementType, getFormatDocs } from "./schemaHelpers";
@@ -11,13 +11,21 @@ import { getElementType, getFormatDocs } from "./schemaHelpers";
11
11
  */
12
12
  export function getPropertySignature(
13
13
  property: Property | Parameter,
14
+ schemaUsage: SchemaContext[],
14
15
  importedModels = new Set<string>()
15
16
  ): PropertySignatureStructure {
16
17
  const propertyLangMetadata = getLanguageMetadata(property.language);
17
- const propertyName = `"${propertyLangMetadata.serializedName ||
18
- propertyLangMetadata.name}"`;
18
+ const propertyName = `"${propertyLangMetadata.serializedName ??
19
+ (property as Property).serializedName}"`;
20
+
21
+ if (!propertyName) {
22
+ throw new Error(
23
+ `Couldn't find name for property ${JSON.stringify(propertyLangMetadata)}`
24
+ );
25
+ }
26
+
19
27
  const description = getDocs(property);
20
- const type = getElementType(property.schema, importedModels);
28
+ const type = getElementType(property.schema, schemaUsage, importedModels);
21
29
  return {
22
30
  name: propertyName,
23
31
  ...(description && { docs: [{ description }] }),
@@ -0,0 +1,15 @@
1
+ import { CodeModel, Operation } from "@autorest/codemodel";
2
+
3
+ export function hasPollingOperations(model: CodeModel): boolean {
4
+ return model.operationGroups.some(og =>
5
+ og.operations.some(
6
+ o => o.extensions && o.extensions["x-ms-long-running-operation"]
7
+ )
8
+ );
9
+ }
10
+
11
+ export function isLongRunningOperation(operation: Operation): boolean {
12
+ return (
13
+ operation.extensions && operation.extensions["x-ms-long-running-operation"]
14
+ );
15
+ }
@@ -0,0 +1,15 @@
1
+ import { CodeModel, SchemaContext } from "@autorest/codemodel";
2
+
3
+ export function hasInputModels(model: CodeModel) {
4
+ return model.schemas.objects?.some(o =>
5
+ o.usage?.includes(SchemaContext.Input)
6
+ );
7
+ }
8
+
9
+ export function hasOutputModels(model: CodeModel) {
10
+ return model.schemas.objects?.some(
11
+ o =>
12
+ o.usage?.includes(SchemaContext.Output) ||
13
+ o.usage?.includes(SchemaContext.Exception)
14
+ );
15
+ }
@@ -0,0 +1,93 @@
1
+ import {
2
+ ImplementationLocation,
3
+ Operation,
4
+ Parameter,
5
+ SchemaContext
6
+ } from "@autorest/codemodel";
7
+ import {
8
+ OptionalKind,
9
+ MethodSignatureStructure,
10
+ ParameterDeclarationStructure
11
+ } from "ts-morph";
12
+ import { Methods, PathParameter } from "../interfaces";
13
+ import { getElementType } from "../schemaHelpers";
14
+
15
+ /**
16
+ * Given an operation, extract all its parameters
17
+ */
18
+ export function getOperationParameters(
19
+ operation: Operation,
20
+ requestIndex = 0
21
+ ): Parameter[] {
22
+ const operationParams = [
23
+ ...(operation.parameters ?? []),
24
+ ...(operation.signatureParameters ?? [])
25
+ ];
26
+
27
+ const distinctParams = new Set(operationParams);
28
+
29
+ if (operation.requests) {
30
+ [
31
+ ...(operation.requests[requestIndex].parameters ?? []),
32
+ ...(operation.requests[requestIndex].signatureParameters ?? [])
33
+ ].forEach(p => distinctParams.add(p));
34
+ }
35
+
36
+ return [...distinctParams].filter(filterMethodNotSynthetic);
37
+ }
38
+
39
+ function filterMethodNotSynthetic(parameter: Parameter) {
40
+ const isApiVersion =
41
+ parameter.origin &&
42
+ parameter.language.default.serializedName === "api-version" &&
43
+ parameter.implementation === ImplementationLocation.Method;
44
+ // Origin is added by M4 on synthetic parameters
45
+ return (
46
+ (!parameter.origin || isApiVersion) &&
47
+ parameter.implementation === ImplementationLocation.Method
48
+ );
49
+ }
50
+
51
+ export function buildMethodDefinitions(
52
+ methods: Methods,
53
+ pathParams: PathParameter[] = []
54
+ ): OptionalKind<MethodSignatureStructure>[] {
55
+ const methodDefinitions: OptionalKind<MethodSignatureStructure>[] = [];
56
+ for (const key of Object.keys(methods)) {
57
+ const method = methods[key];
58
+ const description = methods[key][0].description;
59
+
60
+ let areAllOptional = methods[key][0].hasOptionalOptions;
61
+
62
+ methodDefinitions.push({
63
+ name: key,
64
+ ...(description && { docs: [{ description }] }),
65
+ parameters: [
66
+ ...getPathParamDefinitions(pathParams),
67
+ {
68
+ name: "options",
69
+ hasQuestionToken: areAllOptional,
70
+ type: method.map(m => m.optionsName).join(" | ")
71
+ }
72
+ ],
73
+ returnType: method.map(m => m.returnType).join(" | ")
74
+ });
75
+ }
76
+
77
+ return methodDefinitions;
78
+ }
79
+
80
+ export function getPathParamDefinitions(
81
+ pathParams: PathParameter[]
82
+ ): OptionalKind<ParameterDeclarationStructure>[] {
83
+ return pathParams.map(p => {
84
+ return {
85
+ name: p.name,
86
+ type: getElementType(p.schema, [
87
+ SchemaContext.Input,
88
+ SchemaContext.Exception
89
+ ]),
90
+ description: p.description
91
+ };
92
+ });
93
+ }
@@ -0,0 +1,39 @@
1
+ import { Schema } from "@autorest/codemodel";
2
+
3
+ export type PathParameter = {
4
+ name: string;
5
+ schema: Schema;
6
+ description?: string;
7
+ };
8
+
9
+ export interface ResponseTypes {
10
+ success: string[];
11
+ error: string[];
12
+ }
13
+
14
+ export interface OperationMethod {
15
+ optionsName: string;
16
+ description: string;
17
+ hasOptionalOptions: boolean;
18
+ returnType: string;
19
+ successStatus: string[];
20
+ responseTypes: ResponseTypes;
21
+ }
22
+
23
+ export type Methods = {
24
+ [key: string]: [OperationMethod];
25
+ };
26
+
27
+ export interface PathMetadata {
28
+ name: string;
29
+ pathParameters: PathParameter[];
30
+ methods: Methods;
31
+ annotations?: OperationAnnotations;
32
+ }
33
+
34
+ export type Paths = Record<string, PathMetadata>;
35
+
36
+ export interface OperationAnnotations {
37
+ isLongRunning?: boolean;
38
+ isPageable?: boolean;
39
+ }
@@ -2,7 +2,9 @@ import {
2
2
  AnyObjectSchema,
3
3
  Operation,
4
4
  SchemaResponse,
5
- Response
5
+ Response,
6
+ Schema,
7
+ BinarySchema
6
8
  } from "@autorest/codemodel";
7
9
  import { getLanguageMetadata } from "../utils/languageHelpers";
8
10
  import { NameType, normalizeName } from "../utils/nameUtils";
@@ -22,7 +24,11 @@ export function getResponseTypeName(
22
24
 
23
25
  export function responseToSchemaResponse(response: Response | SchemaResponse) {
24
26
  if (!isSchemaResponse(response)) {
25
- return new SchemaResponse(new AnyObjectSchema("AnyObject schema"), {
27
+ let schema: Schema = (response as any).binary
28
+ ? new BinarySchema("Binary schema")
29
+ : new AnyObjectSchema("AnyObject schema");
30
+
31
+ return new SchemaResponse(schema, {
26
32
  ...response
27
33
  });
28
34
  } else {
@@ -45,12 +51,20 @@ export function getStatusCode(response: Response): string {
45
51
  // in M4, in reality it can only contain a single status code, hence we are always picking the first one.
46
52
  let statusCode = response.protocol.http?.statusCodes[0];
47
53
 
48
- // Swagger can define a catch all status code "default" to get any other status code not explicitly defined
49
- // however default is not a valid HTTP status code. We are setting 500 as a catch all status code instead
50
- // which is a valid http status
51
- // if (statusCode === "default") {
52
- // return `"500"`;
53
- // }
54
-
55
54
  return `"${statusCode}"`;
56
55
  }
56
+
57
+ /**
58
+ * Extracts all success status codes for a give operation
59
+ */
60
+ export function gerOperationSuccessStatus(operation: Operation): string[] {
61
+ const responses = operation.responses ?? [];
62
+ const status: string[] = [];
63
+
64
+ for (const response of responses) {
65
+ let statusCode = response.protocol.http?.statusCodes[0];
66
+ status.push(statusCode);
67
+ }
68
+
69
+ return status;
70
+ }
@@ -0,0 +1,208 @@
1
+ import {
2
+ getPagedAsyncIterator,
3
+ PagedAsyncIterableIterator,
4
+ PagedResult
5
+ } from "@azure/core-paging";
6
+ import {
7
+ Client,
8
+ createRestError,
9
+ PathUncheckedResponse
10
+ } from "@azure-rest/core-client";
11
+
12
+ /**
13
+ * Helper type to extract the type of an array
14
+ */
15
+ export type GetArrayType<T> = T extends Array<infer TData> ? TData : never;
16
+
17
+ /**
18
+ * The type of a custom function that defines how to get a page and a link to the next one if any.
19
+ */
20
+ export type GetPage<TPage> = (
21
+ pageLink: string,
22
+ maxPageSize?: number
23
+ ) => Promise<{
24
+ page: TPage;
25
+ nextPageLink?: string;
26
+ }>;
27
+
28
+ /**
29
+ * Options for the paging helper
30
+ */
31
+ export interface PagingOptions<TResponse> {
32
+ /**
33
+ * Custom function to extract pagination details for crating the PagedAsyncIterableIterator
34
+ */
35
+ customGetPage?: GetPage<PaginateReturn<TResponse>[]>
36
+ }
37
+
38
+ /**
39
+ * Helper type to infer the Type of the paged elements from the response type
40
+ * This type is generated based on the swagger information for x-ms-pageable
41
+ * specifically on the itemName property which indicates the property of the response
42
+ * where the page items are found. The default value is `value`.
43
+ * This type will allow us to provide strongly typed Iterator based on the response we get as second parameter
44
+ */
45
+ export type PaginateReturn<TResult> = TResult extends {{#each itemNames}}
46
+ {
47
+
48
+ body: { {{this}}?: infer TPage }
49
+
50
+ } {{#if @last }}{{else}} | {{/if}}
51
+ {{/each}}
52
+ ? GetArrayType<TPage>
53
+ : Array<unknown>;
54
+
55
+ /**
56
+ * Helper to paginate results from an initial response that follows the specification of Autorest `x-ms-pageable` extension
57
+ * @param client - Client to use for sending the next page requests
58
+ * @param initialResponse - Initial response containing the nextLink and current page of elements
59
+ * @param customGetPage - Optional - Function to define how to extract the page and next link to be used to paginate the results
60
+ * @returns - PagedAsyncIterableIterator to iterate the elements
61
+ */
62
+ export function paginate<TResponse extends PathUncheckedResponse>(
63
+ client: Client,
64
+ initialResponse: TResponse,
65
+ options: PagingOptions<TResponse> = {}
66
+ ): PagedAsyncIterableIterator<PaginateReturn<TResponse>> {
67
+ // Extract element type from initial response
68
+ type TElement = PaginateReturn<TResponse>;
69
+ let firstRun = true;
70
+ {{#if isComplexPaging}}
71
+ // We need to check the response for success before trying to inspect it looking for
72
+ // the properties to use for nextLink and itemName
73
+ checkPagingRequest(initialResponse);
74
+ const { itemName, nextLinkName } = getPaginationProperties(initialResponse);
75
+ {{else}}
76
+ const itemName = {{ quoteWrap itemNames }};
77
+ const nextLinkName = {{quoteWrap nextLinkNames}};
78
+ {{/if}}
79
+ const { customGetPage } = options;
80
+ const pagedResult: PagedResult<TElement[]> = {
81
+ firstPageLink: "",
82
+ getPage:
83
+ typeof customGetPage === "function"
84
+ ? customGetPage
85
+ : async (pageLink: string) => {
86
+ const result = firstRun
87
+ ? initialResponse
88
+ : await client.pathUnchecked(pageLink).get();
89
+ firstRun = false;
90
+ checkPagingRequest(result);
91
+ const nextLink = getNextLink(result.body, nextLinkName);
92
+ const values = getElements<TElement>(result.body, itemName);
93
+ return {
94
+ page: values,
95
+ nextPageLink: nextLink
96
+ };
97
+ }
98
+ };
99
+
100
+ return getPagedAsyncIterator(pagedResult);
101
+ }
102
+
103
+ /**
104
+ * Gets for the value of nextLink in the body
105
+ */
106
+ function getNextLink(body: unknown, nextLinkName?: string): string | undefined {
107
+ if (!nextLinkName) {
108
+ return undefined;
109
+ }
110
+
111
+ const nextLink = (body as Record<string, unknown>)[nextLinkName];
112
+
113
+ if (typeof nextLink !== "string" && typeof nextLink !== "undefined") {
114
+ throw new Error(
115
+ `Body Property ${nextLinkName} should be a string or undefined`
116
+ );
117
+ }
118
+
119
+ return nextLink;
120
+ }
121
+
122
+ /**
123
+ * Gets the elements of the current request in the body.
124
+ */
125
+ function getElements<T = unknown>(body: unknown, itemName: string): T[] {
126
+ const value = (body as Record<string, unknown>)[itemName] as T[];
127
+
128
+ // value has to be an array according to the x-ms-pageable extension.
129
+ // The fact that this must be an array is used above to calculate the
130
+ // type of elements in the page in PaginateReturn
131
+ if (!Array.isArray(value)) {
132
+ throw new Error(
133
+ `Couldn't paginate response\n Body doesn't contain an array property with name: ${itemName}`
134
+ );
135
+ }
136
+
137
+ return value ?? [];
138
+ }
139
+
140
+ /**
141
+ * Checks if a request failed
142
+ */
143
+ function checkPagingRequest(response: PathUncheckedResponse): void {
144
+ const Http2xxStatusCodes = [
145
+ "200",
146
+ "201",
147
+ "202",
148
+ "203",
149
+ "204",
150
+ "205",
151
+ "206",
152
+ "207",
153
+ "208",
154
+ "226"
155
+ ];
156
+ if (!Http2xxStatusCodes.includes(response.status)) {
157
+ throw createRestError(
158
+ `Pagination failed with unexpected statusCode ${response.status}`,
159
+ response
160
+ );
161
+ }
162
+ }
163
+
164
+ {{#if isComplexPaging}}
165
+ /**
166
+ * Extracts the itemName and nextLinkName from the initial response to use them for pagination
167
+ */
168
+ function getPaginationProperties(initialResponse: PathUncheckedResponse) {
169
+ // Build a set with the passed custom nextLinkNames
170
+ const nextLinkNames = new Set([{{ quoteWrap nextLinkNames }}]);
171
+
172
+ // Build a set with the passed custom set of itemNames
173
+ const itemNames = new Set([{{ quoteWrap itemNames }}]);
174
+
175
+ let nextLinkName: string | undefined;
176
+ let itemName: string | undefined;
177
+
178
+ for (const name of nextLinkNames) {
179
+ const nextLink = (initialResponse.body as Record<string, unknown>)[
180
+ name
181
+ ] as string;
182
+ if (nextLink) {
183
+ nextLinkName = name;
184
+ break;
185
+ }
186
+ }
187
+
188
+ for (const name of itemNames) {
189
+ const item = (initialResponse.body as Record<string, unknown>)[
190
+ name
191
+ ] as string;
192
+ if (item) {
193
+ itemName = name;
194
+ break;
195
+ }
196
+ }
197
+
198
+ if (!itemName) {
199
+ throw new Error(
200
+ `Couldn't paginate response\n Body doesn't contain an array property with name: ${[
201
+ ...itemNames
202
+ ].join(" OR ")}`
203
+ );
204
+ }
205
+
206
+ return { itemName, nextLinkName };
207
+ }
208
+ {{/if}}