@azure-tools/typespec-ts 0.12.0 → 0.13.0

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 (269) hide show
  1. package/.rush/temp/operation/build/all.log +1 -0
  2. package/.rush/temp/operation/build/state.json +3 -0
  3. package/.rush/temp/package-deps_build.json +205 -190
  4. package/.rush/temp/shrinkwrap-deps.json +488 -471
  5. package/CHANGELOG.md +7 -0
  6. package/dist/src/index.d.ts.map +1 -1
  7. package/dist/src/index.js +2 -1
  8. package/dist/src/index.js.map +1 -1
  9. package/dist/src/modelUtils.d.ts +1 -1
  10. package/dist/src/modelUtils.d.ts.map +1 -1
  11. package/dist/src/modelUtils.js +79 -56
  12. package/dist/src/modelUtils.js.map +1 -1
  13. package/dist/src/operationUtil.d.ts +26 -0
  14. package/dist/src/operationUtil.d.ts.map +1 -1
  15. package/dist/src/operationUtil.js +76 -17
  16. package/dist/src/operationUtil.js.map +1 -1
  17. package/dist/src/transform/transform.d.ts.map +1 -1
  18. package/dist/src/transform/transform.js +9 -6
  19. package/dist/src/transform/transform.js.map +1 -1
  20. package/dist/src/transform/transformApiVersionInfo.d.ts.map +1 -1
  21. package/dist/src/transform/transformApiVersionInfo.js +3 -3
  22. package/dist/src/transform/transformApiVersionInfo.js.map +1 -1
  23. package/dist/src/transform/transformHelperFunctionDetails.d.ts +6 -0
  24. package/dist/src/transform/transformHelperFunctionDetails.d.ts.map +1 -0
  25. package/dist/src/transform/{transformAnnotationDetails.js → transformHelperFunctionDetails.js} +2 -2
  26. package/dist/src/transform/transformHelperFunctionDetails.js.map +1 -0
  27. package/dist/src/transform/transformParameters.d.ts.map +1 -1
  28. package/dist/src/transform/transformParameters.js +41 -33
  29. package/dist/src/transform/transformParameters.js.map +1 -1
  30. package/dist/src/transform/transformPaths.d.ts.map +1 -1
  31. package/dist/src/transform/transformPaths.js +20 -12
  32. package/dist/src/transform/transformPaths.js.map +1 -1
  33. package/dist/src/transform/transformResponses.d.ts.map +1 -1
  34. package/dist/src/transform/transformResponses.js +29 -8
  35. package/dist/src/transform/transformResponses.js.map +1 -1
  36. package/dist/src/transform/transformSchemas.js +1 -1
  37. package/dist/src/transform/transformSchemas.js.map +1 -1
  38. package/dist/tsconfig.tsbuildinfo +1 -1
  39. package/package.json +41 -38
  40. package/src/index.ts +2 -0
  41. package/src/modelUtils.ts +143 -47
  42. package/src/operationUtil.ts +111 -22
  43. package/src/transform/transform.ts +20 -5
  44. package/src/transform/transformApiVersionInfo.ts +18 -3
  45. package/src/transform/{transformAnnotationDetails.ts → transformHelperFunctionDetails.ts} +3 -3
  46. package/src/transform/transformParameters.ts +71 -20
  47. package/src/transform/transformPaths.ts +30 -15
  48. package/src/transform/transformResponses.ts +50 -6
  49. package/src/transform/transformSchemas.ts +1 -1
  50. package/test/commands/cadl-ranch-list.ts +25 -28
  51. package/test/commands/gen-cadl-ranch.ts +6 -2
  52. package/test/integration/arrayItemTypes.spec.ts +2 -2
  53. package/test/integration/azurecore.spec.ts +64 -24
  54. package/test/integration/collectionFormat.spec.ts +44 -0
  55. package/test/integration/dictionary.spec.ts +2 -2
  56. package/test/integration/extensibleEnums.spec.ts +8 -8
  57. package/test/integration/fixedEnums.spec.ts +7 -7
  58. package/test/integration/generated/arrays/itemTypes/src/arrayItemTypesClient.ts +5 -1
  59. package/test/integration/generated/arrays/itemTypes/src/clientDefinitions.ts +20 -20
  60. package/test/integration/generated/arrays/itemTypes/src/logger.ts +5 -0
  61. package/test/integration/generated/authentication/apiKey/package.json +1 -1
  62. package/test/integration/generated/authentication/apiKey/src/authApiKeyClient.ts +6 -2
  63. package/test/integration/generated/authentication/apiKey/src/logger.ts +5 -0
  64. package/test/integration/generated/authentication/oauth2/src/authOauth2Client.ts +6 -2
  65. package/test/integration/generated/authentication/oauth2/src/logger.ts +5 -0
  66. package/test/integration/generated/authentication/union/src/authUnionClient.ts +6 -2
  67. package/test/integration/generated/authentication/union/src/logger.ts +5 -0
  68. package/test/integration/generated/azure/core/package.json +1 -1
  69. package/test/integration/generated/azure/core/src/azureCoreClient.ts +5 -1
  70. package/test/integration/generated/azure/core/src/clientDefinitions.ts +22 -8
  71. package/test/integration/generated/azure/core/src/isUnexpected.ts +18 -7
  72. package/test/integration/generated/azure/core/src/logger.ts +5 -0
  73. package/test/integration/generated/azure/core/src/outputModels.ts +7 -0
  74. package/test/integration/generated/azure/core/src/paginateHelper.ts +55 -5
  75. package/test/integration/generated/azure/core/src/parameters.ts +1 -0
  76. package/test/integration/generated/azure/core/src/responses.ts +23 -1
  77. package/test/integration/generated/azure/core-traits/package.json +1 -1
  78. package/test/integration/generated/azure/core-traits/src/azureCoreTraitsClient.ts +5 -1
  79. package/test/integration/generated/azure/core-traits/src/clientDefinitions.ts +7 -25
  80. package/test/integration/generated/azure/core-traits/src/isUnexpected.ts +6 -19
  81. package/test/integration/generated/azure/core-traits/src/logger.ts +5 -0
  82. package/test/integration/generated/azure/core-traits/src/outputModels.ts +15 -0
  83. package/test/integration/generated/azure/core-traits/src/parameters.ts +4 -19
  84. package/test/integration/generated/azure/core-traits/src/responses.ts +6 -30
  85. package/test/integration/generated/dictionary/package.json +1 -1
  86. package/test/integration/generated/dictionary/src/clientDefinitions.ts +22 -22
  87. package/test/integration/generated/dictionary/src/dictClient.ts +5 -1
  88. package/test/integration/generated/dictionary/src/logger.ts +5 -0
  89. package/test/integration/generated/enums/extensible/README.md +3 -3
  90. package/test/integration/generated/enums/extensible/package.json +1 -1
  91. package/test/integration/generated/enums/extensible/src/clientDefinitions.ts +5 -5
  92. package/test/integration/generated/enums/extensible/src/index.ts +3 -3
  93. package/test/integration/generated/enums/extensible/src/logger.ts +5 -0
  94. package/test/integration/generated/enums/extensible/src/{enumsExtensible.ts → typeEnumExtensible.ts} +9 -5
  95. package/test/integration/generated/enums/fixed/README.md +3 -3
  96. package/test/integration/generated/enums/fixed/package.json +1 -1
  97. package/test/integration/generated/enums/fixed/src/clientDefinitions.ts +5 -5
  98. package/test/integration/generated/enums/fixed/src/index.ts +3 -3
  99. package/test/integration/generated/enums/fixed/src/logger.ts +5 -0
  100. package/test/integration/generated/enums/fixed/src/{enumsFixed.ts → typeEnumFixed.ts} +9 -5
  101. package/test/integration/generated/internal/src/clientDefinitions.ts +38 -12
  102. package/test/integration/generated/internal/src/index.ts +0 -1
  103. package/test/integration/generated/internal/src/internalClient.ts +5 -1
  104. package/test/integration/generated/internal/src/logger.ts +5 -0
  105. package/test/integration/generated/internal/src/outputModels.ts +9 -5
  106. package/test/integration/generated/internal/src/parameters.ts +32 -8
  107. package/test/integration/generated/internal/src/responses.ts +18 -5
  108. package/test/integration/generated/lro/lroCore/README.md +3 -3
  109. package/test/integration/generated/lro/lroCore/package.json +2 -2
  110. package/test/integration/generated/lro/lroCore/src/clientDefinitions.ts +8 -5
  111. package/test/integration/generated/lro/lroCore/src/index.ts +3 -3
  112. package/test/integration/generated/lro/lroCore/src/isUnexpected.ts +14 -7
  113. package/test/integration/generated/lro/lroCore/src/logger.ts +5 -0
  114. package/test/integration/generated/lro/lroCore/src/pollingHelper.ts +38 -0
  115. package/test/integration/generated/lro/lroCore/src/responses.ts +18 -0
  116. package/test/integration/generated/lro/lroCore/src/{azureLroCore.ts → specsAzureCoreLroStandard.ts} +9 -5
  117. package/test/integration/generated/lro/{lroBasic → lroRPC}/README.md +7 -7
  118. package/test/integration/generated/lro/{lroBasic → lroRPC}/api-extractor.json +1 -1
  119. package/test/integration/generated/lro/{lroBasic → lroRPC}/package.json +6 -6
  120. package/test/integration/generated/lro/lroRPC/src/clientDefinitions.ts +79 -0
  121. package/test/integration/generated/{resiliency/devDriven → lro/lroRPC}/src/index.ts +4 -4
  122. package/test/integration/generated/{resiliency/devDriven → lro/lroRPC}/src/isUnexpected.ts +57 -21
  123. package/test/integration/generated/lro/lroRPC/src/logger.ts +5 -0
  124. package/test/integration/generated/lro/lroRPC/src/models.ts +8 -0
  125. package/test/integration/generated/lro/lroRPC/src/outputModels.ts +40 -0
  126. package/test/integration/generated/lro/lroRPC/src/parameters.ts +20 -0
  127. package/test/integration/generated/lro/{lroBasic → lroRPC}/src/pollingHelper.ts +52 -0
  128. package/test/integration/generated/lro/lroRPC/src/responses.ts +124 -0
  129. package/test/integration/generated/lro/lroRPC/src/specsAzureCoreLroRpc.ts +35 -0
  130. package/test/integration/generated/lro/{lroBasic → lroRPC}/tspconfig.yaml +2 -2
  131. package/test/integration/generated/models/inheritance/README.md +3 -3
  132. package/test/integration/generated/models/inheritance/package.json +1 -1
  133. package/test/integration/generated/models/inheritance/src/clientDefinitions.ts +13 -11
  134. package/test/integration/generated/models/inheritance/src/index.ts +3 -3
  135. package/test/integration/generated/models/inheritance/src/logger.ts +5 -0
  136. package/test/integration/generated/models/inheritance/src/{modelsInheritance.ts → typeModelInheritance.ts} +9 -5
  137. package/test/integration/generated/models/propertyNullable/README.md +3 -3
  138. package/test/integration/generated/models/propertyNullable/package.json +1 -1
  139. package/test/integration/generated/models/propertyNullable/src/clientDefinitions.ts +43 -43
  140. package/test/integration/generated/models/propertyNullable/src/index.ts +3 -3
  141. package/test/integration/generated/models/propertyNullable/src/logger.ts +5 -0
  142. package/test/integration/generated/models/propertyNullable/src/parameters.ts +14 -12
  143. package/test/integration/generated/models/propertyNullable/src/responses.ts +4 -4
  144. package/test/integration/generated/models/propertyNullable/src/{modelsPropertyNullable.ts → typePropertyNullable.ts} +9 -5
  145. package/test/integration/generated/models/propertyOptional/README.md +3 -3
  146. package/test/integration/generated/models/propertyOptional/package.json +1 -1
  147. package/test/integration/generated/models/propertyOptional/src/clientDefinitions.ts +47 -47
  148. package/test/integration/generated/models/propertyOptional/src/index.ts +3 -3
  149. package/test/integration/generated/models/propertyOptional/src/logger.ts +5 -0
  150. package/test/integration/generated/models/propertyOptional/src/parameters.ts +7 -6
  151. package/test/integration/generated/models/propertyOptional/src/responses.ts +4 -4
  152. package/test/integration/generated/models/propertyOptional/src/{modelsPropertyOptional.ts → typePropertyOptional.ts} +9 -5
  153. package/test/integration/generated/models/propertyTypes/README.md +3 -3
  154. package/test/integration/generated/models/propertyTypes/package.json +1 -1
  155. package/test/integration/generated/models/propertyTypes/src/clientDefinitions.ts +123 -47
  156. package/test/integration/generated/models/propertyTypes/src/index.ts +3 -3
  157. package/test/integration/generated/models/propertyTypes/src/logger.ts +5 -0
  158. package/test/integration/generated/models/propertyTypes/src/models.ts +24 -0
  159. package/test/integration/generated/models/propertyTypes/src/outputModels.ts +24 -0
  160. package/test/integration/generated/models/propertyTypes/src/parameters.ts +48 -6
  161. package/test/integration/generated/models/propertyTypes/src/responses.ts +52 -4
  162. package/test/integration/generated/models/propertyTypes/src/{modelsPropertyTypes.ts → typePropertyValueTypes.ts} +9 -5
  163. package/test/integration/generated/models/usage/README.md +3 -3
  164. package/test/integration/generated/models/usage/package.json +1 -1
  165. package/test/integration/generated/models/usage/src/clientDefinitions.ts +7 -7
  166. package/test/integration/generated/models/usage/src/index.ts +3 -3
  167. package/test/integration/generated/models/usage/src/logger.ts +5 -0
  168. package/test/integration/generated/models/usage/src/{modelsUsage.ts → typeModelUsage.ts} +9 -5
  169. package/test/integration/generated/models/visibility/README.md +3 -3
  170. package/test/integration/generated/models/visibility/package.json +1 -1
  171. package/test/integration/generated/models/visibility/src/clientDefinitions.ts +3 -3
  172. package/test/integration/generated/models/visibility/src/index.ts +3 -3
  173. package/test/integration/generated/models/visibility/src/logger.ts +5 -0
  174. package/test/integration/generated/models/visibility/src/{modelsVisibilityAutomatic.ts → typeModelVisibility.ts} +9 -5
  175. package/test/integration/generated/parameters/collection-format/src/clientDefinitions.ts +24 -0
  176. package/test/integration/generated/parameters/collection-format/src/collectionFormatClient.ts +5 -1
  177. package/test/integration/generated/parameters/collection-format/src/logger.ts +5 -0
  178. package/test/integration/generated/parameters/collection-format/src/parameters.ts +33 -0
  179. package/test/integration/generated/parameters/collection-format/src/responses.ts +15 -0
  180. package/test/integration/generated/parameters/collection-format/src/serializeHelper.ts +12 -0
  181. package/test/integration/generated/parameters/spread/src/clientDefinitions.ts +61 -0
  182. package/test/integration/generated/{lro/lroBasic → parameters/spread}/src/index.ts +4 -5
  183. package/test/integration/generated/parameters/spread/src/logger.ts +5 -0
  184. package/test/integration/generated/{lro/lroBasic/src/outputModels.ts → parameters/spread/src/models.ts} +2 -3
  185. package/test/integration/generated/parameters/spread/src/parameters.ts +61 -0
  186. package/test/integration/generated/{lro/lroBasic/src/azureLro.ts → parameters/spread/src/parametersSpread.ts} +10 -6
  187. package/test/integration/generated/parameters/spread/src/responses.ts +25 -0
  188. package/test/integration/generated/{resiliency/devDriven → parameters/spread}/tspconfig.yaml +2 -4
  189. package/test/integration/generated/projection/src/clientDefinitions.ts +47 -21
  190. package/test/integration/generated/projection/src/logger.ts +5 -0
  191. package/test/integration/generated/projection/src/models.ts +18 -7
  192. package/test/integration/generated/projection/src/parameters.ts +32 -10
  193. package/test/integration/generated/projection/src/projectionClient.ts +5 -1
  194. package/test/integration/generated/projection/src/responses.ts +18 -3
  195. package/test/integration/generated/resiliency/srvDriven1/README.md +4 -4
  196. package/test/integration/generated/resiliency/srvDriven1/package.json +1 -1
  197. package/test/integration/generated/resiliency/srvDriven1/src/clientDefinitions.ts +25 -49
  198. package/test/integration/generated/resiliency/srvDriven1/src/index.ts +3 -5
  199. package/test/integration/generated/resiliency/srvDriven1/src/logger.ts +5 -0
  200. package/test/integration/generated/resiliency/srvDriven1/src/parameters.ts +11 -32
  201. package/test/integration/generated/resiliency/srvDriven1/src/responses.ts +9 -24
  202. package/test/integration/generated/resiliency/srvDriven1/src/serviceDrivenOldClient.ts +43 -0
  203. package/test/integration/generated/resiliency/srvDriven1/tspconfig.yaml +1 -0
  204. package/test/integration/generated/resiliency/srvDriven2/README.md +13 -4
  205. package/test/integration/generated/resiliency/srvDriven2/package.json +1 -1
  206. package/test/integration/generated/resiliency/srvDriven2/src/clientDefinitions.ts +32 -68
  207. package/test/integration/generated/resiliency/srvDriven2/src/index.ts +3 -5
  208. package/test/integration/generated/resiliency/srvDriven2/src/logger.ts +5 -0
  209. package/test/integration/generated/resiliency/srvDriven2/src/parameters.ts +19 -42
  210. package/test/integration/generated/resiliency/srvDriven2/src/responses.ts +10 -31
  211. package/test/integration/generated/resiliency/srvDriven2/src/serviceDrivenNewClient.ts +43 -0
  212. package/test/integration/generated/resiliency/srvDriven2/tspconfig.yaml +1 -0
  213. package/test/integration/generated/server/path/multiple/src/logger.ts +5 -0
  214. package/test/integration/generated/server/path/multiple/src/multipleParamInServerPathClient.ts +6 -2
  215. package/test/integration/generated/server/path/single/src/logger.ts +5 -0
  216. package/test/integration/generated/server/path/single/src/singleParamInServerPathClient.ts +6 -2
  217. package/test/integration/generated/specialWords/src/logger.ts +5 -0
  218. package/test/integration/generated/specialWords/src/specialWordsClient.ts +5 -1
  219. package/test/integration/generated/unions/src/clientDefinitions.ts +8 -8
  220. package/test/integration/generated/unions/src/logger.ts +5 -0
  221. package/test/integration/generated/unions/src/unionsClient.ts +5 -1
  222. package/test/integration/internal.spec.ts +45 -12
  223. package/test/integration/lroCore.spec.ts +89 -0
  224. package/test/integration/modelInheritance.spec.ts +13 -13
  225. package/test/integration/modelPropertyNullable.spec.ts +8 -8
  226. package/test/integration/modelPropertyOptional.spec.ts +32 -32
  227. package/test/integration/modelPropertyType.spec.ts +22 -6
  228. package/test/integration/modelUsage.spec.ts +7 -7
  229. package/test/integration/projection.spec.ts +62 -15
  230. package/test/integration/resiliencyDpgCustomization.spec.ts +133 -38
  231. package/test/integration/spreadParameters.spec.ts +82 -0
  232. package/test/integration/unions.spec.ts +4 -4
  233. package/test/unit/apiVersion.spec.ts +19 -7
  234. package/test/unit/clientFactoryGenerator.spec.ts +44 -16
  235. package/test/unit/modelsGenerator.spec.ts +212 -2
  236. package/test/unit/util/emitUtil.ts +13 -4
  237. package/test/unit/util/testUtil.ts +7 -2
  238. package/typespec-ts.build.log +0 -1
  239. package/dist/src/transform/transformAnnotationDetails.d.ts +0 -6
  240. package/dist/src/transform/transformAnnotationDetails.d.ts.map +0 -1
  241. package/dist/src/transform/transformAnnotationDetails.js.map +0 -1
  242. package/test/integration/generated/internal/src/models.ts +0 -8
  243. package/test/integration/generated/lro/lroBasic/src/clientDefinitions.ts +0 -37
  244. package/test/integration/generated/lro/lroBasic/src/parameters.ts +0 -8
  245. package/test/integration/generated/lro/lroBasic/src/responses.ts +0 -23
  246. package/test/integration/generated/resiliency/devDriven/.eslintrc.json +0 -11
  247. package/test/integration/generated/resiliency/devDriven/README.md +0 -56
  248. package/test/integration/generated/resiliency/devDriven/api-extractor.json +0 -18
  249. package/test/integration/generated/resiliency/devDriven/package.json +0 -81
  250. package/test/integration/generated/resiliency/devDriven/rollup.config.js +0 -118
  251. package/test/integration/generated/resiliency/devDriven/src/clientDefinitions.ts +0 -75
  252. package/test/integration/generated/resiliency/devDriven/src/models.ts +0 -8
  253. package/test/integration/generated/resiliency/devDriven/src/outputModels.ts +0 -25
  254. package/test/integration/generated/resiliency/devDriven/src/paginateHelper.ts +0 -154
  255. package/test/integration/generated/resiliency/devDriven/src/parameters.ts +0 -17
  256. package/test/integration/generated/resiliency/devDriven/src/resiliencyDevDriven.ts +0 -31
  257. package/test/integration/generated/resiliency/devDriven/src/responses.ts +0 -62
  258. package/test/integration/generated/resiliency/devDriven/tsconfig.json +0 -25
  259. package/test/integration/generated/resiliency/srvDriven1/src/models.ts +0 -6
  260. package/test/integration/generated/resiliency/srvDriven1/src/outputModels.ts +0 -6
  261. package/test/integration/generated/resiliency/srvDriven1/src/resiliencyServiceDriven1.ts +0 -31
  262. package/test/integration/generated/resiliency/srvDriven2/src/models.ts +0 -6
  263. package/test/integration/generated/resiliency/srvDriven2/src/outputModels.ts +0 -6
  264. package/test/integration/generated/resiliency/srvDriven2/src/resiliencyServiceDriven2.ts +0 -31
  265. package/test/integration/helloWorld.spec.ts +0 -20
  266. package/test/integration/lroBasic.spec.ts +0 -25
  267. /package/test/integration/generated/lro/{lroBasic → lroRPC}/.eslintrc.json +0 -0
  268. /package/test/integration/generated/lro/{lroBasic → lroRPC}/rollup.config.js +0 -0
  269. /package/test/integration/generated/lro/{lroBasic → lroRPC}/tsconfig.json +0 -0
@@ -16,6 +16,7 @@ import {
16
16
  RLCModel,
17
17
  RLCOptions,
18
18
  Schema,
19
+ SchemaContext,
19
20
  UrlInfo
20
21
  } from "@azure-tools/rlc-common";
21
22
  import { Program, getDoc } from "@typespec/compiler";
@@ -28,13 +29,14 @@ import {
28
29
  getTypeName,
29
30
  predictDefaultValue
30
31
  } from "../modelUtils.js";
31
- import { transformAnnotationDetails } from "./transformAnnotationDetails.js";
32
+ import { transformHelperFunctionDetails } from "./transformHelperFunctionDetails.js";
32
33
  import { transformToParameterTypes } from "./transformParameters.js";
33
34
  import { transformPaths } from "./transformPaths.js";
34
35
  import { transformToResponseTypes } from "./transformResponses.js";
35
36
  import { transformSchemas } from "./transformSchemas.js";
36
37
  import { transformRLCOptions } from "./transfromRLCOptions.js";
37
38
  import { transformApiVersionInfo } from "./transformApiVersionInfo.js";
39
+ import { getClientLroOverload } from "../operationUtil.js";
38
40
 
39
41
  export async function transformRLCModel(
40
42
  program: Program,
@@ -80,7 +82,13 @@ export async function transformRLCModel(
80
82
  client,
81
83
  dpgContext
82
84
  );
83
- const annotations = transformAnnotationDetails(program, client, dpgContext);
85
+ const helperDetails = transformHelperFunctionDetails(
86
+ program,
87
+ client,
88
+ dpgContext
89
+ );
90
+ // Enrich client-level annotation detail
91
+ helperDetails.clientLroOverload = getClientLroOverload(paths);
84
92
  const urlInfo = transformUrlInfo(program, dpgContext);
85
93
  const apiVersionInfo = transformApiVersionInfo(
86
94
  client,
@@ -98,7 +106,7 @@ export async function transformRLCModel(
98
106
  importSet,
99
107
  apiVersionInfo,
100
108
  parameters,
101
- annotations,
109
+ helperDetails,
102
110
  urlInfo
103
111
  };
104
112
  }
@@ -121,11 +129,18 @@ export function transformUrlInfo(
121
129
  const property = host?.[0]?.parameters.get(key);
122
130
  const type = property?.type;
123
131
 
124
- if (!type) {
132
+ if (!property || !type) {
125
133
  continue;
126
134
  }
127
135
 
128
- const schema = getSchemaForType(program, type);
136
+ const schema = getSchemaForType(
137
+ program,
138
+ dpgContext,
139
+ type,
140
+ [SchemaContext.Exception, SchemaContext.Input],
141
+ false,
142
+ property!
143
+ );
129
144
  urlParameters.push({
130
145
  name: key,
131
146
  type: getTypeName(schema),
@@ -10,7 +10,8 @@ import {
10
10
  ApiVersionInfo,
11
11
  UrlInfo,
12
12
  extractPathApiVersion,
13
- extractDefinedPosition
13
+ extractDefinedPosition,
14
+ SchemaContext
14
15
  } from "@azure-tools/rlc-common";
15
16
  import { getHttpOperation } from "@typespec/http";
16
17
  import {
@@ -71,7 +72,14 @@ function getOperationQueryApiVersion(
71
72
  (p) => p.type === "query" && isApiVersion(dpgContext, p)
72
73
  );
73
74
  params.map((p) => {
74
- const type = getSchemaForType(program, p.param.type);
75
+ const type = getSchemaForType(
76
+ program,
77
+ dpgContext,
78
+ p.param.type,
79
+ [SchemaContext.Exception, SchemaContext.Input],
80
+ false,
81
+ p.param
82
+ );
75
83
  const typeString = JSON.stringify(trimUsage(type));
76
84
  apiVersionTypes.add(typeString);
77
85
  });
@@ -87,7 +95,14 @@ function getOperationQueryApiVersion(
87
95
  (p) => p.type === "query" && isApiVersion(dpgContext, p)
88
96
  );
89
97
  params.map((p) => {
90
- const type = getSchemaForType(program, p.param.type);
98
+ const type = getSchemaForType(
99
+ program,
100
+ dpgContext,
101
+ p.param.type,
102
+ [SchemaContext.Exception, SchemaContext.Input],
103
+ false,
104
+ p.param
105
+ );
91
106
  const typeString = JSON.stringify(trimUsage(type));
92
107
  apiVersionTypes.add(typeString);
93
108
  });
@@ -5,7 +5,7 @@ import {
5
5
  listOperationGroups,
6
6
  listOperationsInOperationGroup
7
7
  } from "@azure-tools/typespec-client-generator-core";
8
- import { AnnotationDetails } from "@azure-tools/rlc-common";
8
+ import { HelperFunctionDetails } from "@azure-tools/rlc-common";
9
9
  import { ignoreDiagnostics, Model, Program, Type } from "@typespec/compiler";
10
10
  import { getHttpOperation, HttpOperation } from "@typespec/http";
11
11
  import {
@@ -15,11 +15,11 @@ import {
15
15
  } from "../operationUtil.js";
16
16
  import { getSpecialSerializeInfo } from "./transformParameters.js";
17
17
 
18
- export function transformAnnotationDetails(
18
+ export function transformHelperFunctionDetails(
19
19
  program: Program,
20
20
  client: SdkClient,
21
21
  dpgContext: SdkContext
22
- ): AnnotationDetails | undefined {
22
+ ): HelperFunctionDetails {
23
23
  // Extract paged metadata from Azure.Core.Page
24
24
  const annotationDetails = {
25
25
  hasLongRunning: hasPollingOperations(program, client, dpgContext)
@@ -84,13 +84,18 @@ export function transformToParameterTypes(
84
84
  // transform path param
85
85
  const pathParams = transformPathParameters();
86
86
  // transform header param includeing content-type
87
- const headerParams = transformHeaderParameters(program, parameters);
87
+ const headerParams = transformHeaderParameters(
88
+ program,
89
+ dpgContext,
90
+ parameters
91
+ );
88
92
  // transform body
89
93
  const bodyType = getBodyType(program, route);
90
94
  let bodyParameter = undefined;
91
95
  if (bodyType) {
92
96
  bodyParameter = transformBodyParameters(
93
97
  program,
98
+ dpgContext,
94
99
  parameters,
95
100
  headerParams,
96
101
  outputImportedSet,
@@ -108,13 +113,18 @@ export function transformToParameterTypes(
108
113
 
109
114
  function getParameterMetadata(
110
115
  program: Program,
116
+ dpgContext: SdkContext,
111
117
  paramType: "query" | "path" | "header",
112
118
  parameter: HttpOperationParameter
113
119
  ): ParameterMetadata {
114
- const schema = getSchemaForType(program, parameter.param.type, [
115
- SchemaContext.Input,
116
- SchemaContext.Exception
117
- ]) as Schema;
120
+ const schema = getSchemaForType(
121
+ program,
122
+ dpgContext,
123
+ parameter.param.type,
124
+ [SchemaContext.Exception, SchemaContext.Input],
125
+ false,
126
+ parameter.param
127
+ ) as Schema;
118
128
  let type = getTypeName(schema);
119
129
  const name = getParameterName(parameter.name);
120
130
  let description =
@@ -175,7 +185,7 @@ function transformQueryParameters(
175
185
  return [];
176
186
  }
177
187
  return queryParameters.map((qp) =>
178
- getParameterMetadata(program, "query", qp)
188
+ getParameterMetadata(program, dpgContext, "query", qp)
179
189
  );
180
190
  }
181
191
 
@@ -191,6 +201,7 @@ function transformPathParameters() {
191
201
 
192
202
  function transformHeaderParameters(
193
203
  program: Program,
204
+ dpgContext: SdkContext,
194
205
  parameters: HttpOperationParameters
195
206
  ): ParameterMetadata[] {
196
207
  const headerParameters = parameters.parameters.filter(
@@ -200,12 +211,13 @@ function transformHeaderParameters(
200
211
  return [];
201
212
  }
202
213
  return headerParameters.map((qp) =>
203
- getParameterMetadata(program, "header", qp)
214
+ getParameterMetadata(program, dpgContext, "header", qp)
204
215
  );
205
216
  }
206
217
 
207
218
  function transformBodyParameters(
208
219
  program: Program,
220
+ dpgContext: SdkContext,
209
221
  parameters: HttpOperationParameters,
210
222
  headers: ParameterMetadata[],
211
223
  importedModels: Set<string>,
@@ -224,6 +236,7 @@ function transformBodyParameters(
224
236
  // Case 1: Handle the normal case without binary or form data
225
237
  return transformNormalBody(
226
238
  program,
239
+ dpgContext,
227
240
  bodyType,
228
241
  parameters,
229
242
  importedModels,
@@ -236,6 +249,7 @@ function transformBodyParameters(
236
249
  // Case 3: Handle the form data
237
250
  return transformMultiFormBody(
238
251
  program,
252
+ dpgContext,
239
253
  bodyType,
240
254
  parameters,
241
255
  importedModels
@@ -245,6 +259,7 @@ function transformBodyParameters(
245
259
 
246
260
  function transformNormalBody(
247
261
  program: Program,
262
+ dpgContext: SdkContext,
248
263
  bodyType: Type,
249
264
  parameters: HttpOperationParameters,
250
265
  importedModels: Set<string>,
@@ -252,16 +267,18 @@ function transformNormalBody(
252
267
  ) {
253
268
  const description = extractDescriptionsFromBody(
254
269
  program,
270
+ dpgContext,
255
271
  bodyType,
256
272
  parameters
257
273
  ).join("\n\n");
258
274
  const type = extractNameFromCadlType(
259
275
  program,
276
+ dpgContext,
260
277
  bodyType,
261
278
  importedModels,
262
279
  headers
263
280
  );
264
- const schema = getSchemaForType(program, bodyType);
281
+ const schema = getSchemaForType(program, dpgContext, bodyType);
265
282
  return {
266
283
  isPartialBody: false,
267
284
  body: [
@@ -304,6 +321,7 @@ function transformBinaryBody(
304
321
 
305
322
  function transformMultiFormBody(
306
323
  program: Program,
324
+ dpgContext: SdkContext,
307
325
  bodyType: Type,
308
326
  parameters: HttpOperationParameters,
309
327
  importedModels: Set<string>
@@ -311,9 +329,15 @@ function transformMultiFormBody(
311
329
  const isModelBody = bodyType.kind === "Model";
312
330
 
313
331
  if (!isModelBody) {
314
- const type = extractNameFromCadlType(program, bodyType, importedModels);
332
+ const type = extractNameFromCadlType(
333
+ program,
334
+ dpgContext,
335
+ bodyType,
336
+ importedModels
337
+ );
315
338
  const description = extractDescriptionsFromBody(
316
339
  program,
340
+ dpgContext,
317
341
  bodyType,
318
342
  parameters
319
343
  ).join("\n\n");
@@ -338,10 +362,14 @@ function transformMultiFormBody(
338
362
 
339
363
  for (const [paramName, paramType] of bodyType.properties) {
340
364
  let type: string;
341
- const bodySchema = getSchemaForType(program, paramType.type, [
342
- SchemaContext.Input,
343
- SchemaContext.Exception
344
- ]) as any;
365
+ const bodySchema = getSchemaForType(
366
+ program,
367
+ dpgContext,
368
+ paramType.type,
369
+ [SchemaContext.Exception, SchemaContext.Input],
370
+ false,
371
+ paramType
372
+ ) as any;
345
373
  if (bodySchema?.format === "byte") {
346
374
  type = getBinaryType([SchemaContext.Input, SchemaContext.Exception]);
347
375
  } else if (bodySchema?.items?.format === "byte") {
@@ -350,7 +378,12 @@ function transformMultiFormBody(
350
378
  SchemaContext.Exception
351
379
  ])}>`;
352
380
  } else {
353
- type = extractNameFromCadlType(program, paramType.type, importedModels);
381
+ type = extractNameFromCadlType(
382
+ program,
383
+ dpgContext,
384
+ paramType.type,
385
+ importedModels
386
+ );
354
387
  }
355
388
  bodyParameters.body!.push({
356
389
  name: paramName,
@@ -375,11 +408,12 @@ function getBodyDetail(bodyType: Type, headers: ParameterMetadata[]) {
375
408
 
376
409
  function extractNameFromCadlType(
377
410
  program: Program,
411
+ dpgContext: SdkContext,
378
412
  cadlType: Type,
379
413
  importedModels: Set<string>,
380
414
  headers?: ParameterMetadata[]
381
415
  ) {
382
- const bodySchema = getSchemaForType(program, cadlType, [
416
+ const bodySchema = getSchemaForType(program, dpgContext, cadlType, [
383
417
  SchemaContext.Input,
384
418
  SchemaContext.Exception
385
419
  ]) as Schema;
@@ -437,6 +471,7 @@ function generateAnomymousModelSigniture(
437
471
 
438
472
  function extractDescriptionsFromBody(
439
473
  program: Program,
474
+ dpgContext: SdkContext,
440
475
  bodyType: Type,
441
476
  parameters: HttpOperationParameters
442
477
  ) {
@@ -445,7 +480,7 @@ function extractDescriptionsFromBody(
445
480
  getFormattedPropertyDoc(
446
481
  program,
447
482
  parameters.bodyParameter,
448
- getSchemaForType(program, bodyType, [
483
+ getSchemaForType(program, dpgContext, bodyType, [
449
484
  SchemaContext.Input,
450
485
  SchemaContext.Exception
451
486
  ])
@@ -455,9 +490,9 @@ function extractDescriptionsFromBody(
455
490
 
456
491
  export function getSpecialSerializeInfo(parameter: HttpOperationParameter) {
457
492
  let hasMultiCollection = false;
458
- const hasPipeCollection = false;
459
- const hasSsvCollection = false;
460
- const hasTsvCollection = false;
493
+ let hasPipeCollection = false;
494
+ let hasSsvCollection = false;
495
+ let hasTsvCollection = false;
461
496
  const descriptions = [];
462
497
  const collectionInfo = [];
463
498
  if (
@@ -468,7 +503,23 @@ export function getSpecialSerializeInfo(parameter: HttpOperationParameter) {
468
503
  descriptions.push("buildMultiCollection");
469
504
  collectionInfo.push("multi");
470
505
  }
471
- // TODO add other collection logic once cadl has supported it.
506
+ if (parameter.type === "query" && (parameter as any).format === "ssv") {
507
+ hasSsvCollection = true;
508
+ descriptions.push("buildSsvCollection");
509
+ collectionInfo.push("ssv");
510
+ }
511
+
512
+ if (parameter.type === "query" && (parameter as any).format === "tsv") {
513
+ hasTsvCollection = true;
514
+ descriptions.push("buildTsvCollection");
515
+ collectionInfo.push("tsv");
516
+ }
517
+
518
+ if (parameter.type === "query" && (parameter as any).format === "pipes") {
519
+ hasPipeCollection = true;
520
+ descriptions.push("buildPipeCollection");
521
+ collectionInfo.push("pipe");
522
+ }
472
523
  return {
473
524
  hasMultiCollection,
474
525
  hasPipeCollection,
@@ -26,11 +26,11 @@ import {
26
26
  } from "@azure-tools/typespec-client-generator-core";
27
27
  import { getSchemaForType } from "../modelUtils.js";
28
28
  import {
29
+ extractOperationLroDetail,
29
30
  getOperationGroupName,
30
31
  getOperationStatuscode,
31
32
  isDefaultStatusCode,
32
33
  isDefinedStatusCode,
33
- isLongRunningOperation,
34
34
  isPagingOperation
35
35
  } from "../operationUtil.js";
36
36
 
@@ -48,13 +48,13 @@ export function transformPaths(
48
48
  );
49
49
  for (const op of operations) {
50
50
  const route = ignoreDiagnostics(getHttpOperation(program, op));
51
- transformOperation(program, route, paths, dpgContext, operationGroup);
51
+ transformOperation(program, dpgContext, route, paths, operationGroup);
52
52
  }
53
53
  }
54
54
  const clientOperations = listOperationsInOperationGroup(dpgContext, client);
55
55
  for (const clientOp of clientOperations) {
56
56
  const route = ignoreDiagnostics(getHttpOperation(program, clientOp));
57
- transformOperation(program, route, paths, dpgContext);
57
+ transformOperation(program, dpgContext, route, paths);
58
58
  }
59
59
  return paths;
60
60
  }
@@ -97,33 +97,38 @@ function getResponseTypes(
97
97
 
98
98
  function transformOperation(
99
99
  program: Program,
100
+ dpgContext: SdkContext,
100
101
  route: HttpOperation,
101
102
  paths: Paths,
102
- dpgContext: SdkContext,
103
+
103
104
  operationGroup?: SdkOperationGroup
104
105
  ) {
105
106
  const respNames = [];
107
+ const operationGroupName = getOperationGroupName(operationGroup);
106
108
  for (const resp of route.responses) {
107
109
  const respName = getResponseTypeName(
108
- getOperationGroupName(operationGroup),
110
+ operationGroupName,
109
111
  route.operation.name,
110
112
  getOperationStatuscode(resp)
111
113
  );
112
114
  respNames.push(respName);
113
115
  }
116
+ const responseTypes = getResponseTypes(route, operationGroup);
114
117
  const method: OperationMethod = {
115
118
  description: getDoc(program, route.operation) ?? "",
116
119
  hasOptionalOptions: !hasRequiredOptions(dpgContext, route.parameters),
117
- optionsName: getParameterTypeName(
118
- getOperationGroupName(operationGroup),
119
- route.operation.name
120
- ),
121
- responseTypes: getResponseTypes(route, operationGroup),
120
+ optionsName: getParameterTypeName(operationGroupName, route.operation.name),
121
+ responseTypes,
122
122
  returnType: respNames.join(" | "),
123
123
  successStatus: gerOperationSuccessStatus(route),
124
124
  operationName: route.operation.name,
125
- annotations: {
126
- isLongRunning: isLongRunningOperation(program, route),
125
+ operationHelperDetail: {
126
+ lroDetails: extractOperationLroDetail(
127
+ program,
128
+ route,
129
+ responseTypes,
130
+ operationGroupName
131
+ ),
127
132
  isPageable: isPagingOperation(program, route)
128
133
  }
129
134
  };
@@ -137,15 +142,19 @@ function transformOperation(
137
142
  } else {
138
143
  paths[route.path] = {
139
144
  description: getDoc(program, route.operation) ?? "",
140
- name: route.operation.name || "Client",
145
+ name: escapeCoreName(route.operation.name || "Client"),
141
146
  pathParameters: route.parameters.parameters
142
147
  .filter((p) => p.type === "path")
143
148
  .map((p) => {
144
149
  return {
145
150
  name: p.name,
146
151
  type: p.param.sourceProperty
147
- ? getSchemaForType(program, p.param.sourceProperty?.type).type
148
- : getSchemaForType(program, p.param.type).type,
152
+ ? getSchemaForType(
153
+ program,
154
+ dpgContext,
155
+ p.param.sourceProperty?.type
156
+ ).type
157
+ : getSchemaForType(program, dpgContext, p.param.type).type,
149
158
  description: getDoc(program, p.param)
150
159
  };
151
160
  }),
@@ -157,6 +166,12 @@ function transformOperation(
157
166
  }
158
167
  }
159
168
 
169
+ function escapeCoreName(name: string) {
170
+ if (["client", "streamablemethod"].indexOf(name.toLowerCase()) > -1) {
171
+ return "_" + name;
172
+ }
173
+ return name;
174
+ }
160
175
  function hasRequiredOptions(
161
176
  dpgContext: SdkContext,
162
177
  routeParameters: HttpOperationParameters
@@ -14,7 +14,8 @@ import {
14
14
  OperationResponse,
15
15
  ResponseMetadata,
16
16
  Schema,
17
- SchemaContext
17
+ SchemaContext,
18
+ getLroLogicalResponseName
18
19
  } from "@azure-tools/rlc-common";
19
20
  import { Program, getDoc, ignoreDiagnostics } from "@typespec/compiler";
20
21
  import {
@@ -31,7 +32,8 @@ import {
31
32
  import {
32
33
  getOperationGroupName,
33
34
  getOperationStatuscode,
34
- isBinaryPayload
35
+ isBinaryPayload,
36
+ getOperationLroOverload
35
37
  } from "../operationUtil.js";
36
38
 
37
39
  export function transformToResponseTypes(
@@ -77,15 +79,24 @@ export function transformToResponseTypes(
77
79
  description: resp.description
78
80
  };
79
81
  // transform header
80
- const headers = transformHeaders(program, resp);
82
+ const headers = transformHeaders(program, dpgContext, resp);
81
83
  // transform body
82
- const body = transformBody(program, resp, inputImportedSet);
84
+ const body = transformBody(program, dpgContext, resp, inputImportedSet);
83
85
  rlcOperationUnit.responses.push({
84
86
  ...rlcResponseUnit,
85
87
  headers,
86
88
  body
87
89
  });
88
90
  }
91
+ const lroLogicalResponse = transformLroLogicalResponse(
92
+ program,
93
+ route,
94
+ getOperationGroupName(operationGroup),
95
+ rlcOperationUnit.responses
96
+ );
97
+ if (lroLogicalResponse) {
98
+ rlcOperationUnit.responses.push(lroLogicalResponse);
99
+ }
89
100
  rlcResponses.push(rlcOperationUnit);
90
101
  }
91
102
  return rlcResponses;
@@ -99,6 +110,7 @@ export function transformToResponseTypes(
99
110
  */
100
111
  function transformHeaders(
101
112
  program: Program,
113
+ dpgContext: SdkContext,
102
114
  response: HttpOperationResponse
103
115
  ): ResponseHeaderSchema[] | undefined {
104
116
  if (!response.responses.length) {
@@ -120,7 +132,7 @@ function transformHeaders(
120
132
  if (!value) {
121
133
  continue;
122
134
  }
123
- const typeSchema = getSchemaForType(program, value!.type, [
135
+ const typeSchema = getSchemaForType(program, dpgContext, value!.type, [
124
136
  SchemaContext.Output
125
137
  ]) as Schema;
126
138
  const type = getTypeName(typeSchema);
@@ -139,6 +151,7 @@ function transformHeaders(
139
151
 
140
152
  function transformBody(
141
153
  program: Program,
154
+ dpgContext: SdkContext,
142
155
  response: HttpOperationResponse,
143
156
  importedModels: Set<string>
144
157
  ) {
@@ -163,7 +176,7 @@ function transformBody(
163
176
  descriptions.add("Value may contain any sequence of octets");
164
177
  continue;
165
178
  }
166
- const bodySchema = getSchemaForType(program, body!.type, [
179
+ const bodySchema = getSchemaForType(program, dpgContext, body!.type, [
167
180
  SchemaContext.Output
168
181
  ]) as Schema;
169
182
  if (bodySchema.fromCore) {
@@ -188,3 +201,34 @@ function transformBody(
188
201
  fromCore
189
202
  };
190
203
  }
204
+
205
+ function transformLroLogicalResponse(
206
+ program: Program,
207
+ route: HttpOperation,
208
+ operationGroupName: string,
209
+ existingResponses: ResponseMetadata[]
210
+ ): ResponseMetadata | undefined {
211
+ const operationLroOverload = getOperationLroOverload(
212
+ program,
213
+ route,
214
+ undefined,
215
+ existingResponses
216
+ );
217
+ if (!operationLroOverload) {
218
+ return;
219
+ }
220
+ const sortedResponses = existingResponses
221
+ .filter((r) => r.statusCode.startsWith("20"))
222
+ .sort((r1, r2) => (r1.statusCode > r2.statusCode ? -1 : 1));
223
+ const successResp = sortedResponses[0];
224
+ const logicalLROResponse: ResponseMetadata = {
225
+ statusCode: "200",
226
+ description: `The final response for long-running ${route.operation.name} operation`,
227
+ predefinedName: getLroLogicalResponseName(
228
+ operationGroupName,
229
+ route.operation.name
230
+ ),
231
+ body: successResp?.body
232
+ };
233
+ return logicalLROResponse;
234
+ }
@@ -68,7 +68,7 @@ export function transformSchemas(
68
68
  }
69
69
  }
70
70
  program.stateMap(modelKey).forEach((context, cadlModel) => {
71
- const model = getSchemaForType(program, cadlModel, context);
71
+ const model = getSchemaForType(program, dpgContext, cadlModel, context);
72
72
  if (model) {
73
73
  model.usage = context;
74
74
  }