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