@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
package/package.json CHANGED
@@ -1,28 +1,9 @@
1
1
  {
2
2
  "name": "@azure-tools/typespec-ts",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "An experimental CADL emitter for TypeScript RLC",
5
5
  "main": "dist/src/index.js",
6
6
  "type": "module",
7
- "scripts": {
8
- "clean": "rimraf ./dist ./cadl-output",
9
- "build": "tsc -p .",
10
- "test": "npm run unit-test && npm run integration-test-ci",
11
- "lint": "eslint src --ext .ts --max-warnings=0",
12
- "lint:fix": "eslint src --fix --ext .ts",
13
- "format": "npm run -s prettier -- --write",
14
- "check-format": "npm run prettier -- --check",
15
- "prettier": "prettier --config ./.prettierrc src/**/*.ts",
16
- "check:tree": "ts-node ./test/commands/check-clean-tree.ts",
17
- "integration-test-ci": "npm run start-test-server & npm run copy:typespec && npm run generate-and-run",
18
- "start-test-server": "mkdirp -p coverage && npx cadl-ranch serve ./node_modules/@azure-tools/cadl-ranch-specs/http --coverageFile ./coverage/cadl-ranch-coverage-typescript.json",
19
- "copy:typespec": "rm -rf temp && mkdirp -p temp && cp -r ./node_modules/@azure-tools/cadl-ranch-specs/http ./temp",
20
- "generate-and-run": "npm run generate-cadl-only && npm run integration-test:alone && npm run stop-test-server",
21
- "generate-cadl-only": "ts-node ./test/commands/gen-cadl-ranch.ts",
22
- "integration-test:alone": "cross-env TS_NODE_PROJECT=tsconfig.test.json mocha -r ts-node/register --experimental-specifier-resolution=node --timeout 2000 ./test/integration/*.spec.ts",
23
- "stop-test-server": "npx cadl-ranch server stop",
24
- "unit-test": "cross-env TS_NODE_PROJECT=tsconfig.json mocha -r ts-node/register --experimental-specifier-resolution=node --experimental-modules=true './test/unit/**/*.spec.ts'"
25
- },
26
7
  "author": "Jose Heredia <joheredi@microsoft.com>",
27
8
  "license": "MIT",
28
9
  "devDependencies": {
@@ -33,7 +14,7 @@
33
14
  "@types/fs-extra": "^9.0.13",
34
15
  "@typescript-eslint/eslint-plugin": "^5.58.0",
35
16
  "@typescript-eslint/parser": "^5.58.0",
36
- "@typespec/http": "~0.43.0",
17
+ "@typespec/http": "~0.44.0",
37
18
  "chai": "^4.3.6",
38
19
  "mkdirp": "^2.1.2",
39
20
  "eslint": "^8.9.0",
@@ -42,30 +23,33 @@
42
23
  "ts-node": "^10.9.1",
43
24
  "typescript": "~5.0.0",
44
25
  "prettier": "~2.7.1",
45
- "@azure-tools/cadl-ranch-specs": "~0.11.2",
46
- "@typespec/versioning": "~0.43.0",
47
- "@azure-tools/cadl-ranch-expect": "^0.2.2",
48
- "@azure-tools/cadl-ranch": "~0.4.4",
26
+ "@azure-tools/cadl-ranch-specs": "~0.14.10",
27
+ "@typespec/versioning": "~0.44.0",
28
+ "@azure-tools/cadl-ranch-expect": "^0.3.0",
29
+ "@azure-tools/cadl-ranch": "~0.4.13",
49
30
  "chalk": "^4.0.0",
50
- "@azure-rest/core-client": "^1.1.2",
31
+ "@azure-rest/core-client": "^1.1.3",
51
32
  "@azure/core-auth": "^1.3.2",
52
33
  "cross-env": "^7.0.3",
53
34
  "@azure/core-paging": "^1.5.0",
54
- "@azure/core-lro": "^2.2.0",
55
- "@azure/core-rest-pipeline": "^1.9.2"
35
+ "@azure/core-lro": "^2.5.3",
36
+ "@azure/core-rest-pipeline": "^1.9.2",
37
+ "@azure/logger": "^1.0.4"
38
+ },
39
+ "peerDependencies": {
40
+ "@azure-tools/typespec-azure-core": ">=0.30.0 <1.0.0",
41
+ "@azure-tools/typespec-client-generator-core": ">=0.30.0 <1.0.0",
42
+ "@typespec/compiler": ">=0.44.0 <1.0.0",
43
+ "@typespec/http": ">=0.44.0 <1.0.0",
44
+ "@typespec/rest": ">=0.44.0 <1.0.0",
45
+ "@typespec/versioning": ">=0.44.0 <1.0.0"
56
46
  },
57
47
  "dependencies": {
58
- "@typespec/compiler": "~0.43.0",
59
- "@azure-tools/typespec-azure-core": "~0.29.0",
60
- "@typespec/rest": "~0.43.0",
61
48
  "prettier": "^2.6.1",
62
49
  "tslib": "^2.3.1",
63
- "@azure-tools/rlc-common": "^0.12.0",
50
+ "@azure-tools/rlc-common": "^0.13.0",
64
51
  "ts-morph": "^15.1.0",
65
- "@azure-tools/typespec-client-generator-core": "~0.29.0",
66
- "fs-extra": "^11.1.0",
67
- "@typespec/openapi": "0.43.0",
68
- "@typespec/openapi3": "0.43.0"
52
+ "fs-extra": "^11.1.0"
69
53
  },
70
54
  "mocha": {
71
55
  "extension": [
@@ -76,5 +60,24 @@
76
60
  "bugs": {
77
61
  "url": "https://github.com/Azure/autorest.typescript/issues"
78
62
  },
79
- "homepage": "https://github.com/Azure/autorest.typescript/tree/main/packages/typespec-ts/"
80
- }
63
+ "homepage": "https://github.com/Azure/autorest.typescript/tree/main/packages/typespec-ts/",
64
+ "scripts": {
65
+ "clean": "rimraf ./dist ./cadl-output",
66
+ "build": "tsc -p .",
67
+ "test": "npm run unit-test && npm run integration-test-ci",
68
+ "lint": "eslint src --ext .ts --max-warnings=0",
69
+ "lint:fix": "eslint src --fix --ext .ts",
70
+ "format": "npm run -s prettier -- --write",
71
+ "check-format": "npm run prettier -- --check",
72
+ "prettier": "prettier --config ./.prettierrc src/**/*.ts",
73
+ "check:tree": "ts-node ./test/commands/check-clean-tree.ts",
74
+ "integration-test-ci": "npm run start-test-server & npm run copy:typespec && npm run generate-and-run",
75
+ "start-test-server": "mkdirp -p coverage && npx cadl-ranch serve ./node_modules/@azure-tools/cadl-ranch-specs/http --coverageFile ./coverage/cadl-ranch-coverage-typescript.json",
76
+ "copy:typespec": "rm -rf temp && mkdirp -p temp && cp -r ./node_modules/@azure-tools/cadl-ranch-specs/http ./temp",
77
+ "generate-and-run": "npm run generate-cadl-only && npm run integration-test:alone && npm run stop-test-server",
78
+ "generate-cadl-only": "ts-node ./test/commands/gen-cadl-ranch.ts",
79
+ "integration-test:alone": "cross-env TS_NODE_PROJECT=tsconfig.test.json mocha -r ts-node/register --experimental-specifier-resolution=node --timeout 4000 ./test/integration/*.spec.ts",
80
+ "stop-test-server": "npx cadl-ranch server stop",
81
+ "unit-test": "cross-env TS_NODE_PROJECT=tsconfig.json mocha -r ts-node/register --experimental-specifier-resolution=node --experimental-modules=true './test/unit/**/*.spec.ts'"
82
+ }
83
+ }
package/src/index.ts CHANGED
@@ -25,6 +25,7 @@ import {
25
25
  buildSampleTest,
26
26
  buildReadmeFile,
27
27
  buildSerializeHelper,
28
+ buildLogger,
28
29
  RLCOptions
29
30
  } from "@azure-tools/rlc-common";
30
31
  import { transformRLCModel } from "./transform/transform.js";
@@ -71,6 +72,7 @@ export async function $onEmit(context: EmitContext) {
71
72
  await emitContentByBuilder(program, buildParameterTypes, rlcModels);
72
73
  await emitContentByBuilder(program, buildIsUnexpectedHelper, rlcModels);
73
74
  await emitContentByBuilder(program, buildIndexFile, rlcModels);
75
+ await emitContentByBuilder(program, buildLogger, rlcModels);
74
76
  await emitContentByBuilder(program, buildTopLevelIndex, rlcModels);
75
77
  await emitContentByBuilder(program, buildPaginateHelper, rlcModels);
76
78
  await emitContentByBuilder(program, buildPollingHelper, rlcModels);
package/src/modelUtils.ts CHANGED
@@ -39,7 +39,9 @@ import {
39
39
  NumericLiteral,
40
40
  Service,
41
41
  listServices,
42
- Program
42
+ Program,
43
+ getEncode,
44
+ EncodeData
43
45
  } from "@typespec/compiler";
44
46
  import { reportDiagnostic } from "./lib.js";
45
47
  import {
@@ -74,12 +76,15 @@ export function getBinaryType(usage: SchemaContext[]) {
74
76
 
75
77
  export function getSchemaForType(
76
78
  program: Program,
79
+ dpgContext: SdkContext,
77
80
  typeInput: Type,
78
81
  usage?: SchemaContext[],
79
- needRef?: boolean
82
+ needRef: boolean = false,
83
+ relevantProperty?: ModelProperty
80
84
  ) {
81
85
  const type = getEffectiveModelFromType(program, typeInput);
82
- const builtinType = mapCadlTypeToTypeScript(program, type, usage);
86
+
87
+ const builtinType = mapCadlTypeToTypeScript(program, dpgContext, type, usage);
83
88
  if (builtinType !== undefined) {
84
89
  // add in description elements for types derived from primitive types (SecureString, etc.)
85
90
  const doc = getDoc(program, type);
@@ -89,7 +94,13 @@ export function getSchemaForType(
89
94
  return builtinType;
90
95
  }
91
96
  if (type.kind === "Model") {
92
- const schema = getSchemaForModel(program, type, usage, needRef) as any;
97
+ const schema = getSchemaForModel(
98
+ program,
99
+ dpgContext,
100
+ type,
101
+ usage,
102
+ needRef
103
+ ) as any;
93
104
  if (usage && usage.includes(SchemaContext.Output)) {
94
105
  schema.outputTypeName = `${schema.name}Output`;
95
106
  schema.typeName = `${schema.name}`;
@@ -97,13 +108,13 @@ export function getSchemaForType(
97
108
  schema.usage = usage;
98
109
  return schema;
99
110
  } else if (type.kind === "Union") {
100
- return getSchemaForUnion(program, type, usage);
111
+ return getSchemaForUnion(program, dpgContext, type, usage);
101
112
  } else if (type.kind === "UnionVariant") {
102
- return getSchemaForUnionVariant(program, type, usage);
113
+ return getSchemaForUnionVariant(program, dpgContext, type, usage);
103
114
  } else if (type.kind === "Enum") {
104
115
  return getSchemaForEnum(program, type);
105
116
  } else if (type.kind === "Scalar") {
106
- return getSchemaForScalar(program, type);
117
+ return getSchemaForScalar(program, dpgContext, type, relevantProperty);
107
118
  }
108
119
  if (isUnknownType(type)) {
109
120
  const returnType: any = { type: "unknown" };
@@ -152,16 +163,22 @@ export function includeDerivedModel(model: Model): boolean {
152
163
  );
153
164
  }
154
165
 
155
- function getSchemaForScalar(program: Program, scalar: Scalar) {
156
- let result = getSchemaForStdScalar(program, scalar);
166
+ function getSchemaForScalar(
167
+ program: Program,
168
+ dpgContext: SdkContext,
169
+ scalar: Scalar,
170
+ relevantProperty?: ModelProperty
171
+ ) {
172
+ let result = getSchemaForStdScalar(program, scalar, relevantProperty);
157
173
  if (!result && scalar.baseScalar) {
158
- result = getSchemaForScalar(program, scalar.baseScalar);
174
+ result = getSchemaForScalar(program, dpgContext, scalar.baseScalar);
159
175
  }
160
176
  return applyIntrinsicDecorators(program, scalar, result);
161
177
  }
162
178
 
163
179
  function getSchemaForUnion(
164
180
  program: Program,
181
+ dpgContext: SdkContext,
165
182
  union: Union,
166
183
  usage?: SchemaContext[]
167
184
  ) {
@@ -170,7 +187,7 @@ function getSchemaForUnion(
170
187
 
171
188
  for (const variant of variants) {
172
189
  // We already know it's not a model type
173
- values.push(getSchemaForType(program, variant.type, usage));
190
+ values.push(getSchemaForType(program, dpgContext, variant.type, usage));
174
191
  }
175
192
 
176
193
  const schema: any = {};
@@ -202,10 +219,11 @@ function getSchemaForUnion(
202
219
 
203
220
  function getSchemaForUnionVariant(
204
221
  program: Program,
222
+ dpgContext: SdkContext,
205
223
  variant: UnionVariant,
206
224
  usage?: SchemaContext[]
207
225
  ): Schema {
208
- return getSchemaForType(program, variant, usage);
226
+ return getSchemaForType(program, dpgContext, variant, usage);
209
227
  }
210
228
 
211
229
  // An openapi "string" can be defined in several different ways in Cadl
@@ -323,26 +341,10 @@ function isSchemaProperty(program: Program, property: ModelProperty) {
323
341
  const statusCodeinfo = isStatusCode(program, property);
324
342
  return !(headerInfo || queryInfo || pathInfo || statusCodeinfo);
325
343
  }
326
- // function getDefaultValue(program: Program, type: Type): any {
327
- // switch (type.kind) {
328
- // case "String":
329
- // return type.value;
330
- // case "Number":
331
- // return type.value;
332
- // case "Boolean":
333
- // return type.value;
334
- // case "Tuple":
335
- // return type.values.map(item => getDefaultValue(program, item));
336
- // default:
337
- // reportDiagnostic(program, {
338
- // code: "invalid-default",
339
- // format: { type: type.kind },
340
- // target: type,
341
- // });
342
- // }
343
- // }
344
+
344
345
  function getSchemaForModel(
345
346
  program: Program,
347
+ dpgContext: SdkContext,
346
348
  model: Model,
347
349
  usage?: SchemaContext[],
348
350
  needRef?: boolean
@@ -413,8 +415,13 @@ function getSchemaForModel(
413
415
  }
414
416
  })
415
417
  .join("");
416
- modelSchema.alias = `Paged<${templateName}>`;
417
- modelSchema.outputAlias = `Paged<${templateName}Output>`;
418
+ if (
419
+ paged.itemsProperty.name === "value" &&
420
+ paged.nextLinkProperty?.name === "nextLink"
421
+ ) {
422
+ modelSchema.alias = `Paged<${templateName}>`;
423
+ modelSchema.outputAlias = `Paged<${templateName}Output>`;
424
+ }
418
425
  }
419
426
  }
420
427
  }
@@ -430,10 +437,23 @@ function getSchemaForModel(
430
437
  };
431
438
  }
432
439
  for (const child of derivedModels) {
433
- const childSchema = getSchemaForType(program, child, usage, true);
440
+ const childSchema = getSchemaForType(
441
+ program,
442
+ dpgContext,
443
+ child,
444
+ usage,
445
+ true
446
+ );
434
447
  for (const [name, prop] of child.properties) {
435
448
  if (name === discriminator?.propertyName) {
436
- const propSchema = getSchemaForType(program, prop.type, usage, true);
449
+ const propSchema = getSchemaForType(
450
+ program,
451
+ dpgContext,
452
+ prop.type,
453
+ usage,
454
+ true,
455
+ prop
456
+ );
437
457
  childSchema.discriminatorValue = propSchema.type.replace(/"/g, "");
438
458
  break;
439
459
  }
@@ -476,7 +496,14 @@ function getSchemaForModel(
476
496
  continue;
477
497
  }
478
498
 
479
- const propSchema = getSchemaForType(program, prop.type, usage, true);
499
+ const propSchema = getSchemaForType(
500
+ program,
501
+ dpgContext,
502
+ prop.type,
503
+ usage,
504
+ true,
505
+ prop
506
+ );
480
507
  if (propSchema === undefined) {
481
508
  continue;
482
509
  }
@@ -501,17 +528,18 @@ function getSchemaForModel(
501
528
  }
502
529
 
503
530
  // Apply decorators on the property to the type's schema
504
- const newPropSchema = applyIntrinsicDecorators(program, prop, propSchema);
531
+ const newPropSchema = applyIntrinsicDecorators(
532
+ program,
533
+
534
+ prop,
535
+ propSchema
536
+ );
505
537
  if (newPropSchema === undefined) {
506
538
  continue;
507
539
  }
508
540
  // Use the description from ModelProperty not devired from Model Type
509
541
  newPropSchema.description = propertyDescription;
510
542
 
511
- if (prop.default) {
512
- // modelSchema.properties[name]['default'] = getDefaultValue(program, prop.default);
513
- }
514
-
515
543
  // Should the property be marked as readOnly?
516
544
  const vis = getVisibility(program, prop);
517
545
  if (vis && vis.includes("read")) {
@@ -549,15 +577,24 @@ function getSchemaForModel(
549
577
  ) {
550
578
  // Take the base model schema but carry across the documentation property
551
579
  // that we set before
552
- const baseSchema = getSchemaForType(program, model.baseModel, usage);
580
+ const baseSchema = getSchemaForType(
581
+ program,
582
+ dpgContext,
583
+ model.baseModel,
584
+ usage
585
+ );
553
586
  modelSchema = {
554
587
  ...baseSchema,
555
588
  description: modelSchema.description
556
589
  };
557
590
  } else if (model.baseModel) {
558
591
  modelSchema.parents = {
559
- all: [getSchemaForType(program, model.baseModel, usage, true)],
560
- immediate: [getSchemaForType(program, model.baseModel, usage, true)]
592
+ all: [
593
+ getSchemaForType(program, dpgContext, model.baseModel, usage, true)
594
+ ],
595
+ immediate: [
596
+ getSchemaForType(program, dpgContext, model.baseModel, usage, true)
597
+ ]
561
598
  };
562
599
  }
563
600
  return modelSchema;
@@ -566,6 +603,7 @@ function getSchemaForModel(
566
603
  // OA schema is just a regular object schema.
567
604
  function mapCadlTypeToTypeScript(
568
605
  program: Program,
606
+ dpgContext: SdkContext,
569
607
  cadlType: Type,
570
608
  usage?: SchemaContext[]
571
609
  ): any {
@@ -577,7 +615,7 @@ function mapCadlTypeToTypeScript(
577
615
  case "Boolean":
578
616
  return { type: `${cadlType.value}` };
579
617
  case "Model":
580
- return mapCadlStdTypeToTypeScript(program, cadlType, usage);
618
+ return mapCadlStdTypeToTypeScript(program, dpgContext, cadlType, usage);
581
619
  }
582
620
  if (cadlType.kind === undefined) {
583
621
  if (typeof cadlType === "string") {
@@ -685,6 +723,7 @@ function getSchemaForEnum(program: Program, e: Enum) {
685
723
  */
686
724
  function mapCadlStdTypeToTypeScript(
687
725
  program: Program,
726
+ dpgContext: SdkContext,
688
727
  cadlType: Model,
689
728
  usage?: SchemaContext[]
690
729
  ): any | undefined {
@@ -696,6 +735,7 @@ function mapCadlStdTypeToTypeScript(
696
735
  if (name === "string") {
697
736
  const valueType = getSchemaForType(
698
737
  program,
738
+ dpgContext,
699
739
  indexer.value!,
700
740
  usage,
701
741
  true
@@ -727,7 +767,13 @@ function mapCadlStdTypeToTypeScript(
727
767
  } else if (name === "integer") {
728
768
  schema = {
729
769
  type: "array",
730
- items: getSchemaForType(program, indexer.value!, usage, true),
770
+ items: getSchemaForType(
771
+ program,
772
+ dpgContext,
773
+ indexer.value!,
774
+ usage,
775
+ true
776
+ ),
731
777
  description: getDoc(program, cadlType)
732
778
  };
733
779
  if (
@@ -779,10 +825,26 @@ function isUnionType(type: Type) {
779
825
  return type.kind === "Union";
780
826
  }
781
827
 
782
- function getSchemaForStdScalar(program: Program, cadlType: Scalar) {
828
+ function getSchemaForStdScalar(
829
+ program: Program,
830
+ cadlType: Scalar,
831
+ relevantProperty?: ModelProperty
832
+ ) {
783
833
  if (!program.checker.isStdType(cadlType)) {
784
834
  return undefined;
785
835
  }
836
+
837
+ /**
838
+ * lookup for @encode decorator
839
+ * if absent use typespec type (or default way of serializing that type)
840
+ * if present respect type provided in @encode
841
+ */
842
+ if (relevantProperty) {
843
+ const encodeData = getEncode(program, relevantProperty);
844
+ if (encodeData && isEncodeTypeEffective(cadlType, encodeData)) {
845
+ cadlType = encodeData.type;
846
+ }
847
+ }
786
848
  const name = cadlType.name;
787
849
  const description = getSummary(program, cadlType);
788
850
  switch (name) {
@@ -848,7 +910,9 @@ function getSchemaForStdScalar(program: Program, cadlType: Scalar) {
848
910
  format: "float"
849
911
  });
850
912
  case "string":
851
- return applyIntrinsicDecorators(program, cadlType, { type: "string" });
913
+ return applyIntrinsicDecorators(program, cadlType, {
914
+ type: "string"
915
+ });
852
916
  case "boolean":
853
917
  return { type: "boolean", description };
854
918
  case "plainDate":
@@ -867,6 +931,14 @@ function getSchemaForStdScalar(program: Program, cadlType: Scalar) {
867
931
  typeName: "Date | string",
868
932
  outputTypeName: "string"
869
933
  };
934
+ case "offsetDateTime":
935
+ return {
936
+ type: "string",
937
+ format: "date-time",
938
+ description,
939
+ typeName: "Date | string",
940
+ outputTypeName: "string"
941
+ };
870
942
  case "plainTime":
871
943
  return {
872
944
  type: "string",
@@ -880,6 +952,28 @@ function getSchemaForStdScalar(program: Program, cadlType: Scalar) {
880
952
  }
881
953
  }
882
954
 
955
+ function isEncodeTypeEffective(
956
+ type: Scalar,
957
+ encodeData: EncodeData | undefined
958
+ ) {
959
+ if (!encodeData) {
960
+ return false;
961
+ }
962
+ const datetimeTypes = [
963
+ "plaindate",
964
+ "utcdatetime",
965
+ "offsetdatetime",
966
+ "plaintime"
967
+ ];
968
+ if (
969
+ datetimeTypes.includes(type.name.toLowerCase()) &&
970
+ encodeData.type.name === "string"
971
+ ) {
972
+ return false;
973
+ }
974
+ return true;
975
+ }
976
+
883
977
  export function getTypeName(schema: Schema, usage?: SchemaContext[]): string {
884
978
  // TODO: Handle more cases
885
979
  return getPriorityName(schema, usage) ?? schema.type ?? "any";
@@ -935,6 +1029,7 @@ export function getFormattedPropertyDoc(
935
1029
 
936
1030
  export function getBodyType(
937
1031
  program: Program,
1032
+
938
1033
  route: HttpOperation
939
1034
  ): Type | undefined {
940
1035
  let bodyModel = route.parameters.bodyType;
@@ -950,6 +1045,7 @@ export function getBodyType(
950
1045
  if (responseBody) {
951
1046
  const bodyTypeInResponse = getEffectiveModelFromType(
952
1047
  program,
1048
+
953
1049
  responseBody.type
954
1050
  );
955
1051
  // response body type is reosurce type, and request body type (if templated) contains resource type
@@ -1,14 +1,15 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT License.
3
3
 
4
- import { NameType, normalizeName } from "@azure-tools/rlc-common";
5
4
  import {
6
- DecoratedType,
7
- ignoreDiagnostics,
8
- Model,
9
- Program,
10
- Type
11
- } from "@typespec/compiler";
5
+ NameType,
6
+ Paths,
7
+ ResponseMetadata,
8
+ ResponseTypes,
9
+ getLroLogicalResponseName,
10
+ normalizeName
11
+ } from "@azure-tools/rlc-common";
12
+ import { ignoreDiagnostics, Model, Program, Type } from "@typespec/compiler";
12
13
  import {
13
14
  getHttpOperation,
14
15
  HttpOperation,
@@ -16,6 +17,7 @@ import {
16
17
  StatusCode
17
18
  } from "@typespec/http";
18
19
  import {
20
+ getLroMetadata,
19
21
  getPagedResult,
20
22
  PagedResultMetadata
21
23
  } from "@azure-tools/typespec-azure-core";
@@ -26,6 +28,11 @@ import {
26
28
  listOperationsInOperationGroup,
27
29
  SdkOperationGroup
28
30
  } from "@azure-tools/typespec-client-generator-core";
31
+ import {
32
+ OperationLroDetail,
33
+ OPERATION_LRO_LOW_PRIORITY,
34
+ OPERATION_LRO_HIGH_PRIORITY
35
+ } from "@azure-tools/rlc-common";
29
36
 
30
37
  export function getNormalizedOperationName(
31
38
  route: HttpOperation,
@@ -52,7 +59,11 @@ export function getOperationStatuscode(
52
59
 
53
60
  // FIXME: this is the placeholder function to extract the operationGroupName
54
61
  export function getOperationGroupName(operationGroup?: SdkOperationGroup) {
55
- return operationGroup?.type.name ?? "";
62
+ return normalizeName(
63
+ operationGroup?.type.name ?? "",
64
+ NameType.Interface,
65
+ true
66
+ );
56
67
  }
57
68
 
58
69
  export function isDefaultStatusCode(statusCode: StatusCode) {
@@ -82,27 +93,105 @@ export function isLongRunningOperation(
82
93
  program: Program,
83
94
  operation: HttpOperation
84
95
  ) {
85
- program;
86
- for (const resp of operation.responses) {
87
- if (!resp.responses || !resp.responses.length) {
88
- continue;
89
- }
90
- if (hasDecorator(operation.operation, "$pollingOperation")) {
91
- return true;
92
- }
93
- for (const unit of resp.responses) {
94
- for (const [_, header] of Object.entries(unit.headers!)) {
95
- if (hasDecorator(header, "$pollingLocation")) {
96
- return true;
96
+ return Boolean(getLroMetadata(program, operation.operation));
97
+ }
98
+
99
+ /**
100
+ * Return if we have a client-level LRO overloading
101
+ * @param pathDictionary
102
+ * @returns
103
+ */
104
+ export function getClientLroOverload(pathDictionary: Paths) {
105
+ let lroCounts = 0,
106
+ allowCounts = 0;
107
+ for (const details of Object.values(pathDictionary)) {
108
+ for (const methodDetails of Object.values(details.methods)) {
109
+ const lroDetail = methodDetails[0].operationHelperDetail?.lroDetails;
110
+ if (lroDetail?.isLongRunning) {
111
+ lroCounts++;
112
+ if (!lroDetail.operationLroOverload) {
113
+ return false;
97
114
  }
115
+ allowCounts++;
98
116
  }
99
117
  }
100
118
  }
119
+
120
+ return Boolean(lroCounts > 0 && lroCounts === allowCounts);
121
+ }
122
+
123
+ /**
124
+ * Check if we have an operation-level overloading
125
+ * @param program
126
+ * @param operation The operation detail
127
+ * @param existingResponseTypes auxilary param for current response types
128
+ * @param existingResponses auxilary param for raw response data
129
+ * @returns
130
+ */
131
+ export function getOperationLroOverload(
132
+ program: Program,
133
+ operation: HttpOperation,
134
+ existingResponseTypes?: ResponseTypes,
135
+ existingResponses?: ResponseMetadata[]
136
+ ) {
137
+ const metadata = getLroMetadata(program, operation.operation);
138
+ if (!metadata) {
139
+ return false;
140
+ }
141
+ const hasSuccessReturn = existingResponses?.filter((r) =>
142
+ r.statusCode.startsWith("20")
143
+ );
144
+ if (existingResponseTypes?.success || hasSuccessReturn) {
145
+ return true;
146
+ }
101
147
  return false;
102
148
  }
103
149
 
104
- function hasDecorator(type: DecoratedType, name: string): boolean {
105
- return type.decorators.find((it) => it.decorator.name === name) !== undefined;
150
+ /**
151
+ * Extract the operation LRO details
152
+ * @param program
153
+ * @param operation Operation detail
154
+ * @param responsesTypes Calculated response types
155
+ * @param operationGroupName Operation group name
156
+ * @returns
157
+ */
158
+ export function extractOperationLroDetail(
159
+ program: Program,
160
+ operation: HttpOperation,
161
+ responsesTypes: ResponseTypes,
162
+ operationGroupName: string
163
+ ): OperationLroDetail {
164
+ let logicalResponseTypes: ResponseTypes | undefined;
165
+
166
+ let precedence = OPERATION_LRO_LOW_PRIORITY;
167
+ const operationLroOverload = getOperationLroOverload(
168
+ program,
169
+ operation,
170
+ responsesTypes
171
+ );
172
+ if (operationLroOverload) {
173
+ logicalResponseTypes = {
174
+ error: responsesTypes.error,
175
+ success: [
176
+ getLroLogicalResponseName(operationGroupName, operation.operation.name)
177
+ ]
178
+ };
179
+ const metadata = getLroMetadata(program, operation.operation);
180
+ precedence =
181
+ metadata?.finalStep &&
182
+ metadata?.finalStep.target &&
183
+ metadata.finalStep.kind === "pollingSuccessProperty" &&
184
+ metadata?.finalStep?.target?.name === "result"
185
+ ? OPERATION_LRO_HIGH_PRIORITY
186
+ : OPERATION_LRO_LOW_PRIORITY;
187
+ }
188
+
189
+ return {
190
+ isLongRunning: Boolean(getLroMetadata(program, operation.operation)),
191
+ logicalResponseTypes,
192
+ operationLroOverload,
193
+ precedence
194
+ };
106
195
  }
107
196
 
108
197
  export function hasPollingOperations(