@azure-tools/typespec-ts 0.11.0 → 0.12.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 (318) hide show
  1. package/.rush/temp/package-deps_build.json +195 -71
  2. package/.rush/temp/shrinkwrap-deps.json +58 -54
  3. package/CHANGELOG.md +4 -0
  4. package/CONTRIBUTING.md +5 -2
  5. package/README.md +3 -3
  6. package/dist/src/casingUtils.d.ts +4 -0
  7. package/dist/src/casingUtils.d.ts.map +1 -0
  8. package/dist/src/casingUtils.js +39 -0
  9. package/dist/src/casingUtils.js.map +1 -0
  10. package/dist/src/emitUtil.js +7 -1
  11. package/dist/src/emitUtil.js.map +1 -1
  12. package/dist/src/index.d.ts.map +1 -1
  13. package/dist/src/index.js +41 -9
  14. package/dist/src/index.js.map +1 -1
  15. package/dist/src/lib.d.ts.map +1 -1
  16. package/dist/src/lib.js +2 -1
  17. package/dist/src/lib.js.map +1 -1
  18. package/dist/src/modelUtils.d.ts +22 -1
  19. package/dist/src/modelUtils.d.ts.map +1 -1
  20. package/dist/src/modelUtils.js +105 -13
  21. package/dist/src/modelUtils.js.map +1 -1
  22. package/dist/src/modular/buildApiIndex.d.ts +3 -0
  23. package/dist/src/modular/buildApiIndex.d.ts.map +1 -0
  24. package/dist/src/modular/buildApiIndex.js +12 -0
  25. package/dist/src/modular/buildApiIndex.js.map +1 -0
  26. package/dist/src/modular/buildClassicalClient.d.ts +4 -0
  27. package/dist/src/modular/buildClassicalClient.d.ts.map +1 -0
  28. package/dist/src/modular/buildClassicalClient.js +112 -0
  29. package/dist/src/modular/buildClassicalClient.js.map +1 -0
  30. package/dist/src/modular/buildClientContext.d.ts +7 -0
  31. package/dist/src/modular/buildClientContext.d.ts.map +1 -0
  32. package/dist/src/modular/buildClientContext.js +72 -0
  33. package/dist/src/modular/buildClientContext.js.map +1 -0
  34. package/dist/src/modular/buildCodeModel.d.ts +14 -0
  35. package/dist/src/modular/buildCodeModel.d.ts.map +1 -0
  36. package/dist/src/modular/buildCodeModel.js +1110 -0
  37. package/dist/src/modular/buildCodeModel.js.map +1 -0
  38. package/dist/src/modular/buildOperations.d.ts +13 -0
  39. package/dist/src/modular/buildOperations.d.ts.map +1 -0
  40. package/dist/src/modular/buildOperations.js +70 -0
  41. package/dist/src/modular/buildOperations.js.map +1 -0
  42. package/dist/src/modular/buildProjectFiles.d.ts +5 -0
  43. package/dist/src/modular/buildProjectFiles.d.ts.map +1 -0
  44. package/dist/src/modular/buildProjectFiles.js +182 -0
  45. package/dist/src/modular/buildProjectFiles.js.map +1 -0
  46. package/dist/src/modular/buildRootIndex.d.ts +4 -0
  47. package/dist/src/modular/buildRootIndex.d.ts.map +1 -0
  48. package/dist/src/modular/buildRootIndex.js +66 -0
  49. package/dist/src/modular/buildRootIndex.js.map +1 -0
  50. package/dist/src/modular/buildSharedTypes.d.ts +6 -0
  51. package/dist/src/modular/buildSharedTypes.d.ts.map +1 -0
  52. package/dist/src/modular/buildSharedTypes.js +33 -0
  53. package/dist/src/modular/buildSharedTypes.js.map +1 -0
  54. package/dist/src/modular/emitModels.d.ts +7 -0
  55. package/dist/src/modular/emitModels.d.ts.map +1 -0
  56. package/dist/src/modular/emitModels.js +63 -0
  57. package/dist/src/modular/emitModels.js.map +1 -0
  58. package/dist/src/modular/helpers/clientHelpers.d.ts +4 -0
  59. package/dist/src/modular/helpers/clientHelpers.d.ts.map +1 -0
  60. package/dist/src/modular/helpers/clientHelpers.js +31 -0
  61. package/dist/src/modular/helpers/clientHelpers.js.map +1 -0
  62. package/dist/src/modular/helpers/credentialHelpers.d.ts +7 -0
  63. package/dist/src/modular/helpers/credentialHelpers.d.ts.map +1 -0
  64. package/dist/src/modular/helpers/credentialHelpers.js +32 -0
  65. package/dist/src/modular/helpers/credentialHelpers.js.map +1 -0
  66. package/dist/src/modular/helpers/namingHelpers.d.ts +3 -0
  67. package/dist/src/modular/helpers/namingHelpers.d.ts.map +1 -0
  68. package/dist/src/modular/helpers/namingHelpers.js +4 -0
  69. package/dist/src/modular/helpers/namingHelpers.js.map +1 -0
  70. package/dist/src/modular/helpers/operationHelpers.d.ts +8 -0
  71. package/dist/src/modular/helpers/operationHelpers.d.ts.map +1 -0
  72. package/dist/src/modular/helpers/operationHelpers.js +274 -0
  73. package/dist/src/modular/helpers/operationHelpers.js.map +1 -0
  74. package/dist/src/modular/helpers/parameterHelpers.d.ts +3 -0
  75. package/dist/src/modular/helpers/parameterHelpers.d.ts.map +1 -0
  76. package/dist/src/modular/helpers/parameterHelpers.js +16 -0
  77. package/dist/src/modular/helpers/parameterHelpers.js.map +1 -0
  78. package/dist/src/modular/helpers/typeHelpers.d.ts +16 -0
  79. package/dist/src/modular/helpers/typeHelpers.d.ts.map +1 -0
  80. package/dist/src/modular/helpers/typeHelpers.js +92 -0
  81. package/dist/src/modular/helpers/typeHelpers.js.map +1 -0
  82. package/dist/src/modular/interfaces.d.ts +10 -0
  83. package/dist/src/modular/interfaces.d.ts.map +1 -0
  84. package/dist/src/modular/interfaces.js +2 -0
  85. package/dist/src/modular/interfaces.js.map +1 -0
  86. package/dist/src/modular/modularCodeModel.d.ts +121 -0
  87. package/dist/src/modular/modularCodeModel.d.ts.map +1 -0
  88. package/dist/src/modular/modularCodeModel.js +2 -0
  89. package/dist/src/modular/modularCodeModel.js.map +1 -0
  90. package/dist/src/operationUtil.d.ts +4 -4
  91. package/dist/src/operationUtil.d.ts.map +1 -1
  92. package/dist/src/operationUtil.js +2 -1
  93. package/dist/src/operationUtil.js.map +1 -1
  94. package/dist/src/transform/transform.d.ts +4 -6
  95. package/dist/src/transform/transform.d.ts.map +1 -1
  96. package/dist/src/transform/transform.js +11 -55
  97. package/dist/src/transform/transform.js.map +1 -1
  98. package/dist/src/transform/transformAnnotationDetails.d.ts +2 -2
  99. package/dist/src/transform/transformAnnotationDetails.d.ts.map +1 -1
  100. package/dist/src/transform/transformAnnotationDetails.js.map +1 -1
  101. package/dist/src/transform/transformApiVersionInfo.d.ts +5 -0
  102. package/dist/src/transform/transformApiVersionInfo.d.ts.map +1 -0
  103. package/dist/src/transform/transformApiVersionInfo.js +64 -0
  104. package/dist/src/transform/transformApiVersionInfo.js.map +1 -0
  105. package/dist/src/transform/transformParameters.d.ts +2 -2
  106. package/dist/src/transform/transformParameters.d.ts.map +1 -1
  107. package/dist/src/transform/transformParameters.js +2 -3
  108. package/dist/src/transform/transformParameters.js.map +1 -1
  109. package/dist/src/transform/transformPaths.d.ts +2 -2
  110. package/dist/src/transform/transformPaths.d.ts.map +1 -1
  111. package/dist/src/transform/transformPaths.js.map +1 -1
  112. package/dist/src/transform/transformResponses.d.ts +2 -2
  113. package/dist/src/transform/transformResponses.d.ts.map +1 -1
  114. package/dist/src/transform/transformResponses.js.map +1 -1
  115. package/dist/src/transform/transformSchemas.d.ts +2 -2
  116. package/dist/src/transform/transformSchemas.d.ts.map +1 -1
  117. package/dist/src/transform/transformSchemas.js +10 -22
  118. package/dist/src/transform/transformSchemas.js.map +1 -1
  119. package/dist/src/transform/transfromRLCOptions.d.ts +2 -2
  120. package/dist/src/transform/transfromRLCOptions.js +1 -1
  121. package/dist/src/transform/transfromRLCOptions.js.map +1 -1
  122. package/dist/tsconfig.tsbuildinfo +1 -1
  123. package/package.json +25 -18
  124. package/src/casingUtils.ts +48 -0
  125. package/src/emitUtil.ts +9 -4
  126. package/src/index.ts +53 -10
  127. package/src/lib.ts +2 -1
  128. package/src/modelUtils.ts +137 -14
  129. package/src/modular/buildApiIndex.ts +13 -0
  130. package/src/modular/buildClassicalClient.ts +147 -0
  131. package/src/modular/buildClientContext.ts +104 -0
  132. package/src/modular/buildCodeModel.ts +1449 -0
  133. package/src/modular/buildOperations.ts +95 -0
  134. package/src/modular/buildProjectFiles.ts +219 -0
  135. package/src/modular/buildRootIndex.ts +94 -0
  136. package/src/modular/buildSharedTypes.ts +40 -0
  137. package/src/modular/emitModels.ts +72 -0
  138. package/src/modular/helpers/clientHelpers.ts +38 -0
  139. package/src/modular/helpers/credentialHelpers.ts +40 -0
  140. package/src/modular/helpers/namingHelpers.ts +5 -0
  141. package/src/modular/helpers/operationHelpers.ts +418 -0
  142. package/src/modular/helpers/parameterHelpers.ts +17 -0
  143. package/src/modular/helpers/typeHelpers.ts +106 -0
  144. package/src/modular/interfaces.ts +10 -0
  145. package/src/modular/modularCodeModel.ts +151 -0
  146. package/src/modular/static/karma.conf.cjs +120 -0
  147. package/src/modular/static/rollup.test.config.js +67 -0
  148. package/src/modular/static/scripts/renameOutput.mjs +17 -0
  149. package/src/operationUtil.ts +9 -9
  150. package/src/transform/transform.ts +23 -93
  151. package/src/transform/transformAnnotationDetails.ts +8 -8
  152. package/src/transform/transformApiVersionInfo.ts +108 -0
  153. package/src/transform/transformParameters.ts +10 -10
  154. package/src/transform/transformPaths.ts +9 -9
  155. package/src/transform/transformResponses.ts +6 -6
  156. package/src/transform/transformSchemas.ts +20 -28
  157. package/src/transform/transfromRLCOptions.ts +3 -3
  158. package/test/commands/cadl-ranch-list.ts +36 -0
  159. package/test/commands/run.ts +3 -13
  160. package/test/integration/arrayItemTypes.spec.ts +4 -1
  161. package/test/integration/azurecore.spec.ts +130 -0
  162. package/test/integration/collectionFormat.spec.ts +74 -0
  163. package/test/integration/dictionary.spec.ts +4 -0
  164. package/test/integration/generated/arrays/itemTypes/src/clientDefinitions.ts +15 -0
  165. package/test/integration/generated/arrays/itemTypes/src/parameters.ts +8 -0
  166. package/test/integration/generated/arrays/itemTypes/src/responses.ts +11 -0
  167. package/test/integration/generated/arrays/itemTypes/tspconfig.yaml +5 -2
  168. package/test/integration/generated/authentication/apiKey/package.json +2 -2
  169. package/test/integration/generated/authentication/apiKey/tspconfig.yaml +5 -2
  170. package/test/integration/generated/authentication/oauth2/tspconfig.yaml +5 -2
  171. package/test/integration/generated/authentication/union/tspconfig.yaml +5 -2
  172. package/test/integration/generated/azure/core/.eslintrc.json +11 -0
  173. package/test/integration/generated/azure/core/README.md +56 -0
  174. package/test/integration/generated/azure/core/api-extractor.json +18 -0
  175. package/test/integration/generated/azure/core/package.json +81 -0
  176. package/test/integration/generated/azure/core/rollup.config.js +118 -0
  177. package/test/integration/generated/azure/core/src/azureCoreClient.ts +31 -0
  178. package/test/integration/generated/azure/core/src/clientDefinitions.ts +94 -0
  179. package/test/integration/generated/azure/core/src/index.ts +16 -0
  180. package/test/integration/generated/azure/core/src/isUnexpected.ts +167 -0
  181. package/test/integration/generated/azure/core/src/models.ts +18 -0
  182. package/test/integration/generated/azure/core/src/outputModels.ts +31 -0
  183. package/test/integration/generated/azure/core/src/paginateHelper.ts +154 -0
  184. package/test/integration/generated/azure/core/src/parameters.ts +67 -0
  185. package/test/integration/generated/azure/core/src/responses.ts +136 -0
  186. package/test/integration/generated/azure/core/src/serializeHelper.ts +16 -0
  187. package/test/integration/generated/azure/core/tsconfig.json +25 -0
  188. package/test/integration/generated/azure/core/tspconfig.yaml +15 -0
  189. package/test/integration/generated/azure/core-traits/.eslintrc.json +11 -0
  190. package/test/integration/generated/azure/core-traits/README.md +56 -0
  191. package/test/integration/generated/azure/core-traits/api-extractor.json +18 -0
  192. package/test/integration/generated/azure/core-traits/package.json +80 -0
  193. package/test/integration/generated/azure/core-traits/rollup.config.js +118 -0
  194. package/test/integration/generated/azure/core-traits/src/azureCoreTraitsClient.ts +31 -0
  195. package/test/integration/generated/azure/core-traits/src/clientDefinitions.ts +40 -0
  196. package/test/integration/generated/azure/core-traits/src/index.ts +13 -0
  197. package/test/integration/generated/azure/core-traits/src/isUnexpected.ts +110 -0
  198. package/test/integration/generated/azure/core-traits/src/outputModels.ts +10 -0
  199. package/test/integration/generated/azure/core-traits/src/parameters.ts +41 -0
  200. package/test/integration/generated/azure/core-traits/src/responses.ts +56 -0
  201. package/test/integration/generated/azure/core-traits/tsconfig.json +25 -0
  202. package/test/integration/generated/azure/core-traits/tspconfig.yaml +15 -0
  203. package/test/integration/generated/dictionary/package.json +2 -2
  204. package/test/integration/generated/dictionary/src/clientDefinitions.ts +15 -0
  205. package/test/integration/generated/dictionary/src/parameters.ts +8 -0
  206. package/test/integration/generated/dictionary/src/responses.ts +11 -0
  207. package/test/integration/generated/dictionary/tspconfig.yaml +5 -2
  208. package/test/integration/generated/enums/extensible/package.json +2 -2
  209. package/test/integration/generated/enums/extensible/tspconfig.yaml +5 -2
  210. package/test/integration/generated/enums/fixed/package.json +2 -2
  211. package/test/integration/generated/enums/fixed/tspconfig.yaml +5 -2
  212. package/test/integration/generated/hello/package.json +2 -2
  213. package/test/integration/generated/hello/tspconfig.yaml +5 -2
  214. package/test/integration/generated/internal/src/clientDefinitions.ts +27 -0
  215. package/test/integration/generated/internal/src/index.ts +13 -0
  216. package/test/integration/generated/internal/src/internalClient.ts +31 -0
  217. package/test/integration/generated/internal/src/models.ts +8 -0
  218. package/test/integration/generated/internal/src/outputModels.ts +13 -0
  219. package/test/integration/generated/internal/src/parameters.ts +21 -0
  220. package/test/integration/generated/internal/src/responses.ts +20 -0
  221. package/test/integration/generated/internal/tspconfig.yaml +14 -0
  222. package/test/integration/generated/lro/lroBasic/package.json +2 -2
  223. package/test/integration/generated/lro/lroBasic/src/index.ts +1 -0
  224. package/test/integration/generated/lro/lroBasic/src/outputModels.ts +8 -0
  225. package/test/integration/generated/lro/lroBasic/src/responses.ts +4 -3
  226. package/test/integration/generated/lro/lroBasic/tspconfig.yaml +5 -2
  227. package/test/integration/generated/lro/lroCore/.eslintrc.json +11 -0
  228. package/test/integration/generated/lro/lroCore/README.md +56 -0
  229. package/test/integration/generated/lro/lroCore/api-extractor.json +18 -0
  230. package/test/integration/generated/lro/lroCore/package.json +82 -0
  231. package/test/integration/generated/lro/lroCore/rollup.config.js +118 -0
  232. package/test/integration/generated/lro/lroCore/src/azureLroCore.ts +31 -0
  233. package/test/integration/generated/lro/lroCore/src/clientDefinitions.ts +51 -0
  234. package/test/integration/generated/lro/lroCore/src/index.ts +15 -0
  235. package/test/integration/generated/lro/lroCore/src/isUnexpected.ts +128 -0
  236. package/test/integration/generated/lro/lroCore/src/models.ts +8 -0
  237. package/test/integration/generated/lro/lroCore/src/outputModels.ts +50 -0
  238. package/test/integration/generated/lro/lroCore/src/parameters.ts +25 -0
  239. package/test/integration/generated/lro/lroCore/src/pollingHelper.ts +75 -0
  240. package/test/integration/generated/lro/lroCore/src/responses.ts +91 -0
  241. package/test/integration/generated/lro/lroCore/tsconfig.json +25 -0
  242. package/test/integration/generated/lro/lroCore/tspconfig.yaml +14 -0
  243. package/test/integration/generated/models/inheritance/package.json +2 -2
  244. package/test/integration/generated/models/inheritance/tspconfig.yaml +5 -2
  245. package/test/integration/generated/models/propertyNullable/.eslintrc.json +11 -0
  246. package/test/integration/generated/models/propertyNullable/README.md +56 -0
  247. package/test/integration/generated/models/propertyNullable/api-extractor.json +18 -0
  248. package/test/integration/generated/models/propertyNullable/package.json +80 -0
  249. package/test/integration/generated/models/propertyNullable/rollup.config.js +118 -0
  250. package/test/integration/generated/models/propertyNullable/src/clientDefinitions.ts +227 -0
  251. package/test/integration/generated/models/propertyNullable/src/index.ts +13 -0
  252. package/test/integration/generated/models/propertyNullable/src/models.ts +56 -0
  253. package/test/integration/generated/models/propertyNullable/src/modelsPropertyNullable.ts +31 -0
  254. package/test/integration/generated/models/propertyNullable/src/outputModels.ts +56 -0
  255. package/test/integration/generated/models/propertyNullable/src/parameters.ts +195 -0
  256. package/test/integration/generated/models/propertyNullable/src/responses.ts +144 -0
  257. package/test/integration/generated/models/propertyNullable/tsconfig.json +25 -0
  258. package/test/integration/generated/models/propertyNullable/tspconfig.yaml +14 -0
  259. package/test/integration/generated/models/propertyOptional/package.json +2 -2
  260. package/test/integration/generated/models/propertyOptional/tspconfig.yaml +5 -2
  261. package/test/integration/generated/models/propertyTypes/package.json +2 -2
  262. package/test/integration/generated/models/propertyTypes/tspconfig.yaml +5 -2
  263. package/test/integration/generated/models/usage/package.json +2 -2
  264. package/test/integration/generated/models/usage/tspconfig.yaml +5 -2
  265. package/test/integration/generated/models/visibility/package.json +2 -2
  266. package/test/integration/generated/models/visibility/tspconfig.yaml +5 -2
  267. package/test/integration/generated/parameters/collection-format/src/clientDefinitions.ts +39 -0
  268. package/test/integration/generated/parameters/collection-format/src/collectionFormatClient.ts +31 -0
  269. package/test/integration/generated/parameters/collection-format/src/index.ts +12 -0
  270. package/test/integration/generated/parameters/collection-format/src/parameters.ts +38 -0
  271. package/test/integration/generated/parameters/collection-format/src/responses.ts +19 -0
  272. package/test/integration/generated/parameters/collection-format/src/serializeHelper.ts +16 -0
  273. package/test/integration/generated/parameters/collection-format/tspconfig.yaml +14 -0
  274. package/test/integration/generated/projection/src/clientDefinitions.ts +45 -0
  275. package/test/integration/generated/projection/src/index.ts +12 -0
  276. package/test/integration/generated/projection/src/models.ts +11 -0
  277. package/test/integration/generated/projection/src/parameters.ts +26 -0
  278. package/test/integration/generated/projection/src/projectionClient.ts +31 -0
  279. package/test/integration/generated/projection/src/responses.ts +19 -0
  280. package/test/integration/generated/projection/tspconfig.yaml +14 -0
  281. package/test/integration/generated/resiliency/devDriven/package.json +2 -2
  282. package/test/integration/generated/resiliency/devDriven/tspconfig.yaml +5 -2
  283. package/test/integration/generated/resiliency/srvDriven1/package.json +2 -2
  284. package/test/integration/generated/resiliency/srvDriven1/tspconfig.yaml +5 -2
  285. package/test/integration/generated/resiliency/srvDriven2/package.json +2 -2
  286. package/test/integration/generated/resiliency/srvDriven2/src/resiliencyServiceDriven2.ts +1 -1
  287. package/test/integration/generated/resiliency/srvDriven2/tspconfig.yaml +5 -2
  288. package/test/integration/generated/server/path/multiple/src/clientDefinitions.ts +35 -0
  289. package/test/integration/generated/server/path/multiple/src/index.ts +11 -0
  290. package/test/integration/generated/server/path/multiple/src/multipleParamInServerPathClient.ts +39 -0
  291. package/test/integration/generated/server/path/multiple/src/parameters.ts +7 -0
  292. package/test/integration/generated/server/path/multiple/src/responses.ts +14 -0
  293. package/test/integration/generated/server/path/multiple/tspconfig.yaml +14 -0
  294. package/test/integration/generated/server/path/single/src/clientDefinitions.ts +19 -0
  295. package/test/integration/generated/server/path/single/src/index.ts +11 -0
  296. package/test/integration/generated/server/path/single/src/parameters.ts +6 -0
  297. package/test/integration/generated/server/path/single/src/responses.ts +9 -0
  298. package/test/integration/generated/server/path/single/src/singleParamInServerPathClient.ts +34 -0
  299. package/test/integration/generated/server/path/single/tspconfig.yaml +14 -0
  300. package/test/integration/generated/specialWords/tspconfig.yaml +5 -2
  301. package/test/integration/generated/unions/tspconfig.yaml +5 -2
  302. package/test/integration/internal.spec.ts +43 -0
  303. package/test/integration/lroBasic.spec.ts +1 -1
  304. package/test/integration/modelPropertyNullable.spec.ts +115 -0
  305. package/test/integration/projection.spec.ts +55 -0
  306. package/test/integration/server.spec.ts +59 -0
  307. package/test/unit/apiVersion.spec.ts +388 -0
  308. package/test/unit/clientFactoryGenerator.spec.ts +0 -131
  309. package/test/unit/modelsGenerator.spec.ts +2 -2
  310. package/test/unit/parametersGenerator.spec.ts +1 -1
  311. package/test/unit/responsesGenerator.spec.ts +1 -1
  312. package/test/unit/util/emitUtil.ts +6 -5
  313. package/test/unit/util/testUtil.ts +3 -3
  314. package/dist/src/transform/transformApiVersionParam.d.ts +0 -5
  315. package/dist/src/transform/transformApiVersionParam.d.ts.map +0 -1
  316. package/dist/src/transform/transformApiVersionParam.js +0 -76
  317. package/dist/src/transform/transformApiVersionParam.js.map +0 -1
  318. package/src/transform/transformApiVersionParam.ts +0 -104
@@ -0,0 +1,1110 @@
1
+ import { getPagedResult, isFixed } from "@azure-tools/typespec-azure-core";
2
+ import { getDoc, getFriendlyName, getMaxLength, getMaxValue, getMinLength, getMinValue, getPattern, getSummary, getVisibility, ignoreDiagnostics, isErrorModel, isNeverType, getEffectiveModelType, getDiscriminator, isKey, isStringType, getPropertyType, isNumericType, getFormat, getMinItems, getMaxItems, listServices, isNullType, SyntaxKind, getProjectedName } from "@typespec/compiler";
3
+ import { getAuthentication, getHeaderFieldName, getHttpOperation, getPathParamName, getQueryParamName, getServers, isStatusCode, isHeader } from "@typespec/http";
4
+ import { getAddedOnVersions } from "@typespec/versioning";
5
+ import { listClients, listOperationGroups, listOperationsInOperationGroup, isApiVersion, getDefaultApiVersion, getClientNamespaceString, createSdkContext } from "@azure-tools/typespec-client-generator-core";
6
+ import { getResourceOperation } from "@typespec/rest";
7
+ import { transformRLCOptions } from "../transform/transfromRLCOptions.js";
8
+ import { camelToSnakeCase, toCamelCase } from "../casingUtils.js";
9
+ let CASING = "snake";
10
+ function applyCasing(name, options = { casing: "snake" }) {
11
+ if (options.casing === "camel") {
12
+ return toCamelCase(name);
13
+ }
14
+ return camelToSnakeCase(name);
15
+ }
16
+ const typesMap = new Map();
17
+ const simpleTypesMap = new Map();
18
+ const endpointPathParameters = [];
19
+ let apiVersionParam = undefined;
20
+ function isSimpleType(program, type) {
21
+ // these decorators can only work for simple type(int/string/float, etc)
22
+ if (type && (type.kind === "Scalar" || type.kind === "ModelProperty")) {
23
+ const funcs = [
24
+ getMinValue,
25
+ getMaxValue,
26
+ getMinLength,
27
+ getMaxLength,
28
+ getPattern
29
+ ];
30
+ for (const func of funcs) {
31
+ if (func(program, type)) {
32
+ return true;
33
+ }
34
+ }
35
+ }
36
+ return false;
37
+ }
38
+ function getDocStr(program, target) {
39
+ var _a;
40
+ return (_a = getDoc(program, target)) !== null && _a !== void 0 ? _a : "";
41
+ }
42
+ function isLro(_program, operation) {
43
+ for (const decorator of operation.decorators) {
44
+ if (decorator.decorator.name === "$pollingOperation") {
45
+ return true;
46
+ }
47
+ }
48
+ return false;
49
+ }
50
+ function handleDiscriminator(program, type, model) {
51
+ const discriminator = getDiscriminator(program, type);
52
+ if (discriminator) {
53
+ let discriminatorProperty;
54
+ for (const childModel of type.derivedModels) {
55
+ const modelType = getType(program, childModel);
56
+ for (const property of modelType.properties) {
57
+ if (property.restApiName === discriminator.propertyName) {
58
+ modelType.discriminatorValue = property.type.value;
59
+ property.isDiscriminator = true;
60
+ model.discriminatedSubtypes[property.type.value] = modelType;
61
+ discriminatorProperty = property;
62
+ }
63
+ }
64
+ }
65
+ // it is not included in properties of cadl but needed by python codegen
66
+ if (discriminatorProperty) {
67
+ const discriminatorType = { ...discriminatorProperty.type };
68
+ discriminatorType.value = null;
69
+ const propertyCopy = {
70
+ ...discriminatorProperty,
71
+ isPolymorphic: true,
72
+ type: discriminatorType
73
+ };
74
+ propertyCopy.description = "";
75
+ model.properties.push(propertyCopy);
76
+ }
77
+ }
78
+ }
79
+ function getEffectiveSchemaType(program, type) {
80
+ function isSchemaProperty(property) {
81
+ const headerInfo = getHeaderFieldName(program, property);
82
+ const queryInfo = getQueryParamName(program, property);
83
+ const pathInfo = getPathParamName(program, property);
84
+ const statusCodeinfo = isStatusCode(program, property);
85
+ return !(headerInfo || queryInfo || pathInfo || statusCodeinfo);
86
+ }
87
+ const effective = getEffectiveModelType(program, type, isSchemaProperty);
88
+ if (effective.name) {
89
+ return effective;
90
+ }
91
+ return type;
92
+ }
93
+ function getType(program, type) {
94
+ // don't cache simple type(string, int, etc) since decorators may change the result
95
+ const enableCache = !isSimpleType(program, type);
96
+ const effectiveModel = type.kind === "Model" ? getEffectiveSchemaType(program, type) : type;
97
+ if (enableCache) {
98
+ const cached = typesMap.get(effectiveModel);
99
+ if (cached) {
100
+ return cached;
101
+ }
102
+ }
103
+ let newValue = emitType(program, type);
104
+ if (enableCache) {
105
+ typesMap.set(effectiveModel, newValue);
106
+ if (type.kind === "Model") {
107
+ // need to do properties after insertion to avoid infinite recursion
108
+ for (const property of type.properties.values()) {
109
+ if (isStatusCode(program, property) ||
110
+ isNeverType(property.type) ||
111
+ isHeader(program, property)) {
112
+ continue;
113
+ }
114
+ newValue.properties.push(emitProperty(program, property));
115
+ }
116
+ // need to do discriminator outside `emitModel` to avoid infinite recursion
117
+ handleDiscriminator(program, type, newValue);
118
+ }
119
+ }
120
+ else {
121
+ const key = JSON.stringify(newValue);
122
+ const value = simpleTypesMap.get(key);
123
+ if (value) {
124
+ newValue = value;
125
+ }
126
+ else {
127
+ simpleTypesMap.set(key, newValue);
128
+ }
129
+ }
130
+ return newValue;
131
+ }
132
+ // To pass the yaml dump
133
+ function getAddedOnVersion(p, t) {
134
+ var _a, _b;
135
+ return (_b = (_a = getAddedOnVersions(p, t)) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.value;
136
+ }
137
+ function emitParamBase(program, parameter) {
138
+ let optional;
139
+ let name;
140
+ let description = "";
141
+ let addedOn;
142
+ if (parameter.kind === "ModelProperty") {
143
+ optional = parameter.optional;
144
+ name = parameter.name;
145
+ description = getDocStr(program, parameter);
146
+ addedOn = getAddedOnVersion(program, parameter);
147
+ }
148
+ else {
149
+ optional = false;
150
+ name = "body";
151
+ }
152
+ return {
153
+ optional,
154
+ description,
155
+ addedOn,
156
+ clientName: applyCasing(name, { casing: CASING }),
157
+ inOverload: false
158
+ };
159
+ }
160
+ function getBodyType(program, route) {
161
+ var _a, _b, _c, _d;
162
+ let bodyModel = (_a = route.parameters.body) === null || _a === void 0 ? void 0 : _a.type;
163
+ if (bodyModel && bodyModel.kind === "Model" && route.operation) {
164
+ const resourceType = (_b = getResourceOperation(program, route.operation)) === null || _b === void 0 ? void 0 : _b.resourceType;
165
+ if (resourceType && route.responses && route.responses.length > 0) {
166
+ const resp = route.responses[0];
167
+ if (resp && resp.responses && resp.responses.length > 0) {
168
+ const responseBody = (_c = resp.responses[0]) === null || _c === void 0 ? void 0 : _c.body;
169
+ if (((_d = responseBody === null || responseBody === void 0 ? void 0 : responseBody.type) === null || _d === void 0 ? void 0 : _d.kind) === "Model") {
170
+ const bodyTypeInResponse = getEffectiveSchemaType(program, responseBody.type);
171
+ // response body type is reosurce type, and request body type (if templated) contains resource type
172
+ if (bodyTypeInResponse === resourceType &&
173
+ bodyModel.templateMapper &&
174
+ bodyModel.templateMapper.args &&
175
+ bodyModel.templateMapper.args.some((it) => {
176
+ return it.kind === "Model" || it.kind === "Union"
177
+ ? it === bodyTypeInResponse
178
+ : false;
179
+ })) {
180
+ bodyModel = resourceType;
181
+ }
182
+ }
183
+ }
184
+ }
185
+ if (resourceType && bodyModel.name === "") {
186
+ bodyModel = resourceType;
187
+ }
188
+ }
189
+ return bodyModel;
190
+ }
191
+ function emitBodyParameter(program, httpOperation) {
192
+ var _a, _b, _c, _d, _e;
193
+ const params = httpOperation.parameters;
194
+ const body = params.body;
195
+ const base = emitParamBase(program, (_a = body.parameter) !== null && _a !== void 0 ? _a : body.type);
196
+ let contentTypes = body.contentTypes;
197
+ if (contentTypes.length === 0) {
198
+ contentTypes = ["application/json"];
199
+ }
200
+ if (contentTypes.length !== 1) {
201
+ throw Error("Currently only one kind of content-type!");
202
+ }
203
+ const type = getType(program, getBodyType(program, httpOperation));
204
+ if (type.type === "model" && type.name === "") {
205
+ type.name = capitalize(httpOperation.operation.name) + "Request";
206
+ }
207
+ return {
208
+ contentTypes,
209
+ type,
210
+ restApiName: (_c = (_b = body.parameter) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : "body",
211
+ location: "body",
212
+ ...base,
213
+ defaultContentType: ((_e = (_d = body.parameter) === null || _d === void 0 ? void 0 : _d.default) !== null && _e !== void 0 ? _e : contentTypes.includes("application/json"))
214
+ ? "application/json"
215
+ : contentTypes[0]
216
+ };
217
+ }
218
+ function emitParameter(context, parameter, implementation) {
219
+ const base = emitParamBase(context.program, parameter.param);
220
+ let type = getType(context.program, parameter.param.type);
221
+ let clientDefaultValue = undefined;
222
+ if (parameter.name.toLowerCase() === "content-type" &&
223
+ type["type"] === "constant") {
224
+ /// We don't want constant types for content types, so we make sure if it's
225
+ /// a constant, we make it not constant
226
+ clientDefaultValue = type["value"];
227
+ type = type["valueType"];
228
+ }
229
+ const paramMap = {
230
+ restApiName: parameter.name,
231
+ location: parameter.type,
232
+ type: type,
233
+ implementation: implementation,
234
+ skipUrlEncoding: parameter.type === "endpointPath"
235
+ };
236
+ if (paramMap.type.type === "constant") {
237
+ clientDefaultValue = paramMap.type.value;
238
+ }
239
+ if (isApiVersion(context, parameter)) {
240
+ const defaultApiVersion = getDefaultApiVersion(context, getServiceNamespace(context.program));
241
+ paramMap.type = defaultApiVersion
242
+ ? getConstantType(defaultApiVersion.value)
243
+ : { type: "string" };
244
+ paramMap.implementation = "Client";
245
+ paramMap.in_docstring = false;
246
+ if (defaultApiVersion) {
247
+ clientDefaultValue = defaultApiVersion.value;
248
+ }
249
+ }
250
+ return { clientDefaultValue, ...base, ...paramMap };
251
+ }
252
+ function emitContentTypeParameter(bodyParameter, inOverload, inOverriden) {
253
+ return {
254
+ checkClientInput: false,
255
+ clientDefaultValue: bodyParameter.defaultContentType,
256
+ clientName: "content_type",
257
+ delimiter: null,
258
+ description: `Body parameter Content-Type. Known values are: ${bodyParameter.contentTypes}.`,
259
+ implementation: "Method",
260
+ inDocstring: true,
261
+ inOverload: inOverload,
262
+ inOverriden: inOverriden,
263
+ location: "header",
264
+ optional: true,
265
+ restApiName: "Content-Type",
266
+ type: { type: "string" }
267
+ };
268
+ }
269
+ function emitFlattenedParameter(bodyParameter, property) {
270
+ return {
271
+ checkClientInput: false,
272
+ clientDefaultValue: null,
273
+ clientName: property.clientName,
274
+ delimiter: null,
275
+ description: property.description,
276
+ implementation: "Method",
277
+ inDocstring: true,
278
+ inFlattenedBody: true,
279
+ inOverload: false,
280
+ inOverriden: false,
281
+ isApiVersion: bodyParameter["isApiVersion"],
282
+ location: "other",
283
+ optional: property["optional"],
284
+ restApiName: null,
285
+ skipUrlEncoding: false,
286
+ type: property["type"],
287
+ defaultToUnsetSentinel: true
288
+ };
289
+ }
290
+ function getConstantType(key) {
291
+ const cache = simpleTypesMap.get(key);
292
+ if (cache) {
293
+ return cache;
294
+ }
295
+ const type = {
296
+ apiVersions: [],
297
+ clientDefaultValue: null,
298
+ type: "constant",
299
+ value: key,
300
+ valueType: { type: "string" },
301
+ xmlMetadata: {}
302
+ };
303
+ simpleTypesMap.set(key, type);
304
+ return type;
305
+ }
306
+ function emitAcceptParameter(_program, inOverload, inOverriden) {
307
+ return {
308
+ checkClientInput: false,
309
+ clientDefaultValue: "application/json",
310
+ clientName: "accept",
311
+ delimiter: null,
312
+ description: "Accept header.",
313
+ explode: false,
314
+ groupedBy: null,
315
+ implementation: "Method",
316
+ inDocstring: true,
317
+ inOverload: inOverload,
318
+ inOverriden: inOverriden,
319
+ location: "header",
320
+ optional: false,
321
+ restApiName: "Accept",
322
+ skipUrlEncoding: false,
323
+ type: getConstantType("application/json")
324
+ };
325
+ }
326
+ function emitResponseHeaders(program, headers) {
327
+ const retval = [];
328
+ if (!headers) {
329
+ return retval;
330
+ }
331
+ for (const [key, value] of Object.entries(headers)) {
332
+ retval.push({
333
+ type: getType(program, value.type),
334
+ restApiName: key
335
+ });
336
+ }
337
+ return retval;
338
+ }
339
+ function isAzureCoreErrorType(t) {
340
+ var _a;
341
+ if ((t === null || t === void 0 ? void 0 : t.kind) !== "Model" ||
342
+ !["Error", "ErrorResponse", "InnerError"].includes(t.name))
343
+ return false;
344
+ const namespaces = ".Azure.Core.Foundations".split(".");
345
+ while (namespaces.length > 0 &&
346
+ ((t === null || t === void 0 ? void 0 : t.kind) === "Model" || (t === null || t === void 0 ? void 0 : t.kind) === "Namespace") &&
347
+ ((_a = t.namespace) === null || _a === void 0 ? void 0 : _a.name) === namespaces.pop()) {
348
+ t = t.namespace;
349
+ }
350
+ return namespaces.length == 0;
351
+ }
352
+ function emitResponse(program, response, innerResponse) {
353
+ var _a, _b;
354
+ let type = undefined;
355
+ if (((_a = innerResponse.body) === null || _a === void 0 ? void 0 : _a.type) &&
356
+ !isAzureCoreErrorType((_b = innerResponse.body) === null || _b === void 0 ? void 0 : _b.type)) {
357
+ // temporary logic. It can be removed after compiler optimize the response
358
+ const candidate = [
359
+ "ResourceOkResponse",
360
+ "ResourceCreatedResponse",
361
+ "AcceptedResponse"
362
+ ];
363
+ const originType = innerResponse.body.type;
364
+ if (innerResponse.body.type.kind === "Model" &&
365
+ candidate.find((e) => e === originType.name)) {
366
+ const modelType = getEffectiveSchemaType(program, originType);
367
+ type = getType(program, modelType);
368
+ }
369
+ else {
370
+ type = getType(program, innerResponse.body.type);
371
+ }
372
+ }
373
+ const statusCodes = [];
374
+ if (response.statusCode === "*") {
375
+ statusCodes.push("default");
376
+ }
377
+ else {
378
+ statusCodes.push(parseInt(response.statusCode));
379
+ }
380
+ return {
381
+ headers: emitResponseHeaders(program, innerResponse.headers),
382
+ statusCodes: statusCodes !== null && statusCodes !== void 0 ? statusCodes : [],
383
+ addedOn: getAddedOnVersion(program, response.type),
384
+ discriminator: "basic",
385
+ type: type
386
+ };
387
+ }
388
+ function emitOperation(context, operation, operationGroupName) {
389
+ const lro = isLro(context.program, operation);
390
+ const paging = getPagedResult(context.program, operation);
391
+ if (lro && paging) {
392
+ return emitLroPagingOperation(context, operation, operationGroupName);
393
+ }
394
+ else if (paging) {
395
+ return emitPagingOperation(context, operation, operationGroupName);
396
+ }
397
+ else if (lro) {
398
+ return emitLroOperation(context, operation, operationGroupName);
399
+ }
400
+ return emitBasicOperation(context, operation, operationGroupName);
401
+ }
402
+ function addLroInformation(emittedOperation) {
403
+ emittedOperation["discriminator"] = "lro";
404
+ }
405
+ function addPagingInformation(program, operation, emittedOperation) {
406
+ emittedOperation["discriminator"] = "paging";
407
+ const pagedResult = getPagedResult(program, operation);
408
+ if (pagedResult === undefined) {
409
+ throw Error("Trying to add paging information, but not paging metadata for this operation");
410
+ }
411
+ emittedOperation["itemName"] = pagedResult.itemsPath;
412
+ emittedOperation["continuationTokenName"] = pagedResult.nextLinkPath;
413
+ }
414
+ function emitLroPagingOperation(context, operation, operationGroupName) {
415
+ const emittedOperation = emitBasicOperation(context, operation, operationGroupName);
416
+ addLroInformation(emittedOperation);
417
+ addPagingInformation(context.program, operation, emittedOperation);
418
+ emittedOperation["discriminator"] = "lropaging";
419
+ return emittedOperation;
420
+ }
421
+ function emitLroOperation(context, operation, operationGroupName) {
422
+ const emittedOperation = emitBasicOperation(context, operation, operationGroupName);
423
+ addLroInformation(emittedOperation);
424
+ return emittedOperation;
425
+ }
426
+ function emitPagingOperation(context, operation, operationGroupName) {
427
+ const emittedOperation = emitBasicOperation(context, operation, operationGroupName);
428
+ addPagingInformation(context.program, operation, emittedOperation);
429
+ return emittedOperation;
430
+ }
431
+ function emitBasicOperation(context, operation, operationGroupName) {
432
+ var _a;
433
+ // Set up parameters for operation
434
+ const parameters = [];
435
+ if (endpointPathParameters) {
436
+ for (const param of endpointPathParameters) {
437
+ parameters.push(param);
438
+ }
439
+ }
440
+ const httpOperation = ignoreDiagnostics(getHttpOperation(context.program, operation));
441
+ for (const param of httpOperation.parameters.parameters) {
442
+ const emittedParam = emitParameter(context, param, "Method");
443
+ if (isApiVersion(context, param) && apiVersionParam === undefined) {
444
+ apiVersionParam = emittedParam;
445
+ }
446
+ parameters.push(emittedParam);
447
+ }
448
+ // Set up responses for operation
449
+ const responses = [];
450
+ const exceptions = [];
451
+ const isOverload = false;
452
+ const isOverriden = false;
453
+ for (const response of httpOperation.responses) {
454
+ for (const innerResponse of response.responses) {
455
+ const emittedResponse = emitResponse(context.program, response, innerResponse);
456
+ if (emittedResponse["type"] &&
457
+ parameters.filter((e) => e.restApiName.toLowerCase() === "accept")
458
+ .length === 0) {
459
+ parameters.push(emitAcceptParameter(context.program, isOverload, isOverriden));
460
+ }
461
+ if (isErrorModel(context.program, response.type)) {
462
+ // * is valid status code in cadl but invalid for autorest.python
463
+ if (response.statusCode === "*") {
464
+ exceptions.push(emittedResponse);
465
+ }
466
+ }
467
+ else {
468
+ responses.push(emittedResponse);
469
+ }
470
+ }
471
+ }
472
+ let bodyParameter;
473
+ if (httpOperation.parameters.body === undefined) {
474
+ bodyParameter = undefined;
475
+ }
476
+ else {
477
+ bodyParameter = emitBodyParameter(context.program, httpOperation);
478
+ if (parameters.filter((e) => e.restApiName.toLowerCase() === "content-type")
479
+ .length === 0) {
480
+ parameters.push(emitContentTypeParameter(bodyParameter, isOverload, isOverriden));
481
+ }
482
+ if (bodyParameter.type.type === "model" &&
483
+ bodyParameter.type.base === "json") {
484
+ bodyParameter["propertyToParameterName"] = {};
485
+ if (!isOverload) {
486
+ bodyParameter.defaultToUnsetSentinel = true;
487
+ }
488
+ for (const property of bodyParameter.type.properties) {
489
+ bodyParameter["propertyToParameterName"][property["restApiName"]] =
490
+ property["clientName"];
491
+ parameters.push(emitFlattenedParameter(bodyParameter, property));
492
+ }
493
+ }
494
+ }
495
+ const name = applyCasing(operation.name, { casing: CASING });
496
+ return {
497
+ name: name,
498
+ description: getDocStr(context.program, operation),
499
+ summary: (_a = getSummary(context.program, operation)) !== null && _a !== void 0 ? _a : "",
500
+ url: httpOperation.path,
501
+ method: httpOperation.verb.toUpperCase(),
502
+ parameters: parameters,
503
+ bodyParameter: bodyParameter,
504
+ responses: responses !== null && responses !== void 0 ? responses : [],
505
+ exceptions: exceptions !== null && exceptions !== void 0 ? exceptions : [],
506
+ groupName: operationGroupName,
507
+ addedOn: getAddedOnVersion(context.program, operation),
508
+ discriminator: "basic",
509
+ isOverload: false,
510
+ overloads: [],
511
+ apiVersions: [getAddedOnVersion(context.program, operation)]
512
+ };
513
+ }
514
+ function isReadOnly(program, type) {
515
+ // https://microsoft.github.io/cadl/standard-library/rest/operations#automatic-visibility
516
+ // Only "read" should be readOnly
517
+ const visibility = getVisibility(program, type);
518
+ if (visibility) {
519
+ return visibility.includes("read");
520
+ }
521
+ else {
522
+ return false;
523
+ }
524
+ }
525
+ function emitProperty(program, property) {
526
+ var _a;
527
+ let clientDefaultValue = undefined;
528
+ const propertyDefaultKind = (_a = property.default) === null || _a === void 0 ? void 0 : _a.kind;
529
+ if (property.default &&
530
+ (propertyDefaultKind === "Number" ||
531
+ propertyDefaultKind === "String" ||
532
+ propertyDefaultKind === "Boolean")) {
533
+ clientDefaultValue = property.default.value;
534
+ }
535
+ const restApiName = getProjectedName(program, property, "json");
536
+ return {
537
+ clientName: applyCasing(property.name, { casing: CASING }),
538
+ restApiName: restApiName !== null && restApiName !== void 0 ? restApiName : property.name,
539
+ type: getType(program, property.type),
540
+ optional: property.optional,
541
+ description: getDocStr(program, property),
542
+ addedOn: getAddedOnVersion(program, property),
543
+ readonly: isReadOnly(program, property) || isKey(program, property),
544
+ clientDefaultValue: clientDefaultValue
545
+ };
546
+ }
547
+ function getName(program, type) {
548
+ const friendlyName = getFriendlyName(program, type);
549
+ if (friendlyName) {
550
+ return friendlyName;
551
+ }
552
+ else {
553
+ if (type.templateMapper &&
554
+ type.templateMapper.args &&
555
+ type.templateMapper.args.length > 0) {
556
+ return (type.name +
557
+ type.templateMapper.args
558
+ .map((it) => (it.kind === "Model" ? it.name : ""))
559
+ .join(""));
560
+ }
561
+ else {
562
+ return type.name;
563
+ }
564
+ }
565
+ }
566
+ function emitModel(program, type) {
567
+ // Now we know it's a defined model
568
+ const properties = [];
569
+ let baseModel = undefined;
570
+ if (type.baseModel) {
571
+ baseModel = getType(program, type.baseModel);
572
+ }
573
+ const effectiveName = getEffectiveSchemaType(program, type).name;
574
+ const modelName = effectiveName ? effectiveName : getName(program, type);
575
+ return {
576
+ type: "model",
577
+ name: modelName,
578
+ description: getDocStr(program, type),
579
+ parents: baseModel ? [baseModel] : [],
580
+ discriminatedSubtypes: {},
581
+ properties: properties,
582
+ addedOn: getAddedOnVersion(program, type),
583
+ snakeCaseName: modelName
584
+ ? applyCasing(modelName, { casing: CASING })
585
+ : modelName,
586
+ base: modelName === "" ? "json" : "dpg"
587
+ };
588
+ }
589
+ function intOrFloat(value) {
590
+ return value.toString().indexOf(".") === -1 ? "integer" : "float";
591
+ }
592
+ function enumName(name) {
593
+ if (name.toUpperCase() === name) {
594
+ return name;
595
+ }
596
+ return applyCasing(name, { casing: CASING }).toUpperCase();
597
+ }
598
+ function emitEnum(program, type) {
599
+ var _a;
600
+ const enumValues = [];
601
+ for (const m of type.members.values()) {
602
+ enumValues.push({
603
+ name: enumName(m.name),
604
+ value: (_a = m.value) !== null && _a !== void 0 ? _a : m.name,
605
+ description: getDocStr(program, m)
606
+ });
607
+ }
608
+ return {
609
+ type: "enum",
610
+ name: type.name,
611
+ description: getDocStr(program, type),
612
+ valueType: { type: enumMemberType(type.members.values().next().value) },
613
+ values: enumValues,
614
+ isFixed: isFixed(program, type)
615
+ };
616
+ function enumMemberType(member) {
617
+ if (typeof member.value === "number") {
618
+ return intOrFloat(member.value);
619
+ }
620
+ return "string";
621
+ }
622
+ }
623
+ function constantType(value, valueType) {
624
+ return { type: "constant", value: value, valueType: { type: valueType } };
625
+ }
626
+ function emitCredential(auth) {
627
+ let credential_type = {};
628
+ if (auth.type === "oauth2") {
629
+ credential_type = {
630
+ type: "OAuth2",
631
+ policy: {
632
+ type: "BearerTokenCredentialPolicy",
633
+ credentialScopes: []
634
+ }
635
+ };
636
+ for (const flow of auth.flows) {
637
+ for (const scope of flow.scopes) {
638
+ credential_type.policy.credentialScopes.push(scope.value);
639
+ }
640
+ credential_type.policy.credentialScopes.push();
641
+ }
642
+ }
643
+ else if (auth.type === "apiKey") {
644
+ credential_type = {
645
+ type: "Key",
646
+ policy: {
647
+ type: "AzureKeyCredentialPolicy",
648
+ key: auth.name
649
+ }
650
+ };
651
+ }
652
+ return credential_type;
653
+ }
654
+ function emitCredentialUnion(cred_types) {
655
+ const result = {};
656
+ // Export as CombinedType, which is already a Union Type in autorest codegen
657
+ result.type = "combined";
658
+ result.types = [];
659
+ for (const cred_type of cred_types.types) {
660
+ result.types.push(emitCredential(cred_type.scheme));
661
+ }
662
+ return result;
663
+ }
664
+ function emitStdScalar(scalar) {
665
+ switch (scalar.name) {
666
+ case "bytes":
667
+ return { type: "byte-array", format: "byte" };
668
+ case "int8":
669
+ case "int16":
670
+ case "int32":
671
+ case "int64":
672
+ case "safeint":
673
+ case "uint8":
674
+ case "uint16":
675
+ case "uint32":
676
+ case "uint64":
677
+ case "integer":
678
+ return { type: "integer" };
679
+ case "float32":
680
+ case "float64":
681
+ case "float":
682
+ return { type: "float" };
683
+ case "url":
684
+ case "string":
685
+ return { type: "string" };
686
+ case "boolean":
687
+ return { type: "boolean" };
688
+ case "plainDate":
689
+ return { type: "date" };
690
+ case "utcDateTime":
691
+ return { type: "datetime", format: "date-time" };
692
+ case "plainTime":
693
+ return { type: "time" };
694
+ case "duration":
695
+ return { type: "duration" };
696
+ case "numeric":
697
+ return {}; // Waiting on design for more precise type https://github.com/microsoft/cadl/issues/1260
698
+ default:
699
+ return {};
700
+ }
701
+ }
702
+ function applyIntrinsicDecorators(program, type, result) {
703
+ const newResult = { ...result };
704
+ const docStr = getDoc(program, type);
705
+ const isString = isStringType(program, getPropertyType(type));
706
+ const isNumeric = isNumericType(program, getPropertyType(type));
707
+ if (!result.description && docStr) {
708
+ newResult.description = docStr;
709
+ }
710
+ const formatStr = getFormat(program, type);
711
+ if (isString && !result.format && formatStr) {
712
+ newResult.format = formatStr;
713
+ }
714
+ const pattern = getPattern(program, type);
715
+ if (isString && !result.pattern && pattern) {
716
+ newResult.pattern = pattern;
717
+ }
718
+ const minLength = getMinLength(program, type);
719
+ if (isString && !result.minLength && minLength !== undefined) {
720
+ newResult.minLength = minLength;
721
+ }
722
+ const maxLength = getMaxLength(program, type);
723
+ if (isString && !result.maxLength && maxLength !== undefined) {
724
+ newResult.maxLength = maxLength;
725
+ }
726
+ const minValue = getMinValue(program, type);
727
+ if (isNumeric && !result.minimum && minValue !== undefined) {
728
+ newResult.minimum = minValue;
729
+ }
730
+ const maxValue = getMaxValue(program, type);
731
+ if (isNumeric && !result.maximum && maxValue !== undefined) {
732
+ newResult.maximum = maxValue;
733
+ }
734
+ const minItems = getMinItems(program, type);
735
+ if (!result.minItems && minItems !== undefined) {
736
+ newResult.minItems = minItems;
737
+ }
738
+ const maxItems = getMaxItems(program, type);
739
+ if (!result.maxItems && maxItems !== undefined) {
740
+ newResult.maxItems = maxItems;
741
+ }
742
+ return newResult;
743
+ }
744
+ function emitScalar(program, scalar) {
745
+ let result = {};
746
+ if (program.checker.isStdType(scalar)) {
747
+ result = emitStdScalar(scalar);
748
+ }
749
+ else if (scalar.baseScalar) {
750
+ result = emitScalar(program, scalar.baseScalar);
751
+ }
752
+ return applyIntrinsicDecorators(program, scalar, result);
753
+ }
754
+ function emitListOrDict(program, type) {
755
+ if (type.indexer !== undefined) {
756
+ if (!isNeverType(type.indexer.key)) {
757
+ const name = type.indexer.key.name;
758
+ if (name === "string") {
759
+ return {
760
+ type: "dict",
761
+ elementType: getType(program, type.indexer.value)
762
+ };
763
+ }
764
+ else if (name === "integer") {
765
+ return {
766
+ type: "list",
767
+ elementType: getType(program, type.indexer.value)
768
+ };
769
+ }
770
+ }
771
+ }
772
+ return undefined;
773
+ }
774
+ function mapCadlType(program, type) {
775
+ switch (type.kind) {
776
+ case "Number":
777
+ return constantType(type.value, intOrFloat(type.value));
778
+ case "String":
779
+ return constantType(type.value, "string");
780
+ case "Boolean":
781
+ return constantType(type.value, "boolean");
782
+ case "Model":
783
+ return emitListOrDict(program, type);
784
+ }
785
+ }
786
+ function capitalize(name) {
787
+ return name[0].toUpperCase() + name.slice(1);
788
+ }
789
+ function emitUnion(program, type) {
790
+ const nonNullOptions = [...type.variants.values()]
791
+ .map((x) => x.type)
792
+ .filter((t) => !isNullType(t));
793
+ const notLiteral = (t) => ["Boolean", "Number", "String"].indexOf(t.kind) < 0;
794
+ if (nonNullOptions.length > 1) {
795
+ if (nonNullOptions.every(notLiteral)) {
796
+ // Generate as CombinedType if non of the options is Literal.
797
+ const unionName = `MyCombinedType`;
798
+ return {
799
+ name: unionName,
800
+ snakeCaseName: applyCasing(unionName, { casing: CASING }),
801
+ description: `Type of ${unionName}`,
802
+ isPublic: false,
803
+ type: "combined",
804
+ types: nonNullOptions.map((x) => emitType(program, x)),
805
+ xmlMetadata: {}
806
+ };
807
+ }
808
+ else if (nonNullOptions.some(notLiteral)) {
809
+ // Can't generate if this union is a mixed up of literals and sub-types
810
+ throw Error(`Can't do union for ${JSON.stringify(nonNullOptions)}`);
811
+ }
812
+ }
813
+ // Geneate Union of Literals as Python Enum
814
+ const values = [];
815
+ for (const option of nonNullOptions) {
816
+ const value = emitType(program, option)["value"];
817
+ values.push({
818
+ description: "",
819
+ name: applyCasing(value, { casing: CASING }).toUpperCase(),
820
+ value: value
821
+ });
822
+ }
823
+ let enumName = "MyEnum";
824
+ if (type.node &&
825
+ type.node.parent &&
826
+ [SyntaxKind.ModelStatement, SyntaxKind.ModelProperty].includes(type.node.parent.kind)) {
827
+ if (type.node.parent.kind === SyntaxKind.ModelStatement) {
828
+ enumName = capitalize(type.node.parent.id.sv);
829
+ }
830
+ else if (type.node.parent.kind === SyntaxKind.ModelProperty) {
831
+ const parent = type.node.parent;
832
+ if (parent.id.sv) {
833
+ enumName = capitalize(parent.id.sv) + "Type";
834
+ }
835
+ }
836
+ }
837
+ return {
838
+ name: enumName,
839
+ snakeCaseName: applyCasing(enumName, { casing: CASING }),
840
+ description: `Type of ${enumName}`,
841
+ isPublic: false,
842
+ type: "enum",
843
+ valueType: emitType(program, nonNullOptions[0])["valueType"],
844
+ values: values,
845
+ xmlMetadata: {}
846
+ };
847
+ }
848
+ function emitType(program, type) {
849
+ if (type.kind === "Credential") {
850
+ return emitCredential(type.scheme);
851
+ }
852
+ if (type.kind === "CredentialTypeUnion") {
853
+ return emitCredentialUnion(type);
854
+ }
855
+ const builtinType = mapCadlType(program, type);
856
+ if (builtinType !== undefined) {
857
+ // add in description elements for types derived from primitive types (SecureString, etc.)
858
+ const doc = getDoc(program, type);
859
+ if (doc) {
860
+ builtinType.description = doc;
861
+ }
862
+ return builtinType;
863
+ }
864
+ switch (type.kind) {
865
+ case "Intrinsic":
866
+ return { type: "any" };
867
+ case "Model":
868
+ return emitModel(program, type);
869
+ case "Scalar":
870
+ return emitScalar(program, type);
871
+ case "Union":
872
+ return emitUnion(program, type);
873
+ case "UnionVariant":
874
+ return {};
875
+ case "Enum":
876
+ return emitEnum(program, type);
877
+ default:
878
+ throw Error(`Not supported ${type.kind}`);
879
+ }
880
+ }
881
+ function emitOperationGroups(context, client) {
882
+ const operationGroups = [];
883
+ for (const operationGroup of listOperationGroups(context, client)) {
884
+ const operations = [];
885
+ const name = operationGroup.type.name;
886
+ for (const operation of listOperationsInOperationGroup(context, operationGroup)) {
887
+ operations.push(emitOperation(context, operation, name));
888
+ }
889
+ operationGroups.push({
890
+ className: name,
891
+ propertyName: name,
892
+ operations: operations
893
+ });
894
+ }
895
+ const clientOperations = [];
896
+ for (const operation of listOperationsInOperationGroup(context, client)) {
897
+ clientOperations.push(emitOperation(context, operation, ""));
898
+ }
899
+ if (clientOperations.length > 0) {
900
+ operationGroups.push({
901
+ className: "",
902
+ propertyName: "",
903
+ operations: clientOperations
904
+ });
905
+ }
906
+ return operationGroups;
907
+ }
908
+ function getServerHelper(program, namespace) {
909
+ const servers = getServers(program, namespace);
910
+ if (servers === undefined) {
911
+ return undefined;
912
+ }
913
+ return servers[0];
914
+ }
915
+ function emitServerParams(context, namespace) {
916
+ const server = getServerHelper(context.program, namespace);
917
+ if (server === undefined) {
918
+ return [
919
+ {
920
+ optional: false,
921
+ description: "Service host",
922
+ clientName: "endpoint",
923
+ clientDefaultValue: null,
924
+ restApiName: "$host",
925
+ location: "path",
926
+ type: { type: "string" },
927
+ implementation: "Client",
928
+ inOverload: false
929
+ }
930
+ ];
931
+ }
932
+ if (server.parameters) {
933
+ const params = [];
934
+ for (const param of server.parameters.values()) {
935
+ const serverParameter = {
936
+ type: "endpointPath",
937
+ name: param.name,
938
+ param: param
939
+ };
940
+ const emittedParameter = emitParameter(context, serverParameter, "Client");
941
+ endpointPathParameters.push(emittedParameter);
942
+ if (isApiVersion(context, serverParameter) &&
943
+ apiVersionParam == undefined) {
944
+ apiVersionParam = emittedParameter;
945
+ continue;
946
+ }
947
+ params.push(emittedParameter);
948
+ }
949
+ return params;
950
+ }
951
+ else {
952
+ return [
953
+ {
954
+ optional: false,
955
+ description: "Service host",
956
+ clientName: "endpoint",
957
+ clientDefaultValue: server.url,
958
+ restApiName: "$host",
959
+ location: "path",
960
+ type: { type: "string" },
961
+ implementation: "Client",
962
+ inOverload: false
963
+ }
964
+ ];
965
+ }
966
+ }
967
+ function emitCredentialParam(program, namespace) {
968
+ const auth = getAuthentication(program, namespace);
969
+ if (auth) {
970
+ const credential_types = [];
971
+ for (const option of auth.options) {
972
+ for (const scheme of option.schemes) {
973
+ const type = {
974
+ kind: "Credential",
975
+ scheme: scheme
976
+ };
977
+ credential_types.push(type);
978
+ }
979
+ }
980
+ if (credential_types.length > 0) {
981
+ let type;
982
+ if (credential_types.length === 1 && credential_types[0]) {
983
+ type = credential_types[0];
984
+ }
985
+ else {
986
+ type = {
987
+ kind: "CredentialTypeUnion",
988
+ types: credential_types
989
+ };
990
+ }
991
+ return {
992
+ type: getType(program, type),
993
+ optional: false,
994
+ description: "Credential needed for the client to connect to Azure.",
995
+ clientName: "credential",
996
+ location: "other",
997
+ restApiName: "credential",
998
+ implementation: "Client",
999
+ skipUrlEncoding: true,
1000
+ inOverload: false
1001
+ };
1002
+ }
1003
+ }
1004
+ return undefined;
1005
+ }
1006
+ function emitGlobalParameters(context, namespace) {
1007
+ const clientParameters = emitServerParams(context, namespace);
1008
+ const credentialParam = emitCredentialParam(context.program, namespace);
1009
+ if (credentialParam) {
1010
+ clientParameters.push(credentialParam);
1011
+ }
1012
+ return clientParameters;
1013
+ }
1014
+ function getApiVersionParameter(context) {
1015
+ const version = getDefaultApiVersion(context, getServiceNamespace(context.program));
1016
+ if (apiVersionParam) {
1017
+ return { ...apiVersionParam, isApiVersion: true };
1018
+ }
1019
+ else if (version !== undefined) {
1020
+ return {
1021
+ clientName: "api_version",
1022
+ clientDefaultValue: version.value,
1023
+ description: "Api Version",
1024
+ implementation: "Client",
1025
+ location: "query",
1026
+ restApiName: "api-version",
1027
+ skipUrlEncoding: false,
1028
+ optional: false,
1029
+ inDocstring: true,
1030
+ inOverload: false,
1031
+ inOverriden: false,
1032
+ type: getConstantType(version.value),
1033
+ isApiVersion: true
1034
+ };
1035
+ }
1036
+ }
1037
+ function emitClients(context, namespace) {
1038
+ var _a;
1039
+ const program = context.program;
1040
+ const clients = listClients(context);
1041
+ const retval = [];
1042
+ for (const client of clients) {
1043
+ const clientName = client.name.replace("Client", "");
1044
+ if (getNamespace(context, client.name) !== namespace) {
1045
+ continue;
1046
+ }
1047
+ const server = getServerHelper(program, client.service);
1048
+ const emittedClient = {
1049
+ name: (_a = clientName.split(".").at(-1)) !== null && _a !== void 0 ? _a : "",
1050
+ description: getDocStr(program, client.type),
1051
+ parameters: emitGlobalParameters(context, client.service),
1052
+ operationGroups: emitOperationGroups(context, client),
1053
+ url: server ? server.url : "",
1054
+ apiVersions: []
1055
+ };
1056
+ const emittedApiVersionParam = getApiVersionParameter(context);
1057
+ if (emittedApiVersionParam) {
1058
+ emittedClient.parameters.push(emittedApiVersionParam);
1059
+ }
1060
+ retval.push(emittedClient);
1061
+ }
1062
+ return retval;
1063
+ }
1064
+ function getServiceNamespace(program) {
1065
+ return listServices(program)[0].type;
1066
+ }
1067
+ function getNamespace(context, clientName) {
1068
+ // We get client namespaces from the client name. If there's a dot, we add that to the namespace
1069
+ const submodule = clientName.split(".").slice(0, -1).join(".").toLowerCase();
1070
+ if (!submodule) {
1071
+ return getClientNamespaceString(context).toLowerCase();
1072
+ }
1073
+ return submodule;
1074
+ }
1075
+ function getNamespaces(context) {
1076
+ const namespaces = new Set();
1077
+ for (const client of listClients(context)) {
1078
+ namespaces.add(getNamespace(context, client.name));
1079
+ }
1080
+ return namespaces;
1081
+ }
1082
+ export function emitCodeModel(context, options = { casing: "snake" }) {
1083
+ var _a, _b;
1084
+ CASING = (_a = options.casing) !== null && _a !== void 0 ? _a : CASING;
1085
+ const dpgContext = createSdkContext(context);
1086
+ const clientNamespaceString = (_b = getClientNamespaceString(dpgContext)) === null || _b === void 0 ? void 0 : _b.toLowerCase();
1087
+ // Get types
1088
+ const codeModel = {
1089
+ options: transformRLCOptions(context.program, context.options, context.emitterOutputDir, dpgContext),
1090
+ namespace: clientNamespaceString,
1091
+ subnamespaceToClients: {},
1092
+ clients: [],
1093
+ types: []
1094
+ };
1095
+ for (const namespace of getNamespaces(dpgContext)) {
1096
+ if (namespace === clientNamespaceString) {
1097
+ codeModel.clients = emitClients(dpgContext, namespace);
1098
+ }
1099
+ else {
1100
+ codeModel["subnamespaceToClients"][namespace] = emitClients(dpgContext, namespace);
1101
+ }
1102
+ }
1103
+ codeModel.types = [
1104
+ ...[...typesMap.values()].filter((t) => t.name !== "object"),
1105
+ { type: "string" },
1106
+ ...simpleTypesMap.values()
1107
+ ];
1108
+ return codeModel;
1109
+ }
1110
+ //# sourceMappingURL=buildCodeModel.js.map