@azure-tools/typespec-ts 0.11.0 → 0.12.0-alpha.20230501.1

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 (412) hide show
  1. package/.rush/temp/package-deps_build.json +265 -152
  2. package/.rush/temp/shrinkwrap-deps.json +58 -54
  3. package/CHANGELOG.md +4 -0
  4. package/CONTRIBUTING.md +5 -2
  5. package/README.md +3 -3
  6. package/dist/src/casingUtils.d.ts +4 -0
  7. package/dist/src/casingUtils.d.ts.map +1 -0
  8. package/dist/src/casingUtils.js +39 -0
  9. package/dist/src/casingUtils.js.map +1 -0
  10. package/dist/src/emitUtil.js +7 -1
  11. package/dist/src/emitUtil.js.map +1 -1
  12. package/dist/src/index.d.ts.map +1 -1
  13. package/dist/src/index.js +41 -9
  14. package/dist/src/index.js.map +1 -1
  15. package/dist/src/lib.d.ts.map +1 -1
  16. package/dist/src/lib.js +2 -1
  17. package/dist/src/lib.js.map +1 -1
  18. package/dist/src/modelUtils.d.ts +22 -1
  19. package/dist/src/modelUtils.d.ts.map +1 -1
  20. package/dist/src/modelUtils.js +105 -13
  21. package/dist/src/modelUtils.js.map +1 -1
  22. package/dist/src/modular/buildApiIndex.d.ts +3 -0
  23. package/dist/src/modular/buildApiIndex.d.ts.map +1 -0
  24. package/dist/src/modular/buildApiIndex.js +12 -0
  25. package/dist/src/modular/buildApiIndex.js.map +1 -0
  26. package/dist/src/modular/buildClassicalClient.d.ts +4 -0
  27. package/dist/src/modular/buildClassicalClient.d.ts.map +1 -0
  28. package/dist/src/modular/buildClassicalClient.js +112 -0
  29. package/dist/src/modular/buildClassicalClient.js.map +1 -0
  30. package/dist/src/modular/buildClientContext.d.ts +7 -0
  31. package/dist/src/modular/buildClientContext.d.ts.map +1 -0
  32. package/dist/src/modular/buildClientContext.js +72 -0
  33. package/dist/src/modular/buildClientContext.js.map +1 -0
  34. package/dist/src/modular/buildCodeModel.d.ts +14 -0
  35. package/dist/src/modular/buildCodeModel.d.ts.map +1 -0
  36. package/dist/src/modular/buildCodeModel.js +1110 -0
  37. package/dist/src/modular/buildCodeModel.js.map +1 -0
  38. package/dist/src/modular/buildOperations.d.ts +13 -0
  39. package/dist/src/modular/buildOperations.d.ts.map +1 -0
  40. package/dist/src/modular/buildOperations.js +70 -0
  41. package/dist/src/modular/buildOperations.js.map +1 -0
  42. package/dist/src/modular/buildProjectFiles.d.ts +5 -0
  43. package/dist/src/modular/buildProjectFiles.d.ts.map +1 -0
  44. package/dist/src/modular/buildProjectFiles.js +182 -0
  45. package/dist/src/modular/buildProjectFiles.js.map +1 -0
  46. package/dist/src/modular/buildRootIndex.d.ts +4 -0
  47. package/dist/src/modular/buildRootIndex.d.ts.map +1 -0
  48. package/dist/src/modular/buildRootIndex.js +66 -0
  49. package/dist/src/modular/buildRootIndex.js.map +1 -0
  50. package/dist/src/modular/buildSharedTypes.d.ts +6 -0
  51. package/dist/src/modular/buildSharedTypes.d.ts.map +1 -0
  52. package/dist/src/modular/buildSharedTypes.js +33 -0
  53. package/dist/src/modular/buildSharedTypes.js.map +1 -0
  54. package/dist/src/modular/emitModels.d.ts +7 -0
  55. package/dist/src/modular/emitModels.d.ts.map +1 -0
  56. package/dist/src/modular/emitModels.js +63 -0
  57. package/dist/src/modular/emitModels.js.map +1 -0
  58. package/dist/src/modular/helpers/clientHelpers.d.ts +4 -0
  59. package/dist/src/modular/helpers/clientHelpers.d.ts.map +1 -0
  60. package/dist/src/modular/helpers/clientHelpers.js +31 -0
  61. package/dist/src/modular/helpers/clientHelpers.js.map +1 -0
  62. package/dist/src/modular/helpers/credentialHelpers.d.ts +7 -0
  63. package/dist/src/modular/helpers/credentialHelpers.d.ts.map +1 -0
  64. package/dist/src/modular/helpers/credentialHelpers.js +32 -0
  65. package/dist/src/modular/helpers/credentialHelpers.js.map +1 -0
  66. package/dist/src/modular/helpers/namingHelpers.d.ts +3 -0
  67. package/dist/src/modular/helpers/namingHelpers.d.ts.map +1 -0
  68. package/dist/src/modular/helpers/namingHelpers.js +4 -0
  69. package/dist/src/modular/helpers/namingHelpers.js.map +1 -0
  70. package/dist/src/modular/helpers/operationHelpers.d.ts +8 -0
  71. package/dist/src/modular/helpers/operationHelpers.d.ts.map +1 -0
  72. package/dist/src/modular/helpers/operationHelpers.js +274 -0
  73. package/dist/src/modular/helpers/operationHelpers.js.map +1 -0
  74. package/dist/src/modular/helpers/parameterHelpers.d.ts +3 -0
  75. package/dist/src/modular/helpers/parameterHelpers.d.ts.map +1 -0
  76. package/dist/src/modular/helpers/parameterHelpers.js +16 -0
  77. package/dist/src/modular/helpers/parameterHelpers.js.map +1 -0
  78. package/dist/src/modular/helpers/typeHelpers.d.ts +16 -0
  79. package/dist/src/modular/helpers/typeHelpers.d.ts.map +1 -0
  80. package/dist/src/modular/helpers/typeHelpers.js +92 -0
  81. package/dist/src/modular/helpers/typeHelpers.js.map +1 -0
  82. package/dist/src/modular/interfaces.d.ts +10 -0
  83. package/dist/src/modular/interfaces.d.ts.map +1 -0
  84. package/dist/src/modular/interfaces.js +2 -0
  85. package/dist/src/modular/interfaces.js.map +1 -0
  86. package/dist/src/modular/modularCodeModel.d.ts +121 -0
  87. package/dist/src/modular/modularCodeModel.d.ts.map +1 -0
  88. package/dist/src/modular/modularCodeModel.js +2 -0
  89. package/dist/src/modular/modularCodeModel.js.map +1 -0
  90. package/dist/src/operationUtil.d.ts +30 -4
  91. package/dist/src/operationUtil.d.ts.map +1 -1
  92. package/dist/src/operationUtil.js +77 -18
  93. package/dist/src/operationUtil.js.map +1 -1
  94. package/dist/src/transform/transform.d.ts +4 -6
  95. package/dist/src/transform/transform.d.ts.map +1 -1
  96. package/dist/src/transform/transform.js +17 -58
  97. package/dist/src/transform/transform.js.map +1 -1
  98. package/dist/src/transform/transformApiVersionInfo.d.ts +5 -0
  99. package/dist/src/transform/transformApiVersionInfo.d.ts.map +1 -0
  100. package/dist/src/transform/transformApiVersionInfo.js +64 -0
  101. package/dist/src/transform/transformApiVersionInfo.js.map +1 -0
  102. package/dist/src/transform/transformHelperFunctionDetails.d.ts +6 -0
  103. package/dist/src/transform/transformHelperFunctionDetails.d.ts.map +1 -0
  104. package/dist/src/transform/{transformAnnotationDetails.js → transformHelperFunctionDetails.js} +2 -2
  105. package/dist/src/transform/transformHelperFunctionDetails.js.map +1 -0
  106. package/dist/src/transform/transformParameters.d.ts +2 -2
  107. package/dist/src/transform/transformParameters.d.ts.map +1 -1
  108. package/dist/src/transform/transformParameters.js +20 -7
  109. package/dist/src/transform/transformParameters.js.map +1 -1
  110. package/dist/src/transform/transformPaths.d.ts +2 -2
  111. package/dist/src/transform/transformPaths.d.ts.map +1 -1
  112. package/dist/src/transform/transformPaths.js +15 -7
  113. package/dist/src/transform/transformPaths.js.map +1 -1
  114. package/dist/src/transform/transformResponses.d.ts +2 -2
  115. package/dist/src/transform/transformResponses.d.ts.map +1 -1
  116. package/dist/src/transform/transformResponses.js +23 -2
  117. package/dist/src/transform/transformResponses.js.map +1 -1
  118. package/dist/src/transform/transformSchemas.d.ts +2 -2
  119. package/dist/src/transform/transformSchemas.d.ts.map +1 -1
  120. package/dist/src/transform/transformSchemas.js +10 -22
  121. package/dist/src/transform/transformSchemas.js.map +1 -1
  122. package/dist/src/transform/transfromRLCOptions.d.ts +2 -2
  123. package/dist/src/transform/transfromRLCOptions.js +1 -1
  124. package/dist/src/transform/transfromRLCOptions.js.map +1 -1
  125. package/dist/tsconfig.tsbuildinfo +1 -1
  126. package/package.json +27 -19
  127. package/src/casingUtils.ts +48 -0
  128. package/src/emitUtil.ts +9 -4
  129. package/src/index.ts +53 -10
  130. package/src/lib.ts +2 -1
  131. package/src/modelUtils.ts +137 -14
  132. package/src/modular/buildApiIndex.ts +13 -0
  133. package/src/modular/buildClassicalClient.ts +147 -0
  134. package/src/modular/buildClientContext.ts +104 -0
  135. package/src/modular/buildCodeModel.ts +1449 -0
  136. package/src/modular/buildOperations.ts +95 -0
  137. package/src/modular/buildProjectFiles.ts +219 -0
  138. package/src/modular/buildRootIndex.ts +94 -0
  139. package/src/modular/buildSharedTypes.ts +40 -0
  140. package/src/modular/emitModels.ts +72 -0
  141. package/src/modular/helpers/clientHelpers.ts +38 -0
  142. package/src/modular/helpers/credentialHelpers.ts +40 -0
  143. package/src/modular/helpers/namingHelpers.ts +5 -0
  144. package/src/modular/helpers/operationHelpers.ts +418 -0
  145. package/src/modular/helpers/parameterHelpers.ts +17 -0
  146. package/src/modular/helpers/typeHelpers.ts +106 -0
  147. package/src/modular/interfaces.ts +10 -0
  148. package/src/modular/modularCodeModel.ts +151 -0
  149. package/src/modular/static/karma.conf.cjs +120 -0
  150. package/src/modular/static/rollup.test.config.js +67 -0
  151. package/src/modular/static/scripts/renameOutput.mjs +17 -0
  152. package/src/operationUtil.ts +119 -31
  153. package/src/transform/transform.ts +33 -96
  154. package/src/transform/transformApiVersionInfo.ts +108 -0
  155. package/src/transform/{transformAnnotationDetails.ts → transformHelperFunctionDetails.ts} +11 -11
  156. package/src/transform/transformParameters.ts +30 -14
  157. package/src/transform/transformPaths.ts +29 -19
  158. package/src/transform/transformResponses.ts +50 -8
  159. package/src/transform/transformSchemas.ts +20 -28
  160. package/src/transform/transfromRLCOptions.ts +3 -3
  161. package/test/commands/cadl-ranch-list.ts +53 -20
  162. package/test/commands/gen-cadl-ranch.ts +6 -2
  163. package/test/commands/run.ts +3 -13
  164. package/test/integration/arrayItemTypes.spec.ts +6 -3
  165. package/test/integration/azurecore.spec.ts +130 -0
  166. package/test/integration/collectionFormat.spec.ts +118 -0
  167. package/test/integration/dictionary.spec.ts +6 -2
  168. package/test/integration/extensibleEnums.spec.ts +8 -8
  169. package/test/integration/fixedEnums.spec.ts +7 -7
  170. package/test/integration/generated/arrays/itemTypes/src/clientDefinitions.ts +33 -18
  171. package/test/integration/generated/arrays/itemTypes/src/parameters.ts +8 -0
  172. package/test/integration/generated/arrays/itemTypes/src/responses.ts +11 -0
  173. package/test/integration/generated/arrays/itemTypes/tspconfig.yaml +5 -2
  174. package/test/integration/generated/authentication/apiKey/package.json +2 -2
  175. package/test/integration/generated/authentication/apiKey/tspconfig.yaml +5 -2
  176. package/test/integration/generated/authentication/oauth2/tspconfig.yaml +5 -2
  177. package/test/integration/generated/authentication/union/tspconfig.yaml +5 -2
  178. package/test/integration/generated/{resiliency/devDriven → azure/core}/README.md +7 -7
  179. package/test/integration/generated/{lro/lroBasic → azure/core}/api-extractor.json +1 -1
  180. package/test/integration/generated/{resiliency/devDriven → azure/core}/package.json +6 -6
  181. package/test/integration/generated/azure/core/src/azureCoreClient.ts +31 -0
  182. package/test/integration/generated/azure/core/src/clientDefinitions.ts +108 -0
  183. package/test/integration/generated/{resiliency/devDriven → azure/core}/src/index.ts +4 -3
  184. package/test/integration/generated/azure/core/src/isUnexpected.ts +178 -0
  185. package/test/integration/generated/azure/core/src/models.ts +18 -0
  186. package/test/integration/generated/azure/core/src/outputModels.ts +32 -0
  187. package/test/integration/generated/{resiliency/devDriven → azure/core}/src/paginateHelper.ts +55 -5
  188. package/test/integration/generated/azure/core/src/parameters.ts +68 -0
  189. package/test/integration/generated/azure/core/src/responses.ts +158 -0
  190. package/test/integration/generated/azure/core/src/serializeHelper.ts +16 -0
  191. package/test/integration/generated/azure/core/tspconfig.yaml +15 -0
  192. package/test/integration/generated/azure/core-traits/README.md +56 -0
  193. package/test/integration/generated/azure/core-traits/api-extractor.json +18 -0
  194. package/test/integration/generated/azure/core-traits/package.json +80 -0
  195. package/test/integration/generated/azure/core-traits/src/azureCoreTraitsClient.ts +31 -0
  196. package/test/integration/generated/azure/core-traits/src/clientDefinitions.ts +22 -0
  197. package/test/integration/generated/azure/core-traits/src/index.ts +13 -0
  198. package/test/integration/generated/{resiliency/devDriven → azure/core-traits}/src/isUnexpected.ts +6 -26
  199. package/test/integration/generated/azure/core-traits/src/outputModels.ts +10 -0
  200. package/test/integration/generated/azure/core-traits/src/parameters.ts +26 -0
  201. package/test/integration/generated/azure/core-traits/src/responses.ts +32 -0
  202. package/test/integration/generated/azure/core-traits/tspconfig.yaml +15 -0
  203. package/test/integration/generated/dictionary/package.json +2 -2
  204. package/test/integration/generated/dictionary/src/clientDefinitions.ts +35 -20
  205. package/test/integration/generated/dictionary/src/parameters.ts +8 -0
  206. package/test/integration/generated/dictionary/src/responses.ts +11 -0
  207. package/test/integration/generated/dictionary/tspconfig.yaml +5 -2
  208. package/test/integration/generated/enums/extensible/README.md +3 -3
  209. package/test/integration/generated/enums/extensible/package.json +2 -2
  210. package/test/integration/generated/enums/extensible/src/clientDefinitions.ts +5 -5
  211. package/test/integration/generated/enums/extensible/src/index.ts +3 -3
  212. package/test/integration/generated/enums/extensible/src/{enumsExtensible.ts → typeEnumExtensible.ts} +4 -4
  213. package/test/integration/generated/enums/extensible/tspconfig.yaml +5 -2
  214. package/test/integration/generated/enums/fixed/README.md +3 -3
  215. package/test/integration/generated/enums/fixed/package.json +2 -2
  216. package/test/integration/generated/enums/fixed/src/clientDefinitions.ts +5 -5
  217. package/test/integration/generated/enums/fixed/src/index.ts +3 -3
  218. package/test/integration/generated/enums/fixed/src/{enumsFixed.ts → typeEnumFixed.ts} +4 -4
  219. package/test/integration/generated/enums/fixed/tspconfig.yaml +5 -2
  220. package/test/integration/generated/hello/package.json +2 -2
  221. package/test/integration/generated/hello/tspconfig.yaml +5 -2
  222. package/test/integration/generated/internal/src/clientDefinitions.ts +27 -0
  223. package/test/integration/generated/internal/src/index.ts +13 -0
  224. package/test/integration/generated/{lro/lroBasic/src/azureLro.ts → internal/src/internalClient.ts} +5 -5
  225. package/test/integration/generated/internal/src/models.ts +8 -0
  226. package/test/integration/generated/internal/src/outputModels.ts +13 -0
  227. package/test/integration/generated/internal/src/parameters.ts +21 -0
  228. package/test/integration/generated/internal/src/responses.ts +20 -0
  229. package/test/integration/generated/internal/tspconfig.yaml +14 -0
  230. package/test/integration/generated/lro/lroCore/.eslintrc.json +11 -0
  231. package/test/integration/generated/lro/lroCore/README.md +56 -0
  232. package/test/integration/generated/{resiliency/devDriven → lro/lroCore}/api-extractor.json +1 -1
  233. package/test/integration/generated/lro/{lroBasic → lroCore}/package.json +6 -6
  234. package/test/integration/generated/lro/lroCore/rollup.config.js +118 -0
  235. package/test/integration/generated/lro/lroCore/src/clientDefinitions.ts +54 -0
  236. package/test/integration/generated/lro/lroCore/src/index.ts +15 -0
  237. package/test/integration/generated/lro/lroCore/src/isUnexpected.ts +135 -0
  238. package/test/integration/generated/lro/lroCore/src/models.ts +8 -0
  239. package/test/integration/generated/lro/lroCore/src/outputModels.ts +50 -0
  240. package/test/integration/generated/lro/lroCore/src/parameters.ts +25 -0
  241. package/test/integration/generated/lro/{lroBasic → lroCore}/src/pollingHelper.ts +38 -0
  242. package/test/integration/generated/lro/lroCore/src/responses.ts +109 -0
  243. package/test/integration/generated/lro/lroCore/src/specsAzureCoreLroStandard.ts +31 -0
  244. package/test/integration/generated/lro/lroCore/tsconfig.json +25 -0
  245. package/test/integration/generated/lro/lroCore/tspconfig.yaml +14 -0
  246. package/test/integration/generated/lro/lroRPC/.eslintrc.json +11 -0
  247. package/test/integration/generated/lro/{lroBasic → lroRPC}/README.md +7 -7
  248. package/test/integration/generated/lro/lroRPC/api-extractor.json +18 -0
  249. package/test/integration/generated/lro/lroRPC/package.json +82 -0
  250. package/test/integration/generated/lro/lroRPC/rollup.config.js +118 -0
  251. package/test/integration/generated/lro/lroRPC/src/clientDefinitions.ts +79 -0
  252. package/test/integration/generated/lro/lroRPC/src/index.ts +15 -0
  253. package/test/integration/generated/lro/lroRPC/src/isUnexpected.ts +153 -0
  254. package/test/integration/generated/lro/lroRPC/src/models.ts +8 -0
  255. package/test/integration/generated/lro/lroRPC/src/outputModels.ts +40 -0
  256. package/test/integration/generated/lro/lroRPC/src/parameters.ts +20 -0
  257. package/test/integration/generated/lro/lroRPC/src/pollingHelper.ts +127 -0
  258. package/test/integration/generated/lro/lroRPC/src/responses.ts +124 -0
  259. package/test/integration/generated/lro/lroRPC/src/specsAzureCoreLroRpc.ts +31 -0
  260. package/test/integration/generated/lro/lroRPC/tsconfig.json +25 -0
  261. package/test/integration/generated/lro/lroRPC/tspconfig.yaml +14 -0
  262. package/test/integration/generated/models/inheritance/README.md +3 -3
  263. package/test/integration/generated/models/inheritance/package.json +2 -2
  264. package/test/integration/generated/models/inheritance/src/clientDefinitions.ts +13 -11
  265. package/test/integration/generated/models/inheritance/src/index.ts +3 -3
  266. package/test/integration/generated/models/inheritance/src/{modelsInheritance.ts → typeModelInheritance.ts} +4 -4
  267. package/test/integration/generated/models/inheritance/tspconfig.yaml +5 -2
  268. package/test/integration/generated/models/propertyNullable/.eslintrc.json +11 -0
  269. package/test/integration/generated/models/propertyNullable/README.md +56 -0
  270. package/test/integration/generated/models/propertyNullable/api-extractor.json +18 -0
  271. package/test/integration/generated/models/propertyNullable/package.json +80 -0
  272. package/test/integration/generated/models/propertyNullable/rollup.config.js +118 -0
  273. package/test/integration/generated/models/propertyNullable/src/clientDefinitions.ts +227 -0
  274. package/test/integration/generated/models/propertyNullable/src/index.ts +13 -0
  275. package/test/integration/generated/models/propertyNullable/src/models.ts +56 -0
  276. package/test/integration/generated/models/propertyNullable/src/outputModels.ts +56 -0
  277. package/test/integration/generated/models/propertyNullable/src/parameters.ts +197 -0
  278. package/test/integration/generated/models/propertyNullable/src/responses.ts +144 -0
  279. package/test/integration/generated/{resiliency/devDriven/src/resiliencyDevDriven.ts → models/propertyNullable/src/typePropertyNullable.ts} +5 -5
  280. package/test/integration/generated/models/propertyNullable/tsconfig.json +25 -0
  281. package/test/integration/generated/models/propertyNullable/tspconfig.yaml +14 -0
  282. package/test/integration/generated/models/propertyOptional/README.md +3 -3
  283. package/test/integration/generated/models/propertyOptional/package.json +2 -2
  284. package/test/integration/generated/models/propertyOptional/src/clientDefinitions.ts +47 -47
  285. package/test/integration/generated/models/propertyOptional/src/index.ts +3 -3
  286. package/test/integration/generated/models/propertyOptional/src/parameters.ts +7 -6
  287. package/test/integration/generated/models/propertyOptional/src/responses.ts +4 -4
  288. package/test/integration/generated/models/propertyOptional/src/{modelsPropertyOptional.ts → typePropertyOptional.ts} +4 -4
  289. package/test/integration/generated/models/propertyOptional/tspconfig.yaml +5 -2
  290. package/test/integration/generated/models/propertyTypes/README.md +3 -3
  291. package/test/integration/generated/models/propertyTypes/package.json +2 -2
  292. package/test/integration/generated/models/propertyTypes/src/clientDefinitions.ts +55 -47
  293. package/test/integration/generated/models/propertyTypes/src/index.ts +3 -3
  294. package/test/integration/generated/models/propertyTypes/src/parameters.ts +8 -6
  295. package/test/integration/generated/models/propertyTypes/src/responses.ts +4 -4
  296. package/test/integration/generated/models/propertyTypes/src/{modelsPropertyTypes.ts → typePropertyValueTypes.ts} +4 -4
  297. package/test/integration/generated/models/propertyTypes/tspconfig.yaml +5 -2
  298. package/test/integration/generated/models/usage/README.md +3 -3
  299. package/test/integration/generated/models/usage/package.json +2 -2
  300. package/test/integration/generated/models/usage/src/clientDefinitions.ts +7 -7
  301. package/test/integration/generated/models/usage/src/index.ts +3 -3
  302. package/test/integration/generated/models/usage/src/{modelsUsage.ts → typeModelUsage.ts} +4 -4
  303. package/test/integration/generated/models/usage/tspconfig.yaml +5 -2
  304. package/test/integration/generated/models/visibility/README.md +3 -3
  305. package/test/integration/generated/models/visibility/package.json +2 -2
  306. package/test/integration/generated/models/visibility/src/clientDefinitions.ts +3 -3
  307. package/test/integration/generated/models/visibility/src/index.ts +3 -3
  308. package/test/integration/generated/models/visibility/src/{modelsVisibilityAutomatic.ts → typeModelVisibility.ts} +4 -4
  309. package/test/integration/generated/models/visibility/tspconfig.yaml +5 -2
  310. package/test/integration/generated/parameters/collection-format/src/clientDefinitions.ts +63 -0
  311. package/test/integration/generated/parameters/collection-format/src/collectionFormatClient.ts +31 -0
  312. package/test/integration/generated/parameters/collection-format/src/index.ts +12 -0
  313. package/test/integration/generated/parameters/collection-format/src/parameters.ts +71 -0
  314. package/test/integration/generated/parameters/collection-format/src/responses.ts +34 -0
  315. package/test/integration/generated/parameters/collection-format/src/serializeHelper.ts +28 -0
  316. package/test/integration/generated/parameters/collection-format/tspconfig.yaml +14 -0
  317. package/test/integration/generated/parameters/spread/src/clientDefinitions.ts +61 -0
  318. package/test/integration/generated/{lro/lroBasic → parameters/spread}/src/index.ts +4 -4
  319. package/test/integration/generated/parameters/spread/src/models.ts +7 -0
  320. package/test/integration/generated/parameters/spread/src/parameters.ts +61 -0
  321. package/test/integration/generated/parameters/spread/src/parametersSpread.ts +31 -0
  322. package/test/integration/generated/parameters/spread/src/responses.ts +25 -0
  323. package/test/integration/generated/parameters/spread/tspconfig.yaml +12 -0
  324. package/test/integration/generated/projection/src/clientDefinitions.ts +71 -0
  325. package/test/integration/generated/projection/src/index.ts +12 -0
  326. package/test/integration/generated/projection/src/models.ts +22 -0
  327. package/test/integration/generated/projection/src/parameters.ts +48 -0
  328. package/test/integration/generated/projection/src/projectionClient.ts +31 -0
  329. package/test/integration/generated/projection/src/responses.ts +34 -0
  330. package/test/integration/generated/projection/tspconfig.yaml +14 -0
  331. package/test/integration/generated/resiliency/srvDriven1/README.md +4 -4
  332. package/test/integration/generated/resiliency/srvDriven1/package.json +2 -2
  333. package/test/integration/generated/resiliency/srvDriven1/src/clientDefinitions.ts +25 -49
  334. package/test/integration/generated/resiliency/srvDriven1/src/index.ts +3 -5
  335. package/test/integration/generated/resiliency/srvDriven1/src/parameters.ts +11 -32
  336. package/test/integration/generated/resiliency/srvDriven1/src/responses.ts +9 -24
  337. package/test/integration/generated/resiliency/srvDriven1/src/serviceDrivenOldClient.ts +39 -0
  338. package/test/integration/generated/resiliency/srvDriven1/tspconfig.yaml +6 -2
  339. package/test/integration/generated/resiliency/srvDriven2/README.md +13 -4
  340. package/test/integration/generated/resiliency/srvDriven2/package.json +2 -2
  341. package/test/integration/generated/resiliency/srvDriven2/src/clientDefinitions.ts +32 -68
  342. package/test/integration/generated/resiliency/srvDriven2/src/index.ts +3 -5
  343. package/test/integration/generated/resiliency/srvDriven2/src/parameters.ts +19 -42
  344. package/test/integration/generated/resiliency/srvDriven2/src/responses.ts +10 -31
  345. package/test/integration/generated/resiliency/srvDriven2/src/serviceDrivenNewClient.ts +39 -0
  346. package/test/integration/generated/resiliency/srvDriven2/tspconfig.yaml +6 -2
  347. package/test/integration/generated/server/path/multiple/src/clientDefinitions.ts +35 -0
  348. package/test/integration/generated/server/path/multiple/src/index.ts +11 -0
  349. package/test/integration/generated/server/path/multiple/src/multipleParamInServerPathClient.ts +39 -0
  350. package/test/integration/generated/server/path/multiple/src/parameters.ts +7 -0
  351. package/test/integration/generated/server/path/multiple/src/responses.ts +14 -0
  352. package/test/integration/generated/server/path/multiple/tspconfig.yaml +14 -0
  353. package/test/integration/generated/server/path/single/src/clientDefinitions.ts +19 -0
  354. package/test/integration/generated/server/path/single/src/index.ts +11 -0
  355. package/test/integration/generated/server/path/single/src/parameters.ts +6 -0
  356. package/test/integration/generated/server/path/single/src/responses.ts +9 -0
  357. package/test/integration/generated/server/path/single/src/singleParamInServerPathClient.ts +34 -0
  358. package/test/integration/generated/server/path/single/tspconfig.yaml +14 -0
  359. package/test/integration/generated/specialWords/tspconfig.yaml +5 -2
  360. package/test/integration/generated/unions/src/clientDefinitions.ts +8 -8
  361. package/test/integration/generated/unions/tspconfig.yaml +5 -2
  362. package/test/integration/internal.spec.ts +43 -0
  363. package/test/integration/lroCore.spec.ts +89 -0
  364. package/test/integration/modelInheritance.spec.ts +13 -13
  365. package/test/integration/modelPropertyNullable.spec.ts +115 -0
  366. package/test/integration/modelPropertyOptional.spec.ts +32 -32
  367. package/test/integration/modelPropertyType.spec.ts +6 -6
  368. package/test/integration/modelUsage.spec.ts +7 -7
  369. package/test/integration/projection.spec.ts +102 -0
  370. package/test/integration/resiliencyDpgCustomization.spec.ts +69 -35
  371. package/test/integration/server.spec.ts +59 -0
  372. package/test/integration/spreadParameters.spec.ts +82 -0
  373. package/test/integration/unions.spec.ts +4 -4
  374. package/test/unit/apiVersion.spec.ts +388 -0
  375. package/test/unit/clientFactoryGenerator.spec.ts +0 -131
  376. package/test/unit/modelsGenerator.spec.ts +2 -2
  377. package/test/unit/parametersGenerator.spec.ts +1 -1
  378. package/test/unit/responsesGenerator.spec.ts +1 -1
  379. package/test/unit/util/emitUtil.ts +6 -5
  380. package/test/unit/util/testUtil.ts +3 -3
  381. package/dist/src/transform/transformAnnotationDetails.d.ts +0 -6
  382. package/dist/src/transform/transformAnnotationDetails.d.ts.map +0 -1
  383. package/dist/src/transform/transformAnnotationDetails.js.map +0 -1
  384. package/dist/src/transform/transformApiVersionParam.d.ts +0 -5
  385. package/dist/src/transform/transformApiVersionParam.d.ts.map +0 -1
  386. package/dist/src/transform/transformApiVersionParam.js +0 -76
  387. package/dist/src/transform/transformApiVersionParam.js.map +0 -1
  388. package/src/transform/transformApiVersionParam.ts +0 -104
  389. package/test/integration/generated/lro/lroBasic/src/clientDefinitions.ts +0 -37
  390. package/test/integration/generated/lro/lroBasic/src/parameters.ts +0 -8
  391. package/test/integration/generated/lro/lroBasic/src/responses.ts +0 -22
  392. package/test/integration/generated/lro/lroBasic/tspconfig.yaml +0 -11
  393. package/test/integration/generated/resiliency/devDriven/src/clientDefinitions.ts +0 -75
  394. package/test/integration/generated/resiliency/devDriven/src/models.ts +0 -8
  395. package/test/integration/generated/resiliency/devDriven/src/outputModels.ts +0 -25
  396. package/test/integration/generated/resiliency/devDriven/src/parameters.ts +0 -17
  397. package/test/integration/generated/resiliency/devDriven/src/responses.ts +0 -62
  398. package/test/integration/generated/resiliency/devDriven/tspconfig.yaml +0 -11
  399. package/test/integration/generated/resiliency/srvDriven1/src/models.ts +0 -6
  400. package/test/integration/generated/resiliency/srvDriven1/src/outputModels.ts +0 -6
  401. package/test/integration/generated/resiliency/srvDriven1/src/resiliencyServiceDriven1.ts +0 -31
  402. package/test/integration/generated/resiliency/srvDriven2/src/models.ts +0 -6
  403. package/test/integration/generated/resiliency/srvDriven2/src/outputModels.ts +0 -6
  404. package/test/integration/generated/resiliency/srvDriven2/src/resiliencyServiceDriven2.ts +0 -31
  405. package/test/integration/helloWorld.spec.ts +0 -20
  406. package/test/integration/lroBasic.spec.ts +0 -25
  407. /package/test/integration/generated/{resiliency/devDriven → azure/core}/.eslintrc.json +0 -0
  408. /package/test/integration/generated/{resiliency/devDriven → azure/core}/rollup.config.js +0 -0
  409. /package/test/integration/generated/{resiliency/devDriven → azure/core}/tsconfig.json +0 -0
  410. /package/test/integration/generated/{lro/lroBasic → azure/core-traits}/.eslintrc.json +0 -0
  411. /package/test/integration/generated/{lro/lroBasic → azure/core-traits}/rollup.config.js +0 -0
  412. /package/test/integration/generated/{lro/lroBasic → azure/core-traits}/tsconfig.json +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@azure-tools/typespec-ts",
3
- "version": "0.11.0",
3
+ "version": "0.12.0-alpha.20230501.1",
4
4
  "description": "An experimental CADL emitter for TypeScript RLC",
5
5
  "main": "dist/src/index.js",
6
6
  "type": "module",
@@ -14,11 +14,12 @@
14
14
  "check-format": "npm run prettier -- --check",
15
15
  "prettier": "prettier --config ./.prettierrc src/**/*.ts",
16
16
  "check:tree": "ts-node ./test/commands/check-clean-tree.ts",
17
- "integration-test-ci": "npm run start-test-server & npm run generate-and-run",
17
+ "integration-test-ci": "npm run start-test-server & npm run copy:typespec && npm run generate-and-run",
18
18
  "start-test-server": "mkdirp -p coverage && npx cadl-ranch serve ./node_modules/@azure-tools/cadl-ranch-specs/http --coverageFile ./coverage/cadl-ranch-coverage-typescript.json",
19
+ "copy:typespec": "rm -rf temp && mkdirp -p temp && cp -r ./node_modules/@azure-tools/cadl-ranch-specs/http ./temp",
19
20
  "generate-and-run": "npm run generate-cadl-only && npm run integration-test:alone && npm run stop-test-server",
20
21
  "generate-cadl-only": "ts-node ./test/commands/gen-cadl-ranch.ts",
21
- "integration-test:alone": "cross-env TS_NODE_PROJECT=tsconfig.test.json mocha -r ts-node/register --experimental-specifier-resolution=node --timeout 2000 ./test/integration/*.spec.ts",
22
+ "integration-test:alone": "cross-env TS_NODE_PROJECT=tsconfig.test.json mocha -r ts-node/register --experimental-specifier-resolution=node --timeout 4000 ./test/integration/*.spec.ts",
22
23
  "stop-test-server": "npx cadl-ranch server stop",
23
24
  "unit-test": "cross-env TS_NODE_PROJECT=tsconfig.json mocha -r ts-node/register --experimental-specifier-resolution=node --experimental-modules=true './test/unit/**/*.spec.ts'"
24
25
  },
@@ -30,23 +31,23 @@
30
31
  "@types/node": "^18.0.0",
31
32
  "@types/prettier": "^2.6.0",
32
33
  "@types/fs-extra": "^9.0.13",
33
- "@typescript-eslint/eslint-plugin": "^5.12.1",
34
- "@typescript-eslint/parser": "^5.12.1",
35
- "@typespec/http": "~0.42.0",
34
+ "@typescript-eslint/eslint-plugin": "^5.58.0",
35
+ "@typescript-eslint/parser": "^5.58.0",
36
+ "@typespec/http": "~0.43.1",
36
37
  "chai": "^4.3.6",
37
38
  "mkdirp": "^2.1.2",
38
39
  "eslint": "^8.9.0",
39
40
  "mocha": "^9.2.2",
40
41
  "rimraf": "^3.0.2",
41
42
  "ts-node": "^10.9.1",
42
- "typescript": "~4.8.0",
43
+ "typescript": "~5.0.0",
43
44
  "prettier": "~2.7.1",
44
- "@azure-tools/cadl-ranch-specs": "~0.9.0",
45
- "@typespec/versioning": "~0.42.0",
46
- "@azure-tools/cadl-ranch-expect": "^0.2.0",
47
- "@azure-tools/cadl-ranch": "~0.4.0",
45
+ "@azure-tools/cadl-ranch-specs": "~0.14.2",
46
+ "@typespec/versioning": "~0.43.0",
47
+ "@azure-tools/cadl-ranch-expect": "^0.2.3",
48
+ "@azure-tools/cadl-ranch": "~0.4.6",
48
49
  "chalk": "^4.0.0",
49
- "@azure-rest/core-client": "^1.1.0",
50
+ "@azure-rest/core-client": "^1.1.2",
50
51
  "@azure/core-auth": "^1.3.2",
51
52
  "cross-env": "^7.0.3",
52
53
  "@azure/core-paging": "^1.5.0",
@@ -54,20 +55,27 @@
54
55
  "@azure/core-rest-pipeline": "^1.9.2"
55
56
  },
56
57
  "dependencies": {
57
- "@typespec/compiler": "~0.42.0",
58
- "@azure-tools/typespec-azure-core": "~0.28.0",
59
- "@typespec/rest": "~0.42.0",
58
+ "@typespec/compiler": "~0.43.0",
59
+ "@azure-tools/typespec-azure-core": "~0.29.0",
60
+ "@typespec/rest": "~0.43.0",
60
61
  "prettier": "^2.6.1",
61
62
  "tslib": "^2.3.1",
62
- "@azure-tools/rlc-common": "^0.11.0",
63
+ "@azure-tools/rlc-common": "^0.12.0",
63
64
  "ts-morph": "^15.1.0",
64
- "@azure-tools/typespec-client-generator-core": "~0.28.0",
65
- "fs-extra": "^11.1.0"
65
+ "@azure-tools/typespec-client-generator-core": "~0.29.0",
66
+ "fs-extra": "^11.1.0",
67
+ "@typespec/openapi": "0.43.0",
68
+ "@typespec/openapi3": "0.43.0",
69
+ "@azure-tools/typespec-autorest": "~0.29.0"
66
70
  },
67
71
  "mocha": {
68
72
  "extension": [
69
73
  "ts"
70
74
  ],
71
75
  "loader": "ts-node/esm"
72
- }
76
+ },
77
+ "bugs": {
78
+ "url": "https://github.com/Azure/autorest.typescript/issues"
79
+ },
80
+ "homepage": "https://github.com/Azure/autorest.typescript/tree/main/packages/typespec-ts/"
73
81
  }
@@ -0,0 +1,48 @@
1
+ export function toCamelCase(name: string): string {
2
+ let str = name;
3
+ // Handle snake case or dash-separated words
4
+ str = str.replace(/[-_]+/g, " ");
5
+
6
+ // Handle pascal case or camel case
7
+ str = str.replace(/([a-z])([A-Z])/g, (_match, p1, p2) => {
8
+ return p1 + " " + p2.toLowerCase();
9
+ });
10
+
11
+ // Convert to camel case
12
+ str = str.replace(/\s(.)/g, (_match, p1) => {
13
+ return p1.toUpperCase();
14
+ });
15
+
16
+ // Lowercase the first character
17
+ return str.charAt(0).toLowerCase() + str.slice(1);
18
+ }
19
+
20
+ export function camelToSnakeCase(name: string): string {
21
+ const camelToSnakeCaseRe = (str: string) =>
22
+ str
23
+ .replace(/\s+/g, "_")
24
+ .replace(/\$/g, "")
25
+ .replace(/-/g, "_")
26
+ .replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
27
+
28
+ return camelToSnakeCaseRe(name[0]!.toLowerCase() + name.slice(1));
29
+ }
30
+
31
+ export function toPascalCase(name: string): string {
32
+ let str = name;
33
+ // Handle snake case or dash-separated words
34
+ str = str.replace(/[-_]+/g, " ");
35
+
36
+ // Handle pascal case or camel case
37
+ str = str.replace(/([a-z])([A-Z])/g, (_match, p1, p2) => {
38
+ return p1 + " " + p2.toLowerCase();
39
+ });
40
+
41
+ // Convert to camel case
42
+ str = str.replace(/\s(.)/g, (_match, p1) => {
43
+ return p1.toUpperCase();
44
+ });
45
+
46
+ // Lowercase the first character
47
+ return str.charAt(0).toUpperCase() + str.slice(1);
48
+ }
package/src/emitUtil.ts CHANGED
@@ -53,10 +53,15 @@ async function emitFile(
53
53
  }
54
54
  // Format the contents if necessary
55
55
  if (isJson || isSourceCode) {
56
- prettierFileContent = format(
57
- prettierFileContent,
58
- isJson ? prettierJSONOptions : prettierTypeScriptOptions
59
- );
56
+ try {
57
+ prettierFileContent = format(
58
+ prettierFileContent,
59
+ isJson ? prettierJSONOptions : prettierTypeScriptOptions
60
+ );
61
+ } catch (e) {
62
+ console.error(`Failed to format file: ${filePath}`);
63
+ throw e;
64
+ }
60
65
  }
61
66
  await host.mkdirp(dirname(filePath));
62
67
  await host.writeFile(filePath, prettierFileContent);
package/src/index.ts CHANGED
@@ -25,22 +25,33 @@ import {
25
25
  buildSampleTest,
26
26
  buildReadmeFile,
27
27
  buildSerializeHelper,
28
- RLCOptions,
29
- RLCModel
28
+ RLCOptions
30
29
  } from "@azure-tools/rlc-common";
31
30
  import { transformRLCModel } from "./transform/transform.js";
32
31
  import { emitContentByBuilder, emitModels } from "./emitUtil.js";
33
32
  import {
34
33
  listClients,
35
- createDpgContext
34
+ createSdkContext
36
35
  } from "@azure-tools/typespec-client-generator-core";
37
36
  import * as path from "path";
37
+ import { buildSharedTypes } from "./modular/buildSharedTypes.js";
38
+ import { Project } from "ts-morph";
39
+ import { buildClientContext } from "./modular/buildClientContext.js";
40
+ import { emitCodeModel } from "./modular/buildCodeModel.js";
41
+ import { buildRootIndex } from "./modular/buildRootIndex.js";
42
+ import { buildModels } from "./modular/emitModels.js";
43
+ import { buildOperationFiles } from "./modular/buildOperations.js";
44
+ import { buildApiIndexFile } from "./modular/buildApiIndex.js";
45
+ import { buildClassicalClient } from "./modular/buildClassicalClient.js";
46
+ import { emitPackage, emitTsConfig } from "./modular/buildProjectFiles.js";
47
+ // import { emitPackage, emitTsConfig } from "./modular/buildProjectFiles.js";
38
48
 
39
49
  export async function $onEmit(context: EmitContext) {
40
50
  const program: Program = context.program;
41
51
  const options: RLCOptions = context.options;
42
- const dpgContext = createDpgContext(context);
52
+ const dpgContext = createSdkContext(context);
43
53
  const clients = listClients(dpgContext);
54
+ const srcPath: string = context.emitterOutputDir;
44
55
  let count = -1;
45
56
  for (const client of clients) {
46
57
  count++;
@@ -51,7 +62,8 @@ export async function $onEmit(context: EmitContext) {
51
62
  context.emitterOutputDir,
52
63
  dpgContext
53
64
  );
54
- clearSrcFolder(rlcModels, count);
65
+ const pathToClear = options.isModularLibrary ? srcPath : rlcModels.srcPath;
66
+ clearSrcFolder(pathToClear, count, rlcModels?.options?.multiClient);
55
67
  await emitModels(rlcModels, program);
56
68
  await emitContentByBuilder(program, buildClientDefinitions, rlcModels);
57
69
  await emitContentByBuilder(program, buildResponseTypes, rlcModels);
@@ -70,10 +82,10 @@ export async function $onEmit(context: EmitContext) {
70
82
  [
71
83
  buildEsLintConfig,
72
84
  buildRollupConfig,
73
- buildTsConfig,
74
85
  buildApiExtractorConfig,
86
+ buildReadmeFile,
75
87
  buildPackageFile,
76
- buildReadmeFile
88
+ buildTsConfig
77
89
  ],
78
90
  rlcModels,
79
91
  context.emitterOutputDir
@@ -92,12 +104,43 @@ export async function $onEmit(context: EmitContext) {
92
104
  context.emitterOutputDir
93
105
  );
94
106
  }
107
+
108
+ if (options.isModularLibrary) {
109
+ // TODO: Emit modular parts of the library
110
+ const project = new Project();
111
+ const modularCodeModel = emitCodeModel(context, { casing: "camel" });
112
+
113
+ for (const client of modularCodeModel.clients) {
114
+ buildSharedTypes(project, srcPath);
115
+ buildClientContext(client, project, srcPath);
116
+ buildModels(modularCodeModel, project, srcPath);
117
+ buildOperationFiles(client, project, srcPath);
118
+ buildApiIndexFile(project, srcPath);
119
+ buildClassicalClient(client, project, srcPath);
120
+ buildRootIndex(client, project, srcPath);
121
+
122
+ emitPackage(project, srcPath, modularCodeModel);
123
+ emitTsConfig(project, srcPath, modularCodeModel);
124
+ }
125
+
126
+ for (const file of project.getSourceFiles()) {
127
+ await emitContentByBuilder(
128
+ program,
129
+ () => ({ content: file.getFullText(), path: file.getFilePath() }),
130
+ modularCodeModel as any
131
+ );
132
+ // emitFile(program, { content: hrlcClient.content, path: hrlcClient.path });
133
+ }
134
+ }
95
135
  }
96
136
 
97
- function clearSrcFolder(model: RLCModel, count: number) {
98
- const srcPath = model.srcPath;
137
+ function clearSrcFolder(
138
+ srcPath: string,
139
+ count: number,
140
+ isMultiClient: boolean = false
141
+ ) {
99
142
  fsextra.emptyDirSync(srcPath);
100
- if (model?.options?.multiClient && count === 0) {
143
+ if (isMultiClient && count === 0) {
101
144
  const folderPath = path.join(
102
145
  srcPath.substring(0, srcPath.indexOf(path.sep + "src") + 4)
103
146
  );
package/src/lib.ts CHANGED
@@ -70,7 +70,8 @@ export const RLCOptionsSchema: JSONSchemaType<RLCOptions> = {
70
70
  nullable: true
71
71
  },
72
72
  azureArm: { type: "boolean", nullable: true },
73
- sourceFrom: { type: "string", nullable: true }
73
+ sourceFrom: { type: "string", nullable: true },
74
+ isModularLibrary: { type: "boolean", nullable: true, default: false }
74
75
  },
75
76
  required: []
76
77
  };
package/src/modelUtils.ts CHANGED
@@ -27,13 +27,19 @@ import {
27
27
  isUnknownType,
28
28
  Model,
29
29
  ModelProperty,
30
- Program,
31
30
  Type,
32
31
  Union,
33
32
  isNullType,
34
33
  Scalar,
35
34
  UnionVariant,
36
- getProjectedName
35
+ getProjectedName,
36
+ StringLiteral,
37
+ BooleanLiteral,
38
+ NoTarget,
39
+ NumericLiteral,
40
+ Service,
41
+ listServices,
42
+ Program
37
43
  } from "@typespec/compiler";
38
44
  import { reportDiagnostic } from "./lib.js";
39
45
  import {
@@ -54,6 +60,11 @@ import {
54
60
  } from "@typespec/http";
55
61
  import { getPagedResult, isFixed } from "@azure-tools/typespec-azure-core";
56
62
  import { extractPagedMetadataNested } from "./operationUtil.js";
63
+ import {
64
+ SdkContext,
65
+ getDefaultApiVersion,
66
+ isApiVersion
67
+ } from "@azure-tools/typespec-client-generator-core";
57
68
 
58
69
  export function getBinaryType(usage: SchemaContext[]) {
59
70
  return usage.includes(SchemaContext.Output)
@@ -134,8 +145,9 @@ export function getEffectiveModelFromType(program: Program, type: Type): Type {
134
145
  export function includeDerivedModel(model: Model): boolean {
135
146
  return (
136
147
  !isTemplateDeclaration(model) &&
137
- (model.templateArguments === undefined ||
138
- model.templateArguments?.length === 0 ||
148
+ (!model.templateMapper ||
149
+ !model.templateMapper.args ||
150
+ model.templateMapper.args?.length === 0 ||
139
151
  model.derivedModels.length > 0)
140
152
  );
141
153
  }
@@ -342,12 +354,13 @@ function getSchemaForModel(
342
354
  let name = model.name;
343
355
  if (
344
356
  !overridedModelName &&
345
- model.templateArguments &&
346
- model.templateArguments.length > 0 &&
357
+ model.templateMapper &&
358
+ model.templateMapper.args &&
359
+ model.templateMapper.args.length > 0 &&
347
360
  getPagedResult(program, model)
348
361
  ) {
349
362
  name =
350
- model.templateArguments
363
+ model.templateMapper.args
351
364
  .map((it) => {
352
365
  switch (it.kind) {
353
366
  case "Model":
@@ -387,8 +400,8 @@ function getSchemaForModel(
387
400
  const paged = extractPagedMetadataNested(program, model);
388
401
  if (paged && paged.itemsProperty) {
389
402
  const items = paged.itemsProperty as unknown as Model;
390
- if (items && items.templateArguments) {
391
- const templateName = items.templateArguments
403
+ if (items && items.templateMapper && items.templateMapper.args) {
404
+ const templateName = items.templateMapper.args
392
405
  ?.map((it) => {
393
406
  switch (it.kind) {
394
407
  case "Model":
@@ -528,8 +541,9 @@ function getSchemaForModel(
528
541
  // templated type.
529
542
  if (
530
543
  model.baseModel &&
531
- model.baseModel.templateArguments &&
532
- model.baseModel.templateArguments.length > 0 &&
544
+ model.baseModel.templateMapper &&
545
+ model.baseModel.templateMapper.args &&
546
+ model.baseModel.templateMapper.args.length > 0 &&
533
547
  modelSchema.properties &&
534
548
  Object.keys(modelSchema.properties).length === 0
535
549
  ) {
@@ -845,7 +859,7 @@ function getSchemaForStdScalar(program: Program, cadlType: Scalar) {
845
859
  typeName: "Date | string",
846
860
  outputTypeName: "string"
847
861
  };
848
- case "zonedDateTime":
862
+ case "utcDateTime":
849
863
  return {
850
864
  type: "string",
851
865
  format: "date-time",
@@ -941,8 +955,9 @@ export function getBodyType(
941
955
  // response body type is reosurce type, and request body type (if templated) contains resource type
942
956
  if (
943
957
  bodyTypeInResponse === resourceType &&
944
- bodyModel.templateArguments &&
945
- bodyModel.templateArguments.some((it) => {
958
+ bodyModel.templateMapper &&
959
+ bodyModel.templateMapper.args &&
960
+ bodyModel.templateMapper.args.some((it) => {
946
961
  return it.kind === "Model" || it.kind === "Union"
947
962
  ? it === bodyTypeInResponse
948
963
  : false;
@@ -959,3 +974,111 @@ export function getBodyType(
959
974
  }
960
975
  return bodyModel;
961
976
  }
977
+
978
+ /**
979
+ * Predict if the default value exists in param, we would follow the rules:
980
+ * 1. If we have specific default literal in param
981
+ * 2. If we take the default api-version value into considerations
982
+ * @param program
983
+ * @param dpgContext
984
+ * @param param The param to predict
985
+ * @returns
986
+ */
987
+ export function predictDefaultValue(
988
+ program: Program,
989
+ dpgContext: SdkContext,
990
+ param?: ModelProperty
991
+ ) {
992
+ if (!param) {
993
+ return;
994
+ }
995
+ const specificDefault = param?.default;
996
+ if (isLiteralValue(specificDefault)) {
997
+ return specificDefault.value;
998
+ }
999
+ const serviceNamespace = getDefaultService(program)?.type;
1000
+ if (!serviceNamespace) {
1001
+ return;
1002
+ }
1003
+ const defaultApiVersion = getEnrichedDefaultApiVersion(program, dpgContext);
1004
+ if (param && isApiVersion(dpgContext, param) && defaultApiVersion) {
1005
+ return defaultApiVersion;
1006
+ }
1007
+ return;
1008
+ }
1009
+
1010
+ function isLiteralValue(
1011
+ type?: Type
1012
+ ): type is StringLiteral | NumericLiteral | BooleanLiteral {
1013
+ if (!type) {
1014
+ return false;
1015
+ }
1016
+
1017
+ if (
1018
+ type.kind === "Boolean" ||
1019
+ type.kind === "String" ||
1020
+ type.kind === "Number"
1021
+ ) {
1022
+ return type.value !== undefined;
1023
+ }
1024
+
1025
+ return false;
1026
+ }
1027
+
1028
+ export function getDefaultService(program: Program): Service | undefined {
1029
+ const services = listServices(program);
1030
+ if (!services || services.length === 0) {
1031
+ reportDiagnostic(program, {
1032
+ code: "no-service-defined",
1033
+ target: NoTarget
1034
+ });
1035
+ }
1036
+ if (services.length > 1) {
1037
+ reportDiagnostic(program, {
1038
+ code: "more-than-one-service",
1039
+ target: NoTarget
1040
+ });
1041
+ }
1042
+ return services[0];
1043
+ }
1044
+
1045
+ /**
1046
+ * Get the default api-version both from versioned and service decorator
1047
+ * TODO: remember to switch to TCGC once the fix is done
1048
+ * @param program
1049
+ * @param dpgContext
1050
+ * @returns default api-version value
1051
+ */
1052
+ export function getEnrichedDefaultApiVersion(
1053
+ program: Program,
1054
+ dpgContext: SdkContext
1055
+ ): string | undefined {
1056
+ const serviceNamespace = getDefaultService(program);
1057
+ if (!serviceNamespace) {
1058
+ return;
1059
+ }
1060
+
1061
+ const defaultVersion = getDefaultApiVersion(
1062
+ dpgContext,
1063
+ serviceNamespace!.type
1064
+ );
1065
+ if (defaultVersion) {
1066
+ return defaultVersion.value;
1067
+ }
1068
+ return serviceNamespace.version;
1069
+ }
1070
+
1071
+ export function trimUsage(model: any) {
1072
+ if (typeof model !== "object") {
1073
+ return model;
1074
+ }
1075
+ const tmpModel = Object.assign({}, model);
1076
+ const tmpModelKeys = Object.keys(tmpModel).filter((item) => {
1077
+ return item !== "usage";
1078
+ });
1079
+ const ordered = tmpModelKeys.sort().reduce((obj, key) => {
1080
+ (obj as any)[key] = trimUsage(tmpModel[key]);
1081
+ return obj;
1082
+ }, {});
1083
+ return ordered;
1084
+ }
@@ -0,0 +1,13 @@
1
+ import { Project } from "ts-morph";
2
+
3
+ export function buildApiIndexFile(project: Project, srcPath: string) {
4
+ const apiFiles = project.getSourceFiles("**/src/api/**");
5
+ const indexFile = project.createSourceFile(`${srcPath}/src/api/index.ts`);
6
+ for (const file of apiFiles) {
7
+ const exports = [...file.getExportedDeclarations().keys()];
8
+ indexFile.addExportDeclaration({
9
+ moduleSpecifier: `./${file.getBaseNameWithoutExtension()}.js`,
10
+ namedExports: exports
11
+ });
12
+ }
13
+ }
@@ -0,0 +1,147 @@
1
+ import {
2
+ ClassDeclaration,
3
+ FunctionDeclarationStructure,
4
+ MethodDeclarationStructure,
5
+ OptionalKind,
6
+ Project,
7
+ Scope,
8
+ SourceFile,
9
+ StructureKind
10
+ } from "ts-morph";
11
+ import { toCamelCase } from "../casingUtils.js";
12
+ import { getClientParameters } from "./helpers/clientHelpers.js";
13
+ import { getClientName } from "./helpers/namingHelpers.js";
14
+ import { getOperationFunction } from "./helpers/operationHelpers.js";
15
+ import { Client } from "./modularCodeModel.js";
16
+
17
+ export function buildClassicalClient(
18
+ client: Client,
19
+ project: Project,
20
+ srcPath: string
21
+ ) {
22
+ const { description } = client;
23
+ const modularClientName = getClientName(client);
24
+ const classicalClientname = `${getClientName(client)}Client`;
25
+ const params = getClientParameters(client);
26
+
27
+ const clientFile = project.createSourceFile(
28
+ `${srcPath}/src/${classicalClientname}.ts`
29
+ );
30
+ const clientClass = clientFile.addClass({
31
+ isExported: true,
32
+ name: `${classicalClientname}`
33
+ });
34
+
35
+ // Add the private client member. This will be the client context from /api
36
+ clientClass.addProperty({
37
+ name: "_client",
38
+ type: `${modularClientName}Context`,
39
+ scope: Scope.Private
40
+ });
41
+
42
+ // TODO: We may need to generate constructor overloads at some point. Here we'd do that.
43
+ const constructor = clientClass.addConstructor({
44
+ docs: [description],
45
+ parameters: params
46
+ });
47
+ constructor.addStatements([
48
+ `this._client = create${modularClientName}(${(params ?? [])
49
+ .map((p) => p.name)
50
+ .join(",")})`
51
+ ]);
52
+ importCredential(clientFile);
53
+ buildClientOperationGroups(client, clientClass);
54
+ importAllModels(clientFile, srcPath);
55
+ clientFile.fixUnusedIdentifiers();
56
+ }
57
+
58
+ function importAllModels(clientFile: SourceFile, srcPath: string) {
59
+ const project = clientFile.getProject();
60
+ const apiModels = project.getSourceFile(`${srcPath}/src/api/index.ts`);
61
+
62
+ if (!apiModels) {
63
+ return;
64
+ }
65
+
66
+ const exported = [...apiModels.getExportedDeclarations().keys()];
67
+
68
+ clientFile.addImportDeclaration({
69
+ moduleSpecifier: `./api/index.js`,
70
+ namedImports: exported
71
+ });
72
+ }
73
+
74
+ function importCredential(clientSourceFile: SourceFile): void {
75
+ clientSourceFile.addImportDeclaration({
76
+ moduleSpecifier: "@azure/core-auth",
77
+ namedImports: ["TokenCredential", "AzureKeyCredential"]
78
+ });
79
+ }
80
+
81
+ function buildClientOperationGroups(
82
+ client: Client,
83
+ clientClass: ClassDeclaration
84
+ ) {
85
+ for (const operationGroup of client.operationGroups) {
86
+ const operationGroupName = toCamelCase(operationGroup.propertyName);
87
+ const operationDeclarations: OptionalKind<FunctionDeclarationStructure>[] =
88
+ operationGroup.operations.map((operation) =>
89
+ getOperationFunction(operation)
90
+ );
91
+
92
+ const tempfile = new Project().createSourceFile("temp.ts");
93
+
94
+ const declarations = tempfile.addFunctions(operationDeclarations);
95
+
96
+ if (operationGroupName) {
97
+ clientClass.addProperty({
98
+ name: operationGroupName,
99
+ initializer: `
100
+ {
101
+ ${declarations.map((d) => {
102
+ return `${d.getName()}: (${d
103
+ .getParameters()
104
+ .filter((p) => p.getName() !== "context")
105
+ .map((p) => p.getText())
106
+ .join(",")}): ${d
107
+ .getReturnType()
108
+ .getText()} => {return ${d.getName()}(${[
109
+ "this._client",
110
+ ...d.getParameters().map((p) => p.getName())
111
+ ]
112
+ .filter((p) => p !== "context")
113
+ .join(",")})}`;
114
+ })}
115
+ }
116
+ `
117
+ });
118
+ } else {
119
+ clientClass.addMethods(
120
+ declarations.map((d) => {
121
+ const method: MethodDeclarationStructure = {
122
+ name: d.getName() ?? "FIXME",
123
+ kind: StructureKind.Method,
124
+ returnType: d.getReturnType().getText(),
125
+ parameters: d
126
+ .getParameters()
127
+ .filter((p) => p.getName() !== "context")
128
+ .map((d) => d.getStructure()),
129
+ statements: `return ${d.getName()}(${[
130
+ "this._client",
131
+ ...d.getParameters().map((p) => p.getName())
132
+ ]
133
+ .filter((p) => p !== "context")
134
+ .join(",")})`
135
+ };
136
+
137
+ return method;
138
+ })
139
+ );
140
+ }
141
+ }
142
+ // Import ClientOptions
143
+ clientClass.getSourceFile().addImportDeclaration({
144
+ moduleSpecifier: `./common/interfaces.js`,
145
+ namedImports: ["ClientOptions"]
146
+ });
147
+ }