@azure-tools/typespec-ts 0.11.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 (353) 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 +303 -0
  5. package/.rush/temp/shrinkwrap-deps.json +469 -0
  6. package/CHANGELOG.md +65 -0
  7. package/CONTRIBUTING.md +134 -0
  8. package/README.md +150 -0
  9. package/dist/src/emitUtil.d.ts +6 -0
  10. package/dist/src/emitUtil.d.ts.map +1 -0
  11. package/dist/src/emitUtil.js +45 -0
  12. package/dist/src/emitUtil.js.map +1 -0
  13. package/dist/src/index.d.ts +3 -0
  14. package/dist/src/index.d.ts.map +1 -0
  15. package/dist/src/index.js +59 -0
  16. package/dist/src/index.js.map +1 -0
  17. package/dist/src/lib.d.ts +159 -0
  18. package/dist/src/lib.d.ts.map +1 -0
  19. package/dist/src/lib.js +189 -0
  20. package/dist/src/lib.js.map +1 -0
  21. package/dist/src/modelUtils.d.ts +12 -0
  22. package/dist/src/modelUtils.d.ts.map +1 -0
  23. package/dist/src/modelUtils.js +812 -0
  24. package/dist/src/modelUtils.js.map +1 -0
  25. package/dist/src/operationUtil.d.ts +16 -0
  26. package/dist/src/operationUtil.d.ts.map +1 -0
  27. package/dist/src/operationUtil.js +142 -0
  28. package/dist/src/operationUtil.js.map +1 -0
  29. package/dist/src/transform/transform.d.ts +8 -0
  30. package/dist/src/transform/transform.d.ts.map +1 -0
  31. package/dist/src/transform/transform.js +131 -0
  32. package/dist/src/transform/transform.js.map +1 -0
  33. package/dist/src/transform/transformAnnotationDetails.d.ts +6 -0
  34. package/dist/src/transform/transformAnnotationDetails.d.ts.map +1 -0
  35. package/dist/src/transform/transformAnnotationDetails.js +188 -0
  36. package/dist/src/transform/transformAnnotationDetails.js.map +1 -0
  37. package/dist/src/transform/transformApiVersionParam.d.ts +5 -0
  38. package/dist/src/transform/transformApiVersionParam.d.ts.map +1 -0
  39. package/dist/src/transform/transformApiVersionParam.js +76 -0
  40. package/dist/src/transform/transformApiVersionParam.js.map +1 -0
  41. package/dist/src/transform/transformParameters.d.ts +14 -0
  42. package/dist/src/transform/transformParameters.d.ts.map +1 -0
  43. package/dist/src/transform/transformParameters.js +315 -0
  44. package/dist/src/transform/transformParameters.js.map +1 -0
  45. package/dist/src/transform/transformPaths.d.ts +10 -0
  46. package/dist/src/transform/transformPaths.d.ts.map +1 -0
  47. package/dist/src/transform/transformPaths.js +124 -0
  48. package/dist/src/transform/transformPaths.js.map +1 -0
  49. package/dist/src/transform/transformResponses.d.ts +5 -0
  50. package/dist/src/transform/transformResponses.d.ts.map +1 -0
  51. package/dist/src/transform/transformResponses.js +136 -0
  52. package/dist/src/transform/transformResponses.js.map +1 -0
  53. package/dist/src/transform/transformSchemas.d.ts +4 -0
  54. package/dist/src/transform/transformSchemas.d.ts.map +1 -0
  55. package/dist/src/transform/transformSchemas.js +175 -0
  56. package/dist/src/transform/transformSchemas.js.map +1 -0
  57. package/dist/src/transform/transfromRLCOptions.d.ts +10 -0
  58. package/dist/src/transform/transfromRLCOptions.d.ts.map +1 -0
  59. package/dist/src/transform/transfromRLCOptions.js +156 -0
  60. package/dist/src/transform/transfromRLCOptions.js.map +1 -0
  61. package/dist/tsconfig.tsbuildinfo +1 -0
  62. package/package.json +73 -0
  63. package/src/emitUtil.ts +63 -0
  64. package/src/index.ts +106 -0
  65. package/src/lib.ts +207 -0
  66. package/src/modelUtils.ts +961 -0
  67. package/src/operationUtil.ts +203 -0
  68. package/src/transform/transform.ts +224 -0
  69. package/src/transform/transformAnnotationDetails.ts +231 -0
  70. package/src/transform/transformApiVersionParam.ts +104 -0
  71. package/src/transform/transformParameters.ts +480 -0
  72. package/src/transform/transformPaths.ts +187 -0
  73. package/src/transform/transformResponses.ts +190 -0
  74. package/src/transform/transformSchemas.ts +209 -0
  75. package/src/transform/transfromRLCOptions.ts +202 -0
  76. package/test/commands/cadl-ranch-list.ts +83 -0
  77. package/test/commands/check-clean-tree.ts +55 -0
  78. package/test/commands/childProcessOnExit.ts +16 -0
  79. package/test/commands/gen-cadl-ranch.ts +21 -0
  80. package/test/commands/run.ts +41 -0
  81. package/test/integration/arrayItemTypes.spec.ts +93 -0
  82. package/test/integration/authApiKey.spec.ts +38 -0
  83. package/test/integration/authOauth2.spec.ts +65 -0
  84. package/test/integration/authUnion.spec.ts +72 -0
  85. package/test/integration/dictionary.spec.ts +102 -0
  86. package/test/integration/extensibleEnums.spec.ts +61 -0
  87. package/test/integration/fixedEnums.spec.ts +52 -0
  88. package/test/integration/generated/arrays/itemTypes/src/arrayItemTypesClient.ts +31 -0
  89. package/test/integration/generated/arrays/itemTypes/src/clientDefinitions.ts +150 -0
  90. package/test/integration/generated/arrays/itemTypes/src/index.ts +13 -0
  91. package/test/integration/generated/arrays/itemTypes/src/models.ts +9 -0
  92. package/test/integration/generated/arrays/itemTypes/src/outputModels.ts +9 -0
  93. package/test/integration/generated/arrays/itemTypes/src/parameters.ts +78 -0
  94. package/test/integration/generated/arrays/itemTypes/src/responses.ts +104 -0
  95. package/test/integration/generated/arrays/itemTypes/tspconfig.yaml +12 -0
  96. package/test/integration/generated/authentication/apiKey/.eslintrc.json +11 -0
  97. package/test/integration/generated/authentication/apiKey/README.md +56 -0
  98. package/test/integration/generated/authentication/apiKey/api-extractor.json +18 -0
  99. package/test/integration/generated/authentication/apiKey/karma.conf.js +133 -0
  100. package/test/integration/generated/authentication/apiKey/package.json +103 -0
  101. package/test/integration/generated/authentication/apiKey/rollup.config.js +118 -0
  102. package/test/integration/generated/authentication/apiKey/src/authApiKeyClient.ts +41 -0
  103. package/test/integration/generated/authentication/apiKey/src/clientDefinitions.ts +33 -0
  104. package/test/integration/generated/authentication/apiKey/src/index.ts +12 -0
  105. package/test/integration/generated/authentication/apiKey/src/outputModels.ts +6 -0
  106. package/test/integration/generated/authentication/apiKey/src/parameters.ts +7 -0
  107. package/test/integration/generated/authentication/apiKey/src/responses.ts +21 -0
  108. package/test/integration/generated/authentication/apiKey/test/public/sampleTest.spec.ts +23 -0
  109. package/test/integration/generated/authentication/apiKey/test/public/utils/env.browser.ts +2 -0
  110. package/test/integration/generated/authentication/apiKey/test/public/utils/env.ts +6 -0
  111. package/test/integration/generated/authentication/apiKey/test/public/utils/recordedClient.ts +29 -0
  112. package/test/integration/generated/authentication/apiKey/tsconfig.json +25 -0
  113. package/test/integration/generated/authentication/apiKey/tspconfig.yaml +10 -0
  114. package/test/integration/generated/authentication/oauth2/karma.conf.js +133 -0
  115. package/test/integration/generated/authentication/oauth2/src/authOauth2Client.ts +41 -0
  116. package/test/integration/generated/authentication/oauth2/src/clientDefinitions.ts +33 -0
  117. package/test/integration/generated/authentication/oauth2/src/index.ts +12 -0
  118. package/test/integration/generated/authentication/oauth2/src/outputModels.ts +6 -0
  119. package/test/integration/generated/authentication/oauth2/src/parameters.ts +7 -0
  120. package/test/integration/generated/authentication/oauth2/src/responses.ts +21 -0
  121. package/test/integration/generated/authentication/oauth2/test/public/sampleTest.spec.ts +23 -0
  122. package/test/integration/generated/authentication/oauth2/test/public/utils/env.browser.ts +2 -0
  123. package/test/integration/generated/authentication/oauth2/test/public/utils/env.ts +6 -0
  124. package/test/integration/generated/authentication/oauth2/test/public/utils/recordedClient.ts +29 -0
  125. package/test/integration/generated/authentication/oauth2/tspconfig.yaml +12 -0
  126. package/test/integration/generated/authentication/union/karma.conf.js +133 -0
  127. package/test/integration/generated/authentication/union/src/authUnionClient.ts +42 -0
  128. package/test/integration/generated/authentication/union/src/clientDefinitions.ts +27 -0
  129. package/test/integration/generated/authentication/union/src/index.ts +11 -0
  130. package/test/integration/generated/authentication/union/src/parameters.ts +7 -0
  131. package/test/integration/generated/authentication/union/src/responses.ts +14 -0
  132. package/test/integration/generated/authentication/union/test/public/sampleTest.spec.ts +23 -0
  133. package/test/integration/generated/authentication/union/test/public/utils/env.browser.ts +2 -0
  134. package/test/integration/generated/authentication/union/test/public/utils/env.ts +6 -0
  135. package/test/integration/generated/authentication/union/test/public/utils/recordedClient.ts +29 -0
  136. package/test/integration/generated/authentication/union/tspconfig.yaml +12 -0
  137. package/test/integration/generated/dictionary/.eslintrc.json +11 -0
  138. package/test/integration/generated/dictionary/README.md +56 -0
  139. package/test/integration/generated/dictionary/api-extractor.json +18 -0
  140. package/test/integration/generated/dictionary/package.json +80 -0
  141. package/test/integration/generated/dictionary/rollup.config.js +118 -0
  142. package/test/integration/generated/dictionary/src/clientDefinitions.ts +165 -0
  143. package/test/integration/generated/dictionary/src/dictClient.ts +29 -0
  144. package/test/integration/generated/dictionary/src/index.ts +13 -0
  145. package/test/integration/generated/dictionary/src/models.ts +9 -0
  146. package/test/integration/generated/dictionary/src/outputModels.ts +9 -0
  147. package/test/integration/generated/dictionary/src/parameters.ts +86 -0
  148. package/test/integration/generated/dictionary/src/responses.ts +115 -0
  149. package/test/integration/generated/dictionary/tsconfig.json +25 -0
  150. package/test/integration/generated/dictionary/tspconfig.yaml +12 -0
  151. package/test/integration/generated/enums/extensible/.eslintrc.json +11 -0
  152. package/test/integration/generated/enums/extensible/README.md +56 -0
  153. package/test/integration/generated/enums/extensible/api-extractor.json +18 -0
  154. package/test/integration/generated/enums/extensible/package.json +80 -0
  155. package/test/integration/generated/enums/extensible/rollup.config.js +118 -0
  156. package/test/integration/generated/enums/extensible/src/clientDefinitions.ts +45 -0
  157. package/test/integration/generated/enums/extensible/src/enumsExtensible.ts +31 -0
  158. package/test/integration/generated/enums/extensible/src/index.ts +11 -0
  159. package/test/integration/generated/enums/extensible/src/parameters.ts +23 -0
  160. package/test/integration/generated/enums/extensible/src/responses.ts +26 -0
  161. package/test/integration/generated/enums/extensible/tsconfig.json +25 -0
  162. package/test/integration/generated/enums/extensible/tspconfig.yaml +11 -0
  163. package/test/integration/generated/enums/fixed/.eslintrc.json +11 -0
  164. package/test/integration/generated/enums/fixed/README.md +56 -0
  165. package/test/integration/generated/enums/fixed/api-extractor.json +18 -0
  166. package/test/integration/generated/enums/fixed/package.json +80 -0
  167. package/test/integration/generated/enums/fixed/rollup.config.js +118 -0
  168. package/test/integration/generated/enums/fixed/src/clientDefinitions.ts +43 -0
  169. package/test/integration/generated/enums/fixed/src/enumsFixed.ts +31 -0
  170. package/test/integration/generated/enums/fixed/src/index.ts +11 -0
  171. package/test/integration/generated/enums/fixed/src/parameters.ts +36 -0
  172. package/test/integration/generated/enums/fixed/src/responses.ts +27 -0
  173. package/test/integration/generated/enums/fixed/tsconfig.json +25 -0
  174. package/test/integration/generated/enums/fixed/tspconfig.yaml +11 -0
  175. package/test/integration/generated/hello/.eslintrc.json +11 -0
  176. package/test/integration/generated/hello/README.md +56 -0
  177. package/test/integration/generated/hello/api-extractor.json +18 -0
  178. package/test/integration/generated/hello/package.json +80 -0
  179. package/test/integration/generated/hello/rollup.config.js +118 -0
  180. package/test/integration/generated/hello/src/clientDefinitions.ts +19 -0
  181. package/test/integration/generated/hello/src/hello.ts +29 -0
  182. package/test/integration/generated/hello/src/index.ts +11 -0
  183. package/test/integration/generated/hello/src/parameters.ts +6 -0
  184. package/test/integration/generated/hello/src/responses.ts +10 -0
  185. package/test/integration/generated/hello/tsconfig.json +25 -0
  186. package/test/integration/generated/hello/tspconfig.yaml +11 -0
  187. package/test/integration/generated/lro/lroBasic/.eslintrc.json +11 -0
  188. package/test/integration/generated/lro/lroBasic/README.md +56 -0
  189. package/test/integration/generated/lro/lroBasic/api-extractor.json +18 -0
  190. package/test/integration/generated/lro/lroBasic/package.json +82 -0
  191. package/test/integration/generated/lro/lroBasic/rollup.config.js +118 -0
  192. package/test/integration/generated/lro/lroBasic/src/azureLro.ts +31 -0
  193. package/test/integration/generated/lro/lroBasic/src/clientDefinitions.ts +37 -0
  194. package/test/integration/generated/lro/lroBasic/src/index.ts +12 -0
  195. package/test/integration/generated/lro/lroBasic/src/parameters.ts +8 -0
  196. package/test/integration/generated/lro/lroBasic/src/pollingHelper.ts +75 -0
  197. package/test/integration/generated/lro/lroBasic/src/responses.ts +22 -0
  198. package/test/integration/generated/lro/lroBasic/tsconfig.json +25 -0
  199. package/test/integration/generated/lro/lroBasic/tspconfig.yaml +11 -0
  200. package/test/integration/generated/models/inheritance/.eslintrc.json +11 -0
  201. package/test/integration/generated/models/inheritance/README.md +56 -0
  202. package/test/integration/generated/models/inheritance/api-extractor.json +18 -0
  203. package/test/integration/generated/models/inheritance/package.json +80 -0
  204. package/test/integration/generated/models/inheritance/rollup.config.js +118 -0
  205. package/test/integration/generated/models/inheritance/src/clientDefinitions.ts +79 -0
  206. package/test/integration/generated/models/inheritance/src/index.ts +13 -0
  207. package/test/integration/generated/models/inheritance/src/models.ts +52 -0
  208. package/test/integration/generated/models/inheritance/src/modelsInheritance.ts +31 -0
  209. package/test/integration/generated/models/inheritance/src/outputModels.ts +52 -0
  210. package/test/integration/generated/models/inheritance/src/parameters.ts +35 -0
  211. package/test/integration/generated/models/inheritance/src/responses.ts +56 -0
  212. package/test/integration/generated/models/inheritance/tsconfig.json +25 -0
  213. package/test/integration/generated/models/inheritance/tspconfig.yaml +11 -0
  214. package/test/integration/generated/models/propertyOptional/.eslintrc.json +11 -0
  215. package/test/integration/generated/models/propertyOptional/README.md +56 -0
  216. package/test/integration/generated/models/propertyOptional/api-extractor.json +18 -0
  217. package/test/integration/generated/models/propertyOptional/package.json +80 -0
  218. package/test/integration/generated/models/propertyOptional/rollup.config.js +118 -0
  219. package/test/integration/generated/models/propertyOptional/src/clientDefinitions.ts +263 -0
  220. package/test/integration/generated/models/propertyOptional/src/index.ts +13 -0
  221. package/test/integration/generated/models/propertyOptional/src/models.ts +46 -0
  222. package/test/integration/generated/models/propertyOptional/src/modelsPropertyOptional.ts +31 -0
  223. package/test/integration/generated/models/propertyOptional/src/outputModels.ts +46 -0
  224. package/test/integration/generated/models/propertyOptional/src/parameters.ts +124 -0
  225. package/test/integration/generated/models/propertyOptional/src/responses.ts +169 -0
  226. package/test/integration/generated/models/propertyOptional/tsconfig.json +25 -0
  227. package/test/integration/generated/models/propertyOptional/tspconfig.yaml +11 -0
  228. package/test/integration/generated/models/propertyTypes/.eslintrc.json +11 -0
  229. package/test/integration/generated/models/propertyTypes/README.md +56 -0
  230. package/test/integration/generated/models/propertyTypes/api-extractor.json +18 -0
  231. package/test/integration/generated/models/propertyTypes/package.json +80 -0
  232. package/test/integration/generated/models/propertyTypes/rollup.config.js +118 -0
  233. package/test/integration/generated/models/propertyTypes/src/clientDefinitions.ts +234 -0
  234. package/test/integration/generated/models/propertyTypes/src/index.ts +13 -0
  235. package/test/integration/generated/models/propertyTypes/src/models.ts +99 -0
  236. package/test/integration/generated/models/propertyTypes/src/modelsPropertyTypes.ts +31 -0
  237. package/test/integration/generated/models/propertyTypes/src/outputModels.ts +99 -0
  238. package/test/integration/generated/models/propertyTypes/src/parameters.ts +147 -0
  239. package/test/integration/generated/models/propertyTypes/src/responses.ts +186 -0
  240. package/test/integration/generated/models/propertyTypes/tsconfig.json +25 -0
  241. package/test/integration/generated/models/propertyTypes/tspconfig.yaml +11 -0
  242. package/test/integration/generated/models/usage/.eslintrc.json +11 -0
  243. package/test/integration/generated/models/usage/README.md +56 -0
  244. package/test/integration/generated/models/usage/api-extractor.json +18 -0
  245. package/test/integration/generated/models/usage/package.json +80 -0
  246. package/test/integration/generated/models/usage/rollup.config.js +118 -0
  247. package/test/integration/generated/models/usage/src/clientDefinitions.ts +41 -0
  248. package/test/integration/generated/models/usage/src/index.ts +13 -0
  249. package/test/integration/generated/models/usage/src/models.ts +12 -0
  250. package/test/integration/generated/models/usage/src/modelsUsage.ts +31 -0
  251. package/test/integration/generated/models/usage/src/outputModels.ts +12 -0
  252. package/test/integration/generated/models/usage/src/parameters.ts +19 -0
  253. package/test/integration/generated/models/usage/src/responses.ts +22 -0
  254. package/test/integration/generated/models/usage/tsconfig.json +25 -0
  255. package/test/integration/generated/models/usage/tspconfig.yaml +11 -0
  256. package/test/integration/generated/models/visibility/.eslintrc.json +11 -0
  257. package/test/integration/generated/models/visibility/README.md +56 -0
  258. package/test/integration/generated/models/visibility/api-extractor.json +18 -0
  259. package/test/integration/generated/models/visibility/package.json +80 -0
  260. package/test/integration/generated/models/visibility/rollup.config.js +118 -0
  261. package/test/integration/generated/models/visibility/src/clientDefinitions.ts +40 -0
  262. package/test/integration/generated/models/visibility/src/index.ts +13 -0
  263. package/test/integration/generated/models/visibility/src/models.ts +14 -0
  264. package/test/integration/generated/models/visibility/src/modelsVisibilityAutomatic.ts +31 -0
  265. package/test/integration/generated/models/visibility/src/outputModels.ts +16 -0
  266. package/test/integration/generated/models/visibility/src/parameters.ts +41 -0
  267. package/test/integration/generated/models/visibility/src/responses.ts +36 -0
  268. package/test/integration/generated/models/visibility/tsconfig.json +25 -0
  269. package/test/integration/generated/models/visibility/tspconfig.yaml +11 -0
  270. package/test/integration/generated/resiliency/devDriven/.eslintrc.json +11 -0
  271. package/test/integration/generated/resiliency/devDriven/README.md +56 -0
  272. package/test/integration/generated/resiliency/devDriven/api-extractor.json +18 -0
  273. package/test/integration/generated/resiliency/devDriven/package.json +81 -0
  274. package/test/integration/generated/resiliency/devDriven/rollup.config.js +118 -0
  275. package/test/integration/generated/resiliency/devDriven/src/clientDefinitions.ts +75 -0
  276. package/test/integration/generated/resiliency/devDriven/src/index.ts +15 -0
  277. package/test/integration/generated/resiliency/devDriven/src/isUnexpected.ts +117 -0
  278. package/test/integration/generated/resiliency/devDriven/src/models.ts +8 -0
  279. package/test/integration/generated/resiliency/devDriven/src/outputModels.ts +25 -0
  280. package/test/integration/generated/resiliency/devDriven/src/paginateHelper.ts +154 -0
  281. package/test/integration/generated/resiliency/devDriven/src/parameters.ts +17 -0
  282. package/test/integration/generated/resiliency/devDriven/src/resiliencyDevDriven.ts +31 -0
  283. package/test/integration/generated/resiliency/devDriven/src/responses.ts +62 -0
  284. package/test/integration/generated/resiliency/devDriven/tsconfig.json +25 -0
  285. package/test/integration/generated/resiliency/devDriven/tspconfig.yaml +11 -0
  286. package/test/integration/generated/resiliency/srvDriven1/.eslintrc.json +11 -0
  287. package/test/integration/generated/resiliency/srvDriven1/README.md +56 -0
  288. package/test/integration/generated/resiliency/srvDriven1/api-extractor.json +18 -0
  289. package/test/integration/generated/resiliency/srvDriven1/package.json +80 -0
  290. package/test/integration/generated/resiliency/srvDriven1/rollup.config.js +118 -0
  291. package/test/integration/generated/resiliency/srvDriven1/src/clientDefinitions.ts +70 -0
  292. package/test/integration/generated/resiliency/srvDriven1/src/index.ts +13 -0
  293. package/test/integration/generated/resiliency/srvDriven1/src/models.ts +6 -0
  294. package/test/integration/generated/resiliency/srvDriven1/src/outputModels.ts +6 -0
  295. package/test/integration/generated/resiliency/srvDriven1/src/parameters.ts +51 -0
  296. package/test/integration/generated/resiliency/srvDriven1/src/resiliencyServiceDriven1.ts +31 -0
  297. package/test/integration/generated/resiliency/srvDriven1/src/responses.ts +34 -0
  298. package/test/integration/generated/resiliency/srvDriven1/tsconfig.json +25 -0
  299. package/test/integration/generated/resiliency/srvDriven1/tspconfig.yaml +11 -0
  300. package/test/integration/generated/resiliency/srvDriven2/.eslintrc.json +11 -0
  301. package/test/integration/generated/resiliency/srvDriven2/README.md +56 -0
  302. package/test/integration/generated/resiliency/srvDriven2/api-extractor.json +18 -0
  303. package/test/integration/generated/resiliency/srvDriven2/package.json +80 -0
  304. package/test/integration/generated/resiliency/srvDriven2/rollup.config.js +118 -0
  305. package/test/integration/generated/resiliency/srvDriven2/src/clientDefinitions.ts +93 -0
  306. package/test/integration/generated/resiliency/srvDriven2/src/index.ts +13 -0
  307. package/test/integration/generated/resiliency/srvDriven2/src/models.ts +6 -0
  308. package/test/integration/generated/resiliency/srvDriven2/src/outputModels.ts +6 -0
  309. package/test/integration/generated/resiliency/srvDriven2/src/parameters.ts +68 -0
  310. package/test/integration/generated/resiliency/srvDriven2/src/resiliencyServiceDriven2.ts +31 -0
  311. package/test/integration/generated/resiliency/srvDriven2/src/responses.ts +45 -0
  312. package/test/integration/generated/resiliency/srvDriven2/tsconfig.json +25 -0
  313. package/test/integration/generated/resiliency/srvDriven2/tspconfig.yaml +11 -0
  314. package/test/integration/generated/specialWords/src/clientDefinitions.ts +61 -0
  315. package/test/integration/generated/specialWords/src/index.ts +13 -0
  316. package/test/integration/generated/specialWords/src/models.ts +17 -0
  317. package/test/integration/generated/specialWords/src/outputModels.ts +17 -0
  318. package/test/integration/generated/specialWords/src/parameters.ts +37 -0
  319. package/test/integration/generated/specialWords/src/responses.ts +31 -0
  320. package/test/integration/generated/specialWords/src/specialWordsClient.ts +31 -0
  321. package/test/integration/generated/specialWords/tspconfig.yaml +11 -0
  322. package/test/integration/generated/unions/src/clientDefinitions.ts +53 -0
  323. package/test/integration/generated/unions/src/index.ts +12 -0
  324. package/test/integration/generated/unions/src/models.ts +27 -0
  325. package/test/integration/generated/unions/src/parameters.ts +34 -0
  326. package/test/integration/generated/unions/src/responses.ts +24 -0
  327. package/test/integration/generated/unions/src/unionsClient.ts +31 -0
  328. package/test/integration/generated/unions/tspconfig.yaml +11 -0
  329. package/test/integration/helloWorld.spec.ts +20 -0
  330. package/test/integration/lroBasic.spec.ts +25 -0
  331. package/test/integration/modelInheritance.spec.ts +192 -0
  332. package/test/integration/modelPropertyOptional.spec.ts +362 -0
  333. package/test/integration/modelPropertyType.spec.ts +119 -0
  334. package/test/integration/modelUsage.spec.ts +47 -0
  335. package/test/integration/resiliencyDpgCustomization.spec.ts +52 -0
  336. package/test/integration/specialWords.spec.ts +73 -0
  337. package/test/integration/unions.spec.ts +69 -0
  338. package/test/tsconfig.json +4 -0
  339. package/test/unit/azureCoreOperationsGenerator.spec.ts +71 -0
  340. package/test/unit/clientDefinitionGenerator.spec.ts +73 -0
  341. package/test/unit/clientFactoryGenerator.spec.ts +507 -0
  342. package/test/unit/docsGenerator.spec.ts +201 -0
  343. package/test/unit/modelsGenerator.spec.ts +1319 -0
  344. package/test/unit/parametersGenerator.spec.ts +561 -0
  345. package/test/unit/responsesGenerator.spec.ts +462 -0
  346. package/test/unit/spreadAndAlias.spec.ts +200 -0
  347. package/test/unit/util/emitUtil.ts +156 -0
  348. package/test/unit/util/testUtil.ts +83 -0
  349. package/test/util/customBearerTokenTestingPolicy.ts +78 -0
  350. package/test/util/matrix.ts +48 -0
  351. package/tsconfig.json +36 -0
  352. package/tsconfig.test.json +7 -0
  353. package/typespec-ts.build.log +2 -0
@@ -0,0 +1,961 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+
4
+ import {
5
+ Discriminator,
6
+ Enum,
7
+ EnumMember,
8
+ getDiscriminator,
9
+ getDoc,
10
+ getEffectiveModelType,
11
+ getFormat,
12
+ getFriendlyName,
13
+ getMaxLength,
14
+ getMaxValue,
15
+ getMinLength,
16
+ getMinValue,
17
+ getPattern,
18
+ getProperty,
19
+ getPropertyType,
20
+ getSummary,
21
+ getVisibility,
22
+ isNeverType,
23
+ isNumericType,
24
+ isSecret,
25
+ isStringType,
26
+ isTemplateDeclaration,
27
+ isUnknownType,
28
+ Model,
29
+ ModelProperty,
30
+ Program,
31
+ Type,
32
+ Union,
33
+ isNullType,
34
+ Scalar,
35
+ UnionVariant,
36
+ getProjectedName
37
+ } from "@typespec/compiler";
38
+ import { reportDiagnostic } from "./lib.js";
39
+ import {
40
+ DictionarySchema,
41
+ NameType,
42
+ normalizeName,
43
+ ObjectSchema,
44
+ Schema,
45
+ SchemaContext
46
+ } from "@azure-tools/rlc-common";
47
+ import { getResourceOperation } from "@typespec/rest";
48
+ import {
49
+ getHeaderFieldName,
50
+ getPathParamName,
51
+ getQueryParamName,
52
+ isStatusCode,
53
+ HttpOperation
54
+ } from "@typespec/http";
55
+ import { getPagedResult, isFixed } from "@azure-tools/typespec-azure-core";
56
+ import { extractPagedMetadataNested } from "./operationUtil.js";
57
+
58
+ export function getBinaryType(usage: SchemaContext[]) {
59
+ return usage.includes(SchemaContext.Output)
60
+ ? "Uint8Array"
61
+ : "string | Uint8Array | ReadableStream<Uint8Array> | NodeJS.ReadableStream";
62
+ }
63
+
64
+ export function getSchemaForType(
65
+ program: Program,
66
+ typeInput: Type,
67
+ usage?: SchemaContext[],
68
+ needRef?: boolean
69
+ ) {
70
+ const type = getEffectiveModelFromType(program, typeInput);
71
+ const builtinType = mapCadlTypeToTypeScript(program, type, usage);
72
+ if (builtinType !== undefined) {
73
+ // add in description elements for types derived from primitive types (SecureString, etc.)
74
+ const doc = getDoc(program, type);
75
+ if (doc) {
76
+ builtinType.description = doc;
77
+ }
78
+ return builtinType;
79
+ }
80
+ if (type.kind === "Model") {
81
+ const schema = getSchemaForModel(program, type, usage, needRef) as any;
82
+ if (usage && usage.includes(SchemaContext.Output)) {
83
+ schema.outputTypeName = `${schema.name}Output`;
84
+ schema.typeName = `${schema.name}`;
85
+ }
86
+ schema.usage = usage;
87
+ return schema;
88
+ } else if (type.kind === "Union") {
89
+ return getSchemaForUnion(program, type, usage);
90
+ } else if (type.kind === "UnionVariant") {
91
+ return getSchemaForUnionVariant(program, type, usage);
92
+ } else if (type.kind === "Enum") {
93
+ return getSchemaForEnum(program, type);
94
+ } else if (type.kind === "Scalar") {
95
+ return getSchemaForScalar(program, type);
96
+ }
97
+ if (isUnknownType(type)) {
98
+ const returnType: any = { type: "unknown" };
99
+ if (usage && usage.includes(SchemaContext.Output)) {
100
+ returnType.outputTypeName = "any";
101
+ returnType.typeName = "unknown";
102
+ }
103
+ return returnType;
104
+ }
105
+ if (isNeverType(type)) {
106
+ return { type: "never" };
107
+ }
108
+ if (isNullType(type)) {
109
+ return { type: "null" };
110
+ }
111
+ reportDiagnostic(program, {
112
+ code: "invalid-schema",
113
+ format: { type: type.kind },
114
+ target: type
115
+ });
116
+ return undefined;
117
+ }
118
+ export function getEffectiveModelFromType(program: Program, type: Type): Type {
119
+ if (type.kind === "Model") {
120
+ const effective = getEffectiveModelType(program, type, isSchemaProperty);
121
+ if (effective.name) {
122
+ return effective;
123
+ }
124
+ }
125
+ function isSchemaProperty(property: ModelProperty) {
126
+ const headerInfo = getHeaderFieldName(program, property);
127
+ const queryInfo = getQueryParamName(program, property);
128
+ const pathInfo = getPathParamName(program, property);
129
+ const statusCodeInfo = isStatusCode(program, property);
130
+ return !(headerInfo || queryInfo || pathInfo || statusCodeInfo);
131
+ }
132
+ return type;
133
+ }
134
+ export function includeDerivedModel(model: Model): boolean {
135
+ return (
136
+ !isTemplateDeclaration(model) &&
137
+ (model.templateArguments === undefined ||
138
+ model.templateArguments?.length === 0 ||
139
+ model.derivedModels.length > 0)
140
+ );
141
+ }
142
+
143
+ function getSchemaForScalar(program: Program, scalar: Scalar) {
144
+ let result = getSchemaForStdScalar(program, scalar);
145
+ if (!result && scalar.baseScalar) {
146
+ result = getSchemaForScalar(program, scalar.baseScalar);
147
+ }
148
+ return applyIntrinsicDecorators(program, scalar, result);
149
+ }
150
+
151
+ function getSchemaForUnion(
152
+ program: Program,
153
+ union: Union,
154
+ usage?: SchemaContext[]
155
+ ) {
156
+ const variants = Array.from(union.variants.values());
157
+ const values = [];
158
+
159
+ for (const variant of variants) {
160
+ // We already know it's not a model type
161
+ values.push(getSchemaForType(program, variant.type, usage));
162
+ }
163
+
164
+ const schema: any = {};
165
+ if (values.length > 0) {
166
+ schema.enum = values;
167
+ const unionAlias = values
168
+ .map((item) => `${getTypeName(item, [SchemaContext.Input]) ?? item}`)
169
+ .join(" | ");
170
+ const outputUnionAlias = values
171
+ .map((item) => `${getTypeName(item, [SchemaContext.Output]) ?? item}`)
172
+ .join(" | ");
173
+ if (!union.expression) {
174
+ schema.name = union.name;
175
+ schema.type = "object";
176
+ schema.typeName = union.name;
177
+ schema.outputTypeName = union.name + "Output";
178
+ schema.alias = unionAlias;
179
+ schema.outputAlias = outputUnionAlias;
180
+ } else if (union.expression && !union.name) {
181
+ schema.type = unionAlias;
182
+ schema.outputTypeName = outputUnionAlias;
183
+ } else {
184
+ schema.type = union.name ?? unionAlias;
185
+ }
186
+ }
187
+
188
+ return schema;
189
+ }
190
+
191
+ function getSchemaForUnionVariant(
192
+ program: Program,
193
+ variant: UnionVariant,
194
+ usage?: SchemaContext[]
195
+ ): Schema {
196
+ return getSchemaForType(program, variant, usage);
197
+ }
198
+
199
+ // An openapi "string" can be defined in several different ways in Cadl
200
+ function isOasString(type: Type): boolean {
201
+ if (type.kind === "String") {
202
+ // A string literal
203
+ return true;
204
+ } else if (type.kind === "Model" && type.name === "string") {
205
+ // string type
206
+ return true;
207
+ } else if (type.kind === "Union") {
208
+ // A union where all variants are an OasString
209
+ return type.options.every((o) => isOasString(o));
210
+ }
211
+ return false;
212
+ }
213
+
214
+ function isStringLiteral(type: Type): boolean {
215
+ return (
216
+ type.kind === "String" ||
217
+ (type.kind === "Union" && type.options.every((o) => o.kind === "String"))
218
+ );
219
+ }
220
+
221
+ // Return any string literal values for type
222
+ function getStringValues(type: Type): string[] {
223
+ if (type.kind === "String") {
224
+ return [type.value];
225
+ } else if (type.kind === "Union") {
226
+ return type.options.flatMap(getStringValues).filter((v) => v);
227
+ }
228
+ return [];
229
+ }
230
+ function validateDiscriminator(
231
+ program: Program,
232
+ discriminator: Discriminator,
233
+ derivedModels: readonly Model[]
234
+ ): boolean {
235
+ const { propertyName } = discriminator;
236
+ const retVals = derivedModels.map((t) => {
237
+ const prop = getProperty(t, propertyName);
238
+ if (!prop) {
239
+ reportDiagnostic(program, {
240
+ code: "discriminator",
241
+ messageId: "missing",
242
+ target: t
243
+ });
244
+ return false;
245
+ }
246
+ let retval = true;
247
+ if (!isOasString(prop.type)) {
248
+ reportDiagnostic(program, {
249
+ code: "discriminator",
250
+ messageId: "type",
251
+ target: prop
252
+ });
253
+ retval = false;
254
+ }
255
+ if (prop.optional) {
256
+ reportDiagnostic(program, {
257
+ code: "discriminator",
258
+ messageId: "required",
259
+ target: prop
260
+ });
261
+ retval = false;
262
+ }
263
+ return retval;
264
+ });
265
+ // Map of discriminator value to the model in which it is declared
266
+ const discriminatorValues = new Map<string, string>();
267
+ for (const t of derivedModels) {
268
+ // Get the discriminator property directly in the child model
269
+ const prop = t.properties?.get(propertyName);
270
+ // Issue warning diagnostic if discriminator property missing or is not a string literal
271
+ if (!prop || !isStringLiteral(prop.type)) {
272
+ reportDiagnostic(program, {
273
+ code: "discriminator-value",
274
+ messageId: "literal",
275
+ target: prop || t
276
+ });
277
+ }
278
+ if (prop) {
279
+ const vals = getStringValues(prop.type);
280
+ vals.forEach((val) => {
281
+ if (discriminatorValues.has(val)) {
282
+ reportDiagnostic(program, {
283
+ code: "discriminator",
284
+ messageId: "duplicate",
285
+ format: {
286
+ val: val,
287
+ model1: discriminatorValues.get(val)!,
288
+ model2: t.name
289
+ },
290
+ target: prop
291
+ });
292
+ retVals.push(false);
293
+ } else {
294
+ discriminatorValues.set(val, t.name);
295
+ }
296
+ });
297
+ }
298
+ }
299
+ return retVals.every((v) => v);
300
+ }
301
+ /**
302
+ * A "schema property" here is a property that is emitted to OpenAPI schema.
303
+ *
304
+ * Headers, parameters, status codes are not schema properties even they are
305
+ * represented as properties in Cadl.
306
+ */
307
+ function isSchemaProperty(program: Program, property: ModelProperty) {
308
+ const headerInfo = getHeaderFieldName(program, property);
309
+ const queryInfo = getQueryParamName(program, property);
310
+ const pathInfo = getPathParamName(program, property);
311
+ const statusCodeinfo = isStatusCode(program, property);
312
+ return !(headerInfo || queryInfo || pathInfo || statusCodeinfo);
313
+ }
314
+ // function getDefaultValue(program: Program, type: Type): any {
315
+ // switch (type.kind) {
316
+ // case "String":
317
+ // return type.value;
318
+ // case "Number":
319
+ // return type.value;
320
+ // case "Boolean":
321
+ // return type.value;
322
+ // case "Tuple":
323
+ // return type.values.map(item => getDefaultValue(program, item));
324
+ // default:
325
+ // reportDiagnostic(program, {
326
+ // code: "invalid-default",
327
+ // format: { type: type.kind },
328
+ // target: type,
329
+ // });
330
+ // }
331
+ // }
332
+ function getSchemaForModel(
333
+ program: Program,
334
+ model: Model,
335
+ usage?: SchemaContext[],
336
+ needRef?: boolean
337
+ ) {
338
+ const overridedModelName =
339
+ getProjectedName(program, model, "javascript") ??
340
+ getProjectedName(program, model, "client") ??
341
+ getFriendlyName(program, model);
342
+ let name = model.name;
343
+ if (
344
+ !overridedModelName &&
345
+ model.templateArguments &&
346
+ model.templateArguments.length > 0 &&
347
+ getPagedResult(program, model)
348
+ ) {
349
+ name =
350
+ model.templateArguments
351
+ .map((it) => {
352
+ switch (it.kind) {
353
+ case "Model":
354
+ return it.name;
355
+ case "String":
356
+ return it.value;
357
+ default:
358
+ return "";
359
+ }
360
+ })
361
+ .join("") + "List";
362
+ }
363
+ let modelSchema: ObjectSchema = {
364
+ name: overridedModelName ?? name,
365
+ type: "object",
366
+ description: getDoc(program, model) ?? ""
367
+ };
368
+ // normalized the output name
369
+ modelSchema.name = normalizeName(
370
+ modelSchema.name,
371
+ NameType.Interface,
372
+ true /** shouldGuard */
373
+ );
374
+
375
+ if (
376
+ (model.name === "ErrorResponse" ||
377
+ model.name === "ErrorModel" ||
378
+ model.name === "Error") &&
379
+ model.kind === "Model" &&
380
+ model.namespace?.name === "Foundations" &&
381
+ model.namespace.namespace?.name === "Core"
382
+ ) {
383
+ modelSchema.fromCore = true;
384
+ }
385
+
386
+ if (getPagedResult(program, model)) {
387
+ const paged = extractPagedMetadataNested(program, model);
388
+ if (paged && paged.itemsProperty) {
389
+ const items = paged.itemsProperty as unknown as Model;
390
+ if (items && items.templateArguments) {
391
+ const templateName = items.templateArguments
392
+ ?.map((it) => {
393
+ switch (it.kind) {
394
+ case "Model":
395
+ return it.name;
396
+ case "String":
397
+ return it.value;
398
+ default:
399
+ return "";
400
+ }
401
+ })
402
+ .join("");
403
+ modelSchema.alias = `Paged<${templateName}>`;
404
+ modelSchema.outputAlias = `Paged<${templateName}Output>`;
405
+ }
406
+ }
407
+ }
408
+ modelSchema.properties = {};
409
+ const derivedModels = model.derivedModels.filter(includeDerivedModel);
410
+
411
+ // getSchemaOrRef on all children to push them into components.schemas
412
+ const discriminator = getDiscriminator(program, model);
413
+ if (derivedModels.length > 0) {
414
+ modelSchema.children = {
415
+ all: [],
416
+ immediate: []
417
+ };
418
+ }
419
+ for (const child of derivedModels) {
420
+ const childSchema = getSchemaForType(program, child, usage, true);
421
+ for (const [name, prop] of child.properties) {
422
+ if (name === discriminator?.propertyName) {
423
+ const propSchema = getSchemaForType(program, prop.type, usage, true);
424
+ childSchema.discriminatorValue = propSchema.type.replace(/"/g, "");
425
+ break;
426
+ }
427
+ }
428
+ modelSchema.children?.all?.push(childSchema);
429
+ modelSchema.children?.immediate?.push(childSchema);
430
+ }
431
+
432
+ // Enable option `isPolyParent` and discriminator only when it has valid children
433
+ if (
434
+ discriminator &&
435
+ modelSchema?.children?.all?.length &&
436
+ modelSchema?.children?.all?.length > 0
437
+ ) {
438
+ if (!validateDiscriminator(program, discriminator, derivedModels)) {
439
+ // appropriate diagnostic is generated in the validate function
440
+ return {};
441
+ }
442
+
443
+ const { propertyName } = discriminator;
444
+
445
+ modelSchema.discriminator = {
446
+ name: propertyName,
447
+ type: "string",
448
+ required: true,
449
+ description: `Discriminator property for ${model.name}.`
450
+ };
451
+
452
+ modelSchema.isPolyParent = true;
453
+ }
454
+
455
+ // applyExternalDocs(model, modelSchema);
456
+ if (needRef) {
457
+ return modelSchema;
458
+ }
459
+ for (const [propName, prop] of model.properties) {
460
+ const restApiName = getProjectedName(program, prop, "json");
461
+ const name = `"${restApiName ?? propName}"`;
462
+ if (!isSchemaProperty(program, prop)) {
463
+ continue;
464
+ }
465
+
466
+ const propSchema = getSchemaForType(program, prop.type, usage, true);
467
+ if (propSchema === undefined) {
468
+ continue;
469
+ }
470
+ if (!prop.optional) {
471
+ propSchema.required = true;
472
+ }
473
+ const propertyDescription = getFormattedPropertyDoc(
474
+ program,
475
+ prop,
476
+ propSchema
477
+ );
478
+ propSchema.usage = usage;
479
+ // Use the description from ModelProperty not devired from Model Type
480
+ propSchema.description = propertyDescription;
481
+ modelSchema.properties[name] = propSchema;
482
+ // if this property is a discriminator property, remove it to keep autorest validation happy
483
+ if (model.baseModel) {
484
+ const { propertyName } = getDiscriminator(program, model.baseModel) || {};
485
+ if (propertyName && name === `"${propertyName}"`) {
486
+ continue;
487
+ }
488
+ }
489
+
490
+ // Apply decorators on the property to the type's schema
491
+ const newPropSchema = applyIntrinsicDecorators(program, prop, propSchema);
492
+ if (newPropSchema === undefined) {
493
+ continue;
494
+ }
495
+ // Use the description from ModelProperty not devired from Model Type
496
+ newPropSchema.description = propertyDescription;
497
+
498
+ if (prop.default) {
499
+ // modelSchema.properties[name]['default'] = getDefaultValue(program, prop.default);
500
+ }
501
+
502
+ // Should the property be marked as readOnly?
503
+ const vis = getVisibility(program, prop);
504
+ if (vis && vis.includes("read")) {
505
+ const mutability = [];
506
+ if (vis.includes("read")) {
507
+ if (vis.length > 1) {
508
+ mutability.push(SchemaContext.Output);
509
+ } else {
510
+ newPropSchema["readOnly"] = true;
511
+ }
512
+ }
513
+ if (vis.includes("write") || vis.includes("create")) {
514
+ mutability.push(SchemaContext.Input);
515
+ }
516
+
517
+ if (mutability.length > 0) {
518
+ newPropSchema["usage"] = mutability;
519
+ }
520
+ }
521
+ modelSchema.properties[name] = newPropSchema;
522
+ }
523
+
524
+ // Special case: if a model type extends a single *templated* base type and
525
+ // has no properties of its own, absorb the definition of the base model
526
+ // into this schema definition. The assumption here is that any model type
527
+ // defined like this is just meant to rename the underlying instance of a
528
+ // templated type.
529
+ if (
530
+ model.baseModel &&
531
+ model.baseModel.templateArguments &&
532
+ model.baseModel.templateArguments.length > 0 &&
533
+ modelSchema.properties &&
534
+ Object.keys(modelSchema.properties).length === 0
535
+ ) {
536
+ // Take the base model schema but carry across the documentation property
537
+ // that we set before
538
+ const baseSchema = getSchemaForType(program, model.baseModel, usage);
539
+ modelSchema = {
540
+ ...baseSchema,
541
+ description: modelSchema.description
542
+ };
543
+ } else if (model.baseModel) {
544
+ modelSchema.parents = {
545
+ all: [getSchemaForType(program, model.baseModel, usage, true)],
546
+ immediate: [getSchemaForType(program, model.baseModel, usage, true)]
547
+ };
548
+ }
549
+ return modelSchema;
550
+ }
551
+ // Map an Cadl type to an OA schema. Returns undefined when the resulting
552
+ // OA schema is just a regular object schema.
553
+ function mapCadlTypeToTypeScript(
554
+ program: Program,
555
+ cadlType: Type,
556
+ usage?: SchemaContext[]
557
+ ): any {
558
+ switch (cadlType.kind) {
559
+ case "Number":
560
+ return { type: `${cadlType.value}` };
561
+ case "String":
562
+ return { type: `"${cadlType.value}"` };
563
+ case "Boolean":
564
+ return { type: `${cadlType.value}` };
565
+ case "Model":
566
+ return mapCadlStdTypeToTypeScript(program, cadlType, usage);
567
+ }
568
+ if (cadlType.kind === undefined) {
569
+ if (typeof cadlType === "string") {
570
+ return { type: `"${cadlType}"` };
571
+ } else if (typeof cadlType === "number" || typeof cadlType === "boolean") {
572
+ return { type: `${cadlType}` };
573
+ }
574
+ }
575
+ }
576
+ function applyIntrinsicDecorators(
577
+ program: Program,
578
+ cadlType: Scalar | ModelProperty,
579
+ target: any
580
+ ): any {
581
+ const newTarget = { ...target };
582
+ const docStr = getDoc(program, cadlType);
583
+ const isString = isStringType(program, getPropertyType(cadlType));
584
+ const isNumeric = isNumericType(program, getPropertyType(cadlType));
585
+
586
+ if (isString && !target.documentation && docStr) {
587
+ newTarget.description = docStr;
588
+ }
589
+
590
+ const restApiName = getProjectedName(program, cadlType, "json");
591
+ if (restApiName) {
592
+ newTarget.name = restApiName;
593
+ }
594
+
595
+ const summaryStr = getSummary(program, cadlType);
596
+ if (isString && !target.summary && summaryStr) {
597
+ newTarget.summary = summaryStr;
598
+ }
599
+
600
+ const formatStr = getFormat(program, cadlType);
601
+ if (isString && !target.format && formatStr) {
602
+ newTarget.format = formatStr;
603
+ }
604
+
605
+ const pattern = getPattern(program, cadlType);
606
+ if (isString && !target.pattern && pattern) {
607
+ newTarget.pattern = pattern;
608
+ }
609
+
610
+ const minLength = getMinLength(program, cadlType);
611
+ if (isString && !target.minLength && minLength !== undefined) {
612
+ newTarget.minLength = minLength;
613
+ }
614
+
615
+ const maxLength = getMaxLength(program, cadlType);
616
+ if (isString && !target.maxLength && maxLength !== undefined) {
617
+ newTarget.maxLength = maxLength;
618
+ }
619
+
620
+ const minValue = getMinValue(program, cadlType);
621
+ if (isNumeric && !target.minimum && minValue !== undefined) {
622
+ newTarget.minimum = minValue;
623
+ }
624
+
625
+ const maxValue = getMaxValue(program, cadlType);
626
+ if (isNumeric && !target.maximum && maxValue !== undefined) {
627
+ newTarget.maximum = maxValue;
628
+ }
629
+
630
+ if (isSecret(program, cadlType)) {
631
+ newTarget.format = "password";
632
+ newTarget["x-ms-secret"] = true;
633
+ }
634
+
635
+ return newTarget;
636
+ }
637
+ function getSchemaForEnum(program: Program, e: Enum) {
638
+ const values = [];
639
+ const type = enumMemberType(e.members.values().next().value);
640
+ for (const option of e.members.values()) {
641
+ if (type !== enumMemberType(option)) {
642
+ reportDiagnostic(program, { code: "union-unsupported", target: e });
643
+ continue;
644
+ }
645
+
646
+ values.push(option.value ?? option.name);
647
+ }
648
+
649
+ const schema: any = { type, description: getDoc(program, e) };
650
+ if (values.length > 0) {
651
+ schema.enum = values;
652
+ schema.type =
653
+ type === "string"
654
+ ? values.map((item) => `"${item}"`).join("|")
655
+ : values.map((item) => `${item}`).join("|");
656
+ if (!isFixed(program, e)) {
657
+ schema.name = "string";
658
+ schema.typeName = "string";
659
+ }
660
+ }
661
+ return schema;
662
+ function enumMemberType(member: EnumMember) {
663
+ if (typeof member.value === "number") {
664
+ return "number";
665
+ }
666
+ return "string";
667
+ }
668
+ }
669
+ /**
670
+ * Map Cadl intrinsic models to open api definitions
671
+ */
672
+ function mapCadlStdTypeToTypeScript(
673
+ program: Program,
674
+ cadlType: Model,
675
+ usage?: SchemaContext[]
676
+ ): any | undefined {
677
+ const indexer = (cadlType as Model).indexer;
678
+ if (indexer !== undefined) {
679
+ if (!isNeverType(indexer.key)) {
680
+ const name = indexer.key.name;
681
+ let schema: any = {};
682
+ if (name === "string") {
683
+ const valueType = getSchemaForType(
684
+ program,
685
+ indexer.value!,
686
+ usage,
687
+ true
688
+ );
689
+ schema = {
690
+ type: "dictionary",
691
+ additionalProperties: valueType,
692
+ description: getDoc(program, cadlType)
693
+ };
694
+ if (
695
+ !program.checker.isStdType(indexer.value) &&
696
+ !isUnknownType(indexer.value!) &&
697
+ !isUnionType(indexer.value!)
698
+ ) {
699
+ schema.typeName = `Record<string, ${valueType.name}>`;
700
+ schema.valueTypeName = valueType.name;
701
+ if (usage && usage.includes(SchemaContext.Output)) {
702
+ schema.outputTypeName = `Record<string, ${valueType.name}Output>`;
703
+ schema.outputValueTypeName = `${valueType.name}Output`;
704
+ }
705
+ } else if (isUnknownType(indexer.value!)) {
706
+ schema.typeName = `Record<string, ${valueType.type}>`;
707
+ if (usage && usage.includes(SchemaContext.Output)) {
708
+ schema.outputTypeName = `Record<string, ${valueType.outputTypeName}>`;
709
+ }
710
+ } else {
711
+ schema.typeName = `Record<string, ${valueType.type}>`;
712
+ }
713
+ } else if (name === "integer") {
714
+ schema = {
715
+ type: "array",
716
+ items: getSchemaForType(program, indexer.value!, usage, true),
717
+ description: getDoc(program, cadlType)
718
+ };
719
+ if (
720
+ !program.checker.isStdType(indexer.value) &&
721
+ !isUnknownType(indexer.value!) &&
722
+ indexer.value?.kind &&
723
+ schema.items.name &&
724
+ !schema.items.enum
725
+ ) {
726
+ schema.typeName = `Array<${schema.items.name}>`;
727
+ if (usage && usage.includes(SchemaContext.Output)) {
728
+ schema.outputTypeName = `Array<${schema.items.name}Output>`;
729
+ }
730
+ } else {
731
+ if (schema.items.typeName) {
732
+ schema.typeName = schema.items.typeName
733
+ .split("|")
734
+ .map((typeName: string) => {
735
+ return `${typeName}[]`;
736
+ })
737
+ .join(" | ");
738
+ if (
739
+ schema.items.outputTypeName &&
740
+ usage &&
741
+ usage.includes(SchemaContext.Output)
742
+ ) {
743
+ schema.outputTypeName = schema.items.outputTypeName
744
+ .split("|")
745
+ .map((typeName: string) => {
746
+ return `${typeName}[]`;
747
+ })
748
+ .join(" | ");
749
+ }
750
+ } else if (schema.items.type.includes("|")) {
751
+ schema.typeName = `(${schema.items.type})[]`;
752
+ } else {
753
+ schema.typeName = `${schema.items.type}[]`;
754
+ }
755
+ }
756
+ }
757
+
758
+ schema.usage = usage;
759
+ return schema;
760
+ }
761
+ }
762
+ }
763
+
764
+ function isUnionType(type: Type) {
765
+ return type.kind === "Union";
766
+ }
767
+
768
+ function getSchemaForStdScalar(program: Program, cadlType: Scalar) {
769
+ if (!program.checker.isStdType(cadlType)) {
770
+ return undefined;
771
+ }
772
+ const name = cadlType.name;
773
+ const description = getSummary(program, cadlType);
774
+ switch (name) {
775
+ case "bytes":
776
+ return { type: "string", format: "byte", description };
777
+ case "integer":
778
+ return applyIntrinsicDecorators(program, cadlType, {
779
+ type: "number"
780
+ });
781
+ case "int8":
782
+ return applyIntrinsicDecorators(program, cadlType, {
783
+ type: "number",
784
+ format: "int8"
785
+ });
786
+ case "int16":
787
+ return applyIntrinsicDecorators(program, cadlType, {
788
+ type: "number",
789
+ format: "int16"
790
+ });
791
+ case "int32":
792
+ return applyIntrinsicDecorators(program, cadlType, {
793
+ type: "number",
794
+ format: "int32"
795
+ });
796
+ case "int64":
797
+ return applyIntrinsicDecorators(program, cadlType, {
798
+ type: "number",
799
+ format: "int64"
800
+ });
801
+ case "safeint":
802
+ return applyIntrinsicDecorators(program, cadlType, {
803
+ type: "number",
804
+ format: "int64"
805
+ });
806
+ case "uint8":
807
+ return applyIntrinsicDecorators(program, cadlType, {
808
+ type: "number",
809
+ format: "uint8"
810
+ });
811
+ case "uint16":
812
+ return applyIntrinsicDecorators(program, cadlType, {
813
+ type: "number",
814
+ format: "uint16"
815
+ });
816
+ case "uint32":
817
+ return applyIntrinsicDecorators(program, cadlType, {
818
+ type: "number",
819
+ format: "uint32"
820
+ });
821
+ case "uint64":
822
+ return applyIntrinsicDecorators(program, cadlType, {
823
+ type: "number",
824
+ format: "uint64"
825
+ });
826
+ case "float64":
827
+ return applyIntrinsicDecorators(program, cadlType, {
828
+ type: "number",
829
+ format: "double"
830
+ });
831
+ case "float32":
832
+ return applyIntrinsicDecorators(program, cadlType, {
833
+ type: "number",
834
+ format: "float"
835
+ });
836
+ case "string":
837
+ return applyIntrinsicDecorators(program, cadlType, { type: "string" });
838
+ case "boolean":
839
+ return { type: "boolean", description };
840
+ case "plainDate":
841
+ return {
842
+ type: "string",
843
+ format: "date",
844
+ description,
845
+ typeName: "Date | string",
846
+ outputTypeName: "string"
847
+ };
848
+ case "zonedDateTime":
849
+ return {
850
+ type: "string",
851
+ format: "date-time",
852
+ description,
853
+ typeName: "Date | string",
854
+ outputTypeName: "string"
855
+ };
856
+ case "plainTime":
857
+ return {
858
+ type: "string",
859
+ format: "time",
860
+ description,
861
+ typeName: "Date | string",
862
+ outputTypeName: "string"
863
+ };
864
+ case "duration":
865
+ return { type: "string", format: "duration", description };
866
+ }
867
+ }
868
+
869
+ export function getTypeName(schema: Schema, usage?: SchemaContext[]): string {
870
+ // TODO: Handle more cases
871
+ return getPriorityName(schema, usage) ?? schema.type ?? "any";
872
+ }
873
+
874
+ export function getImportedModelName(schema: Schema): string[] | undefined {
875
+ switch (schema.type) {
876
+ case "array":
877
+ return [(schema as any).items]
878
+ .filter((i: Schema) => i.type === "object")
879
+ .map((i: Schema) => getPriorityName(i) ?? "");
880
+ case "object":
881
+ return getPriorityName(schema) ? [getPriorityName(schema)] : undefined;
882
+ case "dictionary": {
883
+ const importName = getDictionaryValueName(schema as DictionarySchema);
884
+ return importName ? [importName] : undefined;
885
+ }
886
+ default:
887
+ return;
888
+ }
889
+ }
890
+
891
+ function getPriorityName(schema: Schema, usage?: SchemaContext[]): string {
892
+ return usage &&
893
+ usage.includes(SchemaContext.Input) &&
894
+ !usage.includes(SchemaContext.Output)
895
+ ? schema.typeName ?? schema.name
896
+ : schema.outputTypeName ?? schema.typeName ?? schema.name;
897
+ }
898
+ function getDictionaryValueName(schema: DictionarySchema): string | undefined {
899
+ return schema.outputValueTypeName ?? schema.valueTypeName ?? undefined;
900
+ }
901
+ function getEnumStringDescription(type: any) {
902
+ if (type.name === "string" && type.enum && type.enum.length > 0) {
903
+ return `Possible values: ${type.enum.join(", ")}`;
904
+ }
905
+ return undefined;
906
+ }
907
+
908
+ export function getFormattedPropertyDoc(
909
+ program: Program,
910
+ cadlType: ModelProperty | Type,
911
+ schemaType: any,
912
+ sperator: string = "\n\n"
913
+ ) {
914
+ const propertyDoc = getDoc(program, cadlType);
915
+ const enhancedDocFromType = getEnumStringDescription(schemaType);
916
+ if (propertyDoc && enhancedDocFromType) {
917
+ return `${propertyDoc}${sperator}${enhancedDocFromType}`;
918
+ }
919
+ return propertyDoc ?? enhancedDocFromType;
920
+ }
921
+
922
+ export function getBodyType(
923
+ program: Program,
924
+ route: HttpOperation
925
+ ): Type | undefined {
926
+ let bodyModel = route.parameters.bodyType;
927
+ if (bodyModel && bodyModel.kind === "Model" && route.operation) {
928
+ const resourceType = getResourceOperation(
929
+ program,
930
+ route.operation
931
+ )?.resourceType;
932
+ if (resourceType && route.responses && route.responses.length > 0) {
933
+ const resp = route.responses[0];
934
+ if (resp && resp.responses && resp.responses.length > 0) {
935
+ const responseBody = resp.responses[0]?.body;
936
+ if (responseBody) {
937
+ const bodyTypeInResponse = getEffectiveModelFromType(
938
+ program,
939
+ responseBody.type
940
+ );
941
+ // response body type is reosurce type, and request body type (if templated) contains resource type
942
+ if (
943
+ bodyTypeInResponse === resourceType &&
944
+ bodyModel.templateArguments &&
945
+ bodyModel.templateArguments.some((it) => {
946
+ return it.kind === "Model" || it.kind === "Union"
947
+ ? it === bodyTypeInResponse
948
+ : false;
949
+ })
950
+ ) {
951
+ bodyModel = resourceType;
952
+ }
953
+ }
954
+ }
955
+ }
956
+ if (resourceType && bodyModel.name === "") {
957
+ bodyModel = resourceType;
958
+ }
959
+ }
960
+ return bodyModel;
961
+ }