@azure-tools/typespec-ts 0.11.0-alpha.20230413.3

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