@apimatic/cli 1.1.0-alpha.9 → 1.1.0-beta.2

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 (337) hide show
  1. package/README.md +436 -374
  2. package/bin/run.js +5 -0
  3. package/lib/actions/action-result.d.ts +13 -0
  4. package/lib/actions/action-result.js +44 -0
  5. package/lib/actions/action-result.js.map +1 -0
  6. package/lib/actions/api/transform.d.ts +15 -0
  7. package/lib/actions/api/transform.js +48 -0
  8. package/lib/actions/api/transform.js.map +1 -0
  9. package/lib/actions/api/validate.d.ts +12 -0
  10. package/lib/actions/api/validate.js +41 -0
  11. package/lib/actions/api/validate.js.map +1 -0
  12. package/lib/actions/auth/login.d.ts +13 -0
  13. package/lib/actions/auth/login.js +55 -0
  14. package/lib/actions/auth/login.js.map +1 -0
  15. package/lib/actions/auth/logout.d.ts +8 -0
  16. package/lib/actions/auth/logout.js +15 -0
  17. package/lib/actions/auth/logout.js.map +1 -0
  18. package/lib/actions/auth/status.d.ts +11 -0
  19. package/lib/actions/auth/status.js +26 -0
  20. package/lib/actions/auth/status.js.map +1 -0
  21. package/lib/actions/portal/copilot.d.ts +16 -0
  22. package/lib/actions/portal/copilot.js +89 -0
  23. package/lib/actions/portal/copilot.js.map +1 -0
  24. package/lib/actions/portal/generate.d.ts +11 -5
  25. package/lib/actions/portal/generate.js +60 -55
  26. package/lib/actions/portal/generate.js.map +1 -0
  27. package/lib/actions/portal/quickstart.d.ts +16 -0
  28. package/lib/actions/portal/quickstart.js +146 -0
  29. package/lib/actions/portal/quickstart.js.map +1 -0
  30. package/lib/actions/portal/recipe/new-recipe.d.ts +15 -0
  31. package/lib/actions/portal/recipe/new-recipe.js +177 -0
  32. package/lib/actions/portal/recipe/new-recipe.js.map +1 -0
  33. package/lib/actions/portal/serve.d.ts +15 -0
  34. package/lib/actions/portal/serve.js +118 -0
  35. package/lib/actions/portal/serve.js.map +1 -0
  36. package/lib/actions/portal/toc/new-toc.d.ts +17 -13
  37. package/lib/actions/portal/toc/new-toc.js +85 -122
  38. package/lib/actions/portal/toc/new-toc.js.map +1 -0
  39. package/lib/actions/quickstart.d.ts +10 -0
  40. package/lib/actions/quickstart.js +30 -0
  41. package/lib/actions/quickstart.js.map +1 -0
  42. package/lib/actions/sdk/generate.d.ts +13 -0
  43. package/lib/actions/sdk/generate.js +47 -0
  44. package/lib/actions/sdk/generate.js.map +1 -0
  45. package/lib/actions/sdk/quickstart.d.ts +14 -0
  46. package/lib/actions/sdk/quickstart.js +149 -0
  47. package/lib/actions/sdk/quickstart.js.map +1 -0
  48. package/lib/application/portal/recipe/portal-recipe.d.ts +8 -0
  49. package/lib/application/portal/recipe/portal-recipe.js +33 -0
  50. package/lib/application/portal/recipe/portal-recipe.js.map +1 -0
  51. package/lib/application/portal/recipe/recipe-generator.d.ts +21 -0
  52. package/lib/application/portal/recipe/recipe-generator.js +145 -0
  53. package/lib/application/portal/recipe/recipe-generator.js.map +1 -0
  54. package/lib/application/portal/toc/toc-content-parser.d.ts +1 -1
  55. package/lib/application/portal/toc/toc-content-parser.js +9 -11
  56. package/lib/application/portal/toc/toc-content-parser.js.map +1 -0
  57. package/lib/application/portal/toc/toc-structure-generator.d.ts +1 -1
  58. package/lib/application/portal/toc/toc-structure-generator.js +4 -8
  59. package/lib/application/portal/toc/toc-structure-generator.js.map +1 -0
  60. package/lib/client-utils/auth-manager.d.ts +7 -2
  61. package/lib/client-utils/auth-manager.js +26 -14
  62. package/lib/client-utils/auth-manager.js.map +1 -0
  63. package/lib/commands/api/transform.d.ts +10 -7
  64. package/lib/commands/api/transform.js +51 -111
  65. package/lib/commands/api/transform.js.map +1 -0
  66. package/lib/commands/api/validate.d.ts +7 -4
  67. package/lib/commands/api/validate.js +31 -74
  68. package/lib/commands/api/validate.js.map +1 -0
  69. package/lib/commands/auth/login.d.ts +3 -1
  70. package/lib/commands/auth/login.js +26 -68
  71. package/lib/commands/auth/login.js.map +1 -0
  72. package/lib/commands/auth/logout.d.ts +3 -1
  73. package/lib/commands/auth/logout.js +14 -21
  74. package/lib/commands/auth/logout.js.map +1 -0
  75. package/lib/commands/auth/status.d.ts +1 -0
  76. package/lib/commands/auth/status.js +18 -21
  77. package/lib/commands/auth/status.js.map +1 -0
  78. package/lib/commands/portal/copilot.d.ts +13 -0
  79. package/lib/commands/portal/copilot.js +34 -0
  80. package/lib/commands/portal/copilot.js.map +1 -0
  81. package/lib/commands/portal/generate.d.ts +7 -11
  82. package/lib/commands/portal/generate.js +26 -89
  83. package/lib/commands/portal/generate.js.map +1 -0
  84. package/lib/commands/portal/recipe/new.d.ts +12 -0
  85. package/lib/commands/portal/recipe/new.js +45 -0
  86. package/lib/commands/portal/recipe/new.js.map +1 -0
  87. package/lib/commands/portal/serve.d.ts +8 -8
  88. package/lib/commands/portal/serve.js +41 -125
  89. package/lib/commands/portal/serve.js.map +1 -0
  90. package/lib/commands/portal/toc/new.d.ts +5 -6
  91. package/lib/commands/portal/toc/new.js +45 -50
  92. package/lib/commands/portal/toc/new.js.map +1 -0
  93. package/lib/commands/quickstart.d.ts +9 -0
  94. package/lib/commands/quickstart.js +37 -0
  95. package/lib/commands/quickstart.js.map +1 -0
  96. package/lib/commands/sdk/generate.d.ts +10 -8
  97. package/lib/commands/sdk/generate.js +46 -131
  98. package/lib/commands/sdk/generate.js.map +1 -0
  99. package/lib/config/axios-config.js +4 -6
  100. package/lib/config/axios-config.js.map +1 -0
  101. package/lib/hooks/not-found.d.ts +3 -0
  102. package/lib/hooks/not-found.js +52 -0
  103. package/lib/hooks/not-found.js.map +1 -0
  104. package/lib/hooks/utils.d.ts +5 -0
  105. package/lib/hooks/utils.js +51 -0
  106. package/lib/hooks/utils.js.map +1 -0
  107. package/lib/index.js +2 -5
  108. package/lib/index.js.map +1 -0
  109. package/lib/infrastructure/debounce-service.d.ts +10 -0
  110. package/lib/infrastructure/debounce-service.js +52 -0
  111. package/lib/infrastructure/debounce-service.js.map +1 -0
  112. package/lib/infrastructure/env-info.d.ts +12 -0
  113. package/lib/infrastructure/env-info.js +58 -0
  114. package/lib/infrastructure/env-info.js.map +1 -0
  115. package/lib/infrastructure/file-service.d.ts +24 -0
  116. package/lib/infrastructure/file-service.js +120 -0
  117. package/lib/infrastructure/file-service.js.map +1 -0
  118. package/lib/infrastructure/launcher-service.d.ts +9 -0
  119. package/lib/infrastructure/launcher-service.js +72 -0
  120. package/lib/infrastructure/launcher-service.js.map +1 -0
  121. package/lib/infrastructure/network-service.d.ts +3 -0
  122. package/lib/infrastructure/network-service.js +7 -0
  123. package/lib/infrastructure/network-service.js.map +1 -0
  124. package/lib/infrastructure/service-error.d.ts +16 -0
  125. package/lib/infrastructure/service-error.js +49 -0
  126. package/lib/infrastructure/service-error.js.map +1 -0
  127. package/lib/infrastructure/services/api-client-factory.d.ts +6 -0
  128. package/lib/infrastructure/services/api-client-factory.js +20 -0
  129. package/lib/infrastructure/services/api-client-factory.js.map +1 -0
  130. package/lib/infrastructure/services/api-service.d.ts +12 -0
  131. package/lib/infrastructure/services/api-service.js +79 -0
  132. package/lib/infrastructure/services/api-service.js.map +1 -0
  133. package/lib/infrastructure/services/auth-service.d.ts +11 -0
  134. package/lib/infrastructure/services/auth-service.js +37 -0
  135. package/lib/infrastructure/services/auth-service.js.map +1 -0
  136. package/lib/infrastructure/services/file-download-service.d.ts +15 -0
  137. package/lib/infrastructure/services/file-download-service.js +104 -0
  138. package/lib/infrastructure/services/file-download-service.js.map +1 -0
  139. package/lib/infrastructure/services/portal-service.d.ts +17 -12
  140. package/lib/infrastructure/services/portal-service.js +134 -99
  141. package/lib/infrastructure/services/portal-service.js.map +1 -0
  142. package/lib/infrastructure/services/telemetry-service.d.ts +9 -0
  143. package/lib/infrastructure/services/telemetry-service.js +38 -0
  144. package/lib/infrastructure/services/telemetry-service.js.map +1 -0
  145. package/lib/infrastructure/services/transformation-service.d.ts +23 -0
  146. package/lib/infrastructure/services/transformation-service.js +56 -0
  147. package/lib/infrastructure/services/transformation-service.js.map +1 -0
  148. package/lib/infrastructure/services/validation-service.d.ts +17 -0
  149. package/lib/infrastructure/services/validation-service.js +49 -0
  150. package/lib/infrastructure/services/validation-service.js.map +1 -0
  151. package/lib/infrastructure/tmp-extensions.d.ts +2 -0
  152. package/lib/infrastructure/tmp-extensions.js +6 -0
  153. package/lib/infrastructure/tmp-extensions.js.map +1 -0
  154. package/lib/infrastructure/zip-service.d.ts +6 -0
  155. package/lib/infrastructure/zip-service.js +39 -0
  156. package/lib/infrastructure/zip-service.js.map +1 -0
  157. package/lib/prompts/api/transform.d.ts +11 -0
  158. package/lib/prompts/api/transform.js +29 -0
  159. package/lib/prompts/api/transform.js.map +1 -0
  160. package/lib/prompts/api/validate.d.ts +12 -0
  161. package/lib/prompts/api/validate.js +40 -0
  162. package/lib/prompts/api/validate.js.map +1 -0
  163. package/lib/prompts/auth/login.d.ts +10 -0
  164. package/lib/prompts/auth/login.js +22 -0
  165. package/lib/prompts/auth/login.js.map +1 -0
  166. package/lib/prompts/auth/logout.d.ts +3 -0
  167. package/lib/prompts/auth/logout.js +7 -0
  168. package/lib/prompts/auth/logout.js.map +1 -0
  169. package/lib/prompts/auth/status.d.ts +8 -0
  170. package/lib/prompts/auth/status.js +22 -0
  171. package/lib/prompts/auth/status.js.map +1 -0
  172. package/lib/prompts/format.d.ts +31 -0
  173. package/lib/prompts/format.js +89 -0
  174. package/lib/prompts/format.js.map +1 -0
  175. package/lib/prompts/portal/copilot.d.ts +18 -0
  176. package/lib/prompts/portal/copilot.js +82 -0
  177. package/lib/prompts/portal/copilot.js.map +1 -0
  178. package/lib/prompts/portal/generate.d.ts +13 -8
  179. package/lib/prompts/portal/generate.js +36 -53
  180. package/lib/prompts/portal/generate.js.map +1 -0
  181. package/lib/prompts/portal/quickstart.d.ts +28 -29
  182. package/lib/prompts/portal/quickstart.js +102 -185
  183. package/lib/prompts/portal/quickstart.js.map +1 -0
  184. package/lib/prompts/portal/recipe/new-recipe.d.ts +29 -0
  185. package/lib/prompts/portal/recipe/new-recipe.js +165 -0
  186. package/lib/prompts/portal/recipe/new-recipe.js.map +1 -0
  187. package/lib/prompts/portal/serve.d.ts +9 -5
  188. package/lib/prompts/portal/serve.js +29 -19
  189. package/lib/prompts/portal/serve.js.map +1 -0
  190. package/lib/prompts/portal/toc/new-toc.d.ts +13 -8
  191. package/lib/prompts/portal/toc/new-toc.js +28 -36
  192. package/lib/prompts/portal/toc/new-toc.js.map +1 -0
  193. package/lib/prompts/prompt.d.ts +3 -0
  194. package/lib/prompts/prompt.js +37 -0
  195. package/lib/prompts/prompt.js.map +1 -0
  196. package/lib/prompts/quickstart.d.ts +6 -0
  197. package/lib/prompts/quickstart.js +25 -0
  198. package/lib/prompts/quickstart.js.map +1 -0
  199. package/lib/prompts/sdk/generate.d.ts +11 -0
  200. package/lib/prompts/sdk/generate.js +37 -0
  201. package/lib/prompts/sdk/generate.js.map +1 -0
  202. package/lib/prompts/sdk/quickstart.d.ts +32 -0
  203. package/lib/prompts/sdk/quickstart.js +140 -0
  204. package/lib/prompts/sdk/quickstart.js.map +1 -0
  205. package/lib/types/api/account.d.ts +10 -0
  206. package/lib/types/api/account.js +2 -0
  207. package/lib/types/api/account.js.map +1 -0
  208. package/lib/types/api/transform.d.ts +14 -25
  209. package/lib/types/api/transform.js +20 -23
  210. package/lib/types/api/transform.js.map +1 -0
  211. package/lib/types/build/build.d.ts +22 -0
  212. package/lib/types/build/build.js +7 -0
  213. package/lib/types/build/build.js.map +1 -0
  214. package/lib/types/build-context.d.ts +13 -0
  215. package/lib/types/build-context.js +33 -0
  216. package/lib/types/build-context.js.map +1 -0
  217. package/lib/types/common/command-metadata.d.ts +4 -0
  218. package/lib/types/common/command-metadata.js +2 -0
  219. package/lib/types/common/command-metadata.js.map +1 -0
  220. package/lib/types/events/domain-event.d.ts +8 -0
  221. package/lib/types/events/domain-event.js +11 -0
  222. package/lib/types/events/domain-event.js.map +1 -0
  223. package/lib/types/events/quickstart-completed.d.ts +7 -0
  224. package/lib/types/events/quickstart-completed.js +10 -0
  225. package/lib/types/events/quickstart-completed.js.map +1 -0
  226. package/lib/types/events/quickstart-initiated.d.ts +7 -0
  227. package/lib/types/events/quickstart-initiated.js +10 -0
  228. package/lib/types/events/quickstart-initiated.js.map +1 -0
  229. package/lib/types/events/recipe-creation-failed.d.ts +5 -0
  230. package/lib/types/events/recipe-creation-failed.js +8 -0
  231. package/lib/types/events/recipe-creation-failed.js.map +1 -0
  232. package/lib/types/events/toc-creation-failed.d.ts +5 -0
  233. package/lib/types/events/toc-creation-failed.js +8 -0
  234. package/lib/types/events/toc-creation-failed.js.map +1 -0
  235. package/lib/types/file/directory.d.ts +17 -0
  236. package/lib/types/file/directory.js +87 -0
  237. package/lib/types/file/directory.js.map +1 -0
  238. package/lib/types/file/directoryPath.d.ts +10 -0
  239. package/lib/types/file/directoryPath.js +26 -0
  240. package/lib/types/file/directoryPath.js.map +1 -0
  241. package/lib/types/file/fileName.d.ts +7 -0
  242. package/lib/types/file/fileName.js +21 -0
  243. package/lib/types/file/fileName.js.map +1 -0
  244. package/lib/types/file/filePath.d.ts +10 -0
  245. package/lib/types/file/filePath.js +32 -0
  246. package/lib/types/file/filePath.js.map +1 -0
  247. package/lib/types/file/resource-input.d.ts +5 -0
  248. package/lib/types/file/resource-input.js +42 -0
  249. package/lib/types/file/resource-input.js.map +1 -0
  250. package/lib/types/file/urlPath.d.ts +6 -0
  251. package/lib/types/file/urlPath.js +22 -0
  252. package/lib/types/file/urlPath.js.map +1 -0
  253. package/lib/types/flags-provider.d.ts +15 -0
  254. package/lib/types/flags-provider.js +34 -0
  255. package/lib/types/flags-provider.js.map +1 -0
  256. package/lib/types/portal-context.d.ts +13 -0
  257. package/lib/types/portal-context.js +38 -0
  258. package/lib/types/portal-context.js.map +1 -0
  259. package/lib/types/recipe/recipe.d.ts +22 -0
  260. package/lib/types/recipe/recipe.js +6 -0
  261. package/lib/types/recipe/recipe.js.map +1 -0
  262. package/lib/types/recipe-context.d.ts +9 -0
  263. package/lib/types/recipe-context.js +26 -0
  264. package/lib/types/recipe-context.js.map +1 -0
  265. package/lib/types/resource-context.d.ts +12 -0
  266. package/lib/types/resource-context.js +30 -0
  267. package/lib/types/resource-context.js.map +1 -0
  268. package/lib/types/sdk/generate.d.ts +9 -22
  269. package/lib/types/sdk/generate.js +25 -14
  270. package/lib/types/sdk/generate.js.map +1 -0
  271. package/lib/types/sdk-context.d.ts +14 -0
  272. package/lib/types/sdk-context.js +32 -0
  273. package/lib/types/sdk-context.js.map +1 -0
  274. package/lib/types/sdl/sdl.d.ts +10 -0
  275. package/lib/types/sdl/sdl.js +47 -3
  276. package/lib/types/sdl/sdl.js.map +1 -0
  277. package/lib/types/spec-context.d.ts +12 -0
  278. package/lib/types/spec-context.js +29 -0
  279. package/lib/types/spec-context.js.map +1 -0
  280. package/lib/types/temp-context.d.ts +11 -0
  281. package/lib/types/temp-context.js +27 -0
  282. package/lib/types/temp-context.js.map +1 -0
  283. package/lib/types/toc/toc.js +2 -10
  284. package/lib/types/toc/toc.js.map +1 -0
  285. package/lib/types/toc-context.d.ts +12 -0
  286. package/lib/types/toc-context.js +26 -0
  287. package/lib/types/toc-context.js.map +1 -0
  288. package/lib/types/transform-context.d.ts +13 -0
  289. package/lib/types/transform-context.js +30 -0
  290. package/lib/types/transform-context.js.map +1 -0
  291. package/lib/types/utils.d.ts +0 -9
  292. package/lib/types/utils.js +2 -3
  293. package/lib/types/utils.js.map +1 -0
  294. package/lib/utils/string-utils.d.ts +2 -0
  295. package/lib/utils/string-utils.js +37 -0
  296. package/lib/utils/string-utils.js.map +1 -0
  297. package/lib/utils/utils.d.ts +2 -44
  298. package/lib/utils/utils.js +14 -366
  299. package/lib/utils/utils.js.map +1 -0
  300. package/package.json +50 -31
  301. package/bin/run +0 -9
  302. package/lib/application/portal/toc/sdl-parser.d.ts +0 -13
  303. package/lib/application/portal/toc/sdl-parser.js +0 -53
  304. package/lib/client-utils/sdk-client.d.ts +0 -23
  305. package/lib/client-utils/sdk-client.js +0 -124
  306. package/lib/commands/portal/quickstart.d.ts +0 -10
  307. package/lib/commands/portal/quickstart.js +0 -79
  308. package/lib/config/env.d.ts +0 -27
  309. package/lib/config/env.js +0 -31
  310. package/lib/controllers/api/transform.d.ts +0 -5
  311. package/lib/controllers/api/transform.js +0 -56
  312. package/lib/controllers/api/validate.d.ts +0 -3
  313. package/lib/controllers/api/validate.js +0 -33
  314. package/lib/controllers/portal/generate.d.ts +0 -3
  315. package/lib/controllers/portal/generate.js +0 -110
  316. package/lib/controllers/portal/quickstart.d.ts +0 -14
  317. package/lib/controllers/portal/quickstart.js +0 -258
  318. package/lib/controllers/portal/serve.d.ts +0 -3
  319. package/lib/controllers/portal/serve.js +0 -138
  320. package/lib/controllers/sdk/generate.d.ts +0 -4
  321. package/lib/controllers/sdk/generate.js +0 -66
  322. package/lib/services/portal/server.d.ts +0 -14
  323. package/lib/services/portal/server.js +0 -101
  324. package/lib/types/api/validate.d.ts +0 -12
  325. package/lib/types/api/validate.js +0 -3
  326. package/lib/types/common/result.d.ts +0 -17
  327. package/lib/types/common/result.js +0 -36
  328. package/lib/types/portal/generate.d.ts +0 -26
  329. package/lib/types/portal/generate.js +0 -4
  330. package/lib/types/portal/quickstart.d.ts +0 -17
  331. package/lib/types/portal/quickstart.js +0 -3
  332. package/lib/validators/common/directoryValidator.d.ts +0 -9
  333. package/lib/validators/common/directoryValidator.js +0 -53
  334. package/lib/validators/common/portValidator.d.ts +0 -5
  335. package/lib/validators/common/portValidator.js +0 -20
  336. package/lib/validators/portal/serveValidator.d.ts +0 -6
  337. package/lib/validators/portal/serveValidator.js +0 -21
@@ -1,16 +1,21 @@
1
- import { GeneratePortalParams } from "../../types/portal/generate";
2
- import { Result } from "../../types/common/result";
3
- import { Sdl } from "../../types/sdl/sdl";
1
+ import { ReadStream } from "fs";
2
+ import { Sdl } from "../../types/sdl/sdl.js";
3
+ import { FilePath } from "../../types/file/filePath.js";
4
+ import { DirectoryPath } from "../../types/file/directoryPath.js";
5
+ import { CommandMetadata } from "../../types/common/command-metadata.js";
6
+ import { Result } from "neverthrow";
7
+ import { Language } from "../../types/sdk/generate.js";
8
+ import { ServiceError } from "../service-error.js";
4
9
  export declare class PortalService {
5
10
  private readonly CONTENT_TYPE;
6
- private readonly TIMEOUT;
7
- generateOnPremPortal(params: GeneratePortalParams, configDir: string): Promise<Result<NodeJS.ReadableStream, string>>;
8
- generateSdl(specPath: string, configDir: string): Promise<Result<Sdl, string>>;
9
- private createGenericErrorResult;
11
+ private readonly fileService;
12
+ private readonly apiService;
13
+ generatePortal(buildPath: FilePath, configDir: DirectoryPath, commandMetadata: CommandMetadata, authKey: string | null): Promise<Result<NodeJS.ReadableStream, ServiceError | NodeJS.ReadableStream>>;
14
+ generateSdk(specPath: FilePath, language: Language, configDir: DirectoryPath, commandMetadata: CommandMetadata, authKey: string | null): Promise<Result<NodeJS.ReadableStream, string>>;
15
+ generateSdl(specFileStream: ReadStream, configDir: DirectoryPath, commandMetadata: CommandMetadata): Promise<Result<Sdl, ServiceError>>;
10
16
  private createAuthorizationHeader;
11
- private createApiClient;
12
- private generatePortalFromSyncEndpoint;
13
- private handlePortalGenerationErrors;
14
- private parseErrorResponse;
15
- private saveAndExtractErrorZipFile;
17
+ private createOriginQueryParameter;
18
+ private handleSdkGenerationErrors;
19
+ private parseBadRequestResponse;
20
+ private readonly languagePlatform;
16
21
  }
@@ -1,133 +1,168 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PortalService = void 0;
4
- const fsExtra = require("fs-extra");
5
- const fs = require("fs");
6
- const path = require("path");
7
- const sdk_1 = require("@apimatic/sdk");
8
- const auth_manager_1 = require("../../client-utils/auth-manager");
9
- const result_1 = require("../../types/common/result");
10
- const utils_1 = require("../../utils/utils");
11
- class PortalService {
1
+ import { Accept, ApiError, BadRequestResponseSdkError, CodeGenerationExternalApisController, ContentType, DocsPortalGenerationAsyncController, UnauthorizedResponseError, ProblemDetailsError, FileWrapper, TransformationController, ExportFormats, Platforms } from "@apimatic/sdk";
2
+ import { getAuthInfo } from "../../client-utils/auth-manager.js";
3
+ import { parseStreamBodyToJson } from "../../utils/utils.js";
4
+ import { FileService } from "../file-service.js";
5
+ import { apiClientFactory } from "./api-client-factory.js";
6
+ import { err, ok } from "neverthrow";
7
+ import { Language } from "../../types/sdk/generate.js";
8
+ import { handleServiceError, ServiceError } from "../service-error.js";
9
+ import { ApiService } from "./api-service.js";
10
+ export class PortalService {
12
11
  constructor() {
13
- this.CONTENT_TYPE = sdk_1.ContentType.EnumMultipartformdata;
14
- this.TIMEOUT = 0;
12
+ this.CONTENT_TYPE = ContentType.EnumMultipartformdata;
13
+ this.fileService = new FileService();
14
+ this.apiService = new ApiService();
15
15
  this.createAuthorizationHeader = (authInfo, overrideAuthKey) => {
16
16
  const key = overrideAuthKey || (authInfo === null || authInfo === void 0 ? void 0 : authInfo.authKey);
17
17
  return `X-Auth-Key ${key !== null && key !== void 0 ? key : ""}`;
18
18
  };
19
- this.createApiClient = (authorizationHeader) => {
20
- return new sdk_1.Client({
21
- customHeaderAuthenticationCredentials: {
22
- Authorization: authorizationHeader
23
- },
24
- timeout: this.TIMEOUT
25
- });
19
+ this.createOriginQueryParameter = (commandName) => {
20
+ return {
21
+ origin: `APIMATIC CLI ${commandName}`
22
+ };
26
23
  };
27
- this.generatePortalFromSyncEndpoint = async (docsPortalManagementController, zippedBuildFilePath) => {
28
- const file = new sdk_1.FileWrapper(fs.createReadStream(zippedBuildFilePath));
29
- const response = await docsPortalManagementController.generateOnPremPortalViaBuildInput(this.CONTENT_TYPE, file);
30
- return response.result;
31
- };
32
- this.handlePortalGenerationErrors = async (error, params) => {
33
- var _a;
34
- if (error instanceof sdk_1.UnauthorizedResponseError) {
35
- //401
36
- const body = await this.parseErrorResponse(error);
37
- return (0, utils_1.getMessageInRedColor)((_a = body.message) !== null && _a !== void 0 ? _a : "Unauthorized access.");
38
- }
39
- else if (error instanceof sdk_1.ProblemDetailsError) {
40
- //400 & 403
41
- const body = await this.parseErrorResponse(error);
42
- const message = body.errors[Object.keys(body.errors)[0]][0];
43
- return (0, utils_1.getMessageInRedColor)(body.title + "\n- " + message);
44
- }
45
- else if (error instanceof sdk_1.ApiError && error.statusCode === 422) {
46
- //422
47
- return await this.saveAndExtractErrorZipFile(error, params);
24
+ this.handleSdkGenerationErrors = async (error) => {
25
+ var _a, _b, _c, _d, _e;
26
+ if (error instanceof BadRequestResponseSdkError) {
27
+ //400
28
+ return this.parseBadRequestResponse((_a = error.result) === null || _a === void 0 ? void 0 : _a.message);
48
29
  }
49
- else if (error instanceof sdk_1.InternalServerErrorResponseError) {
50
- //500
51
- const body = await this.parseErrorResponse(error);
52
- return (0, utils_1.getMessageInRedColor)(`${body.message} Please try again or reach out to our team at support@apimatic.io for help if your problem persists.`);
30
+ if (error instanceof UnauthorizedResponseError) {
31
+ //401
32
+ return (_c = (_b = error.result) === null || _b === void 0 ? void 0 : _b.message) !== null && _c !== void 0 ? _c : "Authorization has been denied for this request.";
53
33
  }
54
- else {
55
- return (0, utils_1.getMessageInRedColor)(error instanceof Error ? error.message : String(error));
34
+ if (error instanceof ProblemDetailsError) {
35
+ // 403
36
+ const message = (_e = (_d = error.result.errors) === null || _d === void 0 ? void 0 : _d[""]) === null || _e === void 0 ? void 0 : _e[0];
37
+ return error.result.title + "\n- " + message;
56
38
  }
39
+ return "An unexpected error occurred while generating the portal, please try again later. If the problem persists, please reach out to our team at support@apimatic.io";
57
40
  };
58
- this.parseErrorResponse = async (error) => {
59
- if (error instanceof Error && "body" in error) {
60
- const stream = error.body;
61
- return await (0, utils_1.parseStreamBodyToJson)(stream);
62
- }
63
- throw error;
64
- };
65
- this.saveAndExtractErrorZipFile = async (error, params) => {
66
- const data = error.body;
67
- const writeStream = fs.createWriteStream(params.generatedPortalArtifactsZipFilePath);
68
- //TODO: Extract zip to temp folder and only copy the the debug report.
69
- return await new Promise((resolve, reject) => {
70
- data
71
- .pipe(writeStream)
72
- .on("finish", async () => {
73
- await (0, utils_1.extractZipFile)(params.generatedPortalArtifactsZipFilePath, params.generatedPortalArtifactsFolderPath);
74
- await (0, utils_1.deleteFile)(params.generatedPortalArtifactsZipFilePath);
75
- await (0, utils_1.deleteFile)(path.join(params.generatedPortalArtifactsFolderPath, "static"));
76
- resolve((0, utils_1.getMessageInRedColor)("An error occurred during portal generation due to an issue with the input. An error report has been written at the destination path: " +
77
- path.join(params.generatedPortalArtifactsFolderPath, "apimatic-debug")));
78
- })
79
- .on("error", async () => {
80
- reject((0, utils_1.getMessageInRedColor)("An error occurred during portal generation due to an issue with the input. The error report could not be generated. Please try again later."));
81
- });
82
- });
41
+ this.languagePlatform = {
42
+ [Language.CSHARP]: Platforms.CsNetStandardLib,
43
+ [Language.JAVA]: Platforms.JavaEclipseJreLib,
44
+ [Language.PHP]: Platforms.PhpGenericLibV2,
45
+ [Language.PYTHON]: Platforms.PythonGenericLib,
46
+ [Language.RUBY]: Platforms.RubyGenericLib,
47
+ [Language.TYPESCRIPT]: Platforms.TsGenericLib,
48
+ [Language.GO]: Platforms.GoGenericLib
83
49
  };
84
50
  }
85
- async generateOnPremPortal(params, configDir) {
86
- if (!(await fsExtra.pathExists(params.sourceBuildInputZipFilePath))) {
87
- return result_1.Result.failure("Build file doesn't exist");
51
+ // TODO: Pass stream as parameter instead of file path.
52
+ async generatePortal(buildPath, configDir, commandMetadata, authKey) {
53
+ var _a, _b;
54
+ const buildFileStream = await this.fileService.getStream(buildPath);
55
+ const file = new FileWrapper(buildFileStream);
56
+ const authInfo = await getAuthInfo(configDir.toString());
57
+ const authorizationHeader = this.createAuthorizationHeader(authInfo, authKey);
58
+ const client = apiClientFactory.createApiClient(authorizationHeader, commandMetadata.shell);
59
+ const docsPortalAsyncController = new DocsPortalGenerationAsyncController(client);
60
+ let generationId;
61
+ try {
62
+ const portalInstance = await docsPortalAsyncController.generateOnPremPortalViaBuildInputAsync(this.CONTENT_TYPE, file);
63
+ generationId = portalInstance.result.id;
64
+ }
65
+ catch (error) {
66
+ if (error instanceof ProblemDetailsError) {
67
+ const message = (_b = (_a = Object.values(error.result.errors)[0]) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : null;
68
+ const errorMessage = error.result.title + "\n- " + message;
69
+ if (error.statusCode === 400) {
70
+ return err(ServiceError.badRequest(errorMessage));
71
+ }
72
+ if (error.statusCode === 403) {
73
+ return err(ServiceError.forbidden(errorMessage));
74
+ }
75
+ }
76
+ const serviceError = handleServiceError(error);
77
+ return err(serviceError);
78
+ }
79
+ finally {
80
+ buildFileStream.close();
88
81
  }
89
- const authInfo = await (0, auth_manager_1.getAuthInfo)(configDir);
90
- const authorizationHeader = this.createAuthorizationHeader(authInfo, params.overrideAuthKey);
91
- const client = this.createApiClient(authorizationHeader);
92
- const docsPortalManagementController = new sdk_1.DocsPortalManagementController(client);
82
+ let statusResult;
83
+ do {
84
+ await new Promise((resolve) => setTimeout(resolve, 3000));
85
+ statusResult = await this.apiService.getPortalGenerationStatus(generationId, configDir, commandMetadata.shell, authKey);
86
+ if (statusResult.isErr()) {
87
+ return err(statusResult.error);
88
+ }
89
+ if (statusResult.value.status === "Failed") {
90
+ return err(ServiceError.ServerError);
91
+ }
92
+ } while (statusResult.value.status !== "Completed");
93
93
  try {
94
- const stream = await this.generatePortalFromSyncEndpoint(docsPortalManagementController, params.sourceBuildInputZipFilePath);
95
- return result_1.Result.success(stream);
94
+ const portalDownloadResponse = await docsPortalAsyncController.downloadGeneratedPortal(generationId);
95
+ return ok(portalDownloadResponse.result);
96
96
  }
97
97
  catch (error) {
98
- return result_1.Result.failure(await this.handlePortalGenerationErrors(error, params));
98
+ if (error instanceof ApiError && error.statusCode === 422) {
99
+ return err(error.body);
100
+ }
101
+ return err(handleServiceError(error));
99
102
  }
100
103
  }
101
- async generateSdl(specPath, configDir) {
102
- if (!(await fsExtra.pathExists(specPath))) {
103
- return result_1.Result.failure("Spec file doesn't exist");
104
+ // TODO: Pass stream as parameter instead of file path.
105
+ async generateSdk(specPath, language, configDir, commandMetadata, authKey) {
106
+ const specFileStream = await this.fileService.getStream(specPath);
107
+ const file = new FileWrapper(specFileStream);
108
+ const authInfo = await getAuthInfo(configDir.toString());
109
+ const authorizationHeader = this.createAuthorizationHeader(authInfo, authKey);
110
+ const client = apiClientFactory.createApiClient(authorizationHeader, commandMetadata.shell);
111
+ const sdkGenerationController = new CodeGenerationExternalApisController(client);
112
+ try {
113
+ const response = await sdkGenerationController.generateSdkViaFile(Accept.EnumApplicationjson, file, this.languagePlatform[language], this.createOriginQueryParameter(commandMetadata.commandName));
114
+ const sdkResponse = await sdkGenerationController.downloadSdk(response.result.id);
115
+ return ok(sdkResponse.result);
116
+ }
117
+ catch (error) {
118
+ return err(await this.handleSdkGenerationErrors(error));
104
119
  }
105
- const authInfo = await (0, auth_manager_1.getAuthInfo)(configDir);
120
+ finally {
121
+ specFileStream.close();
122
+ }
123
+ }
124
+ async generateSdl(specFileStream, configDir, commandMetadata) {
125
+ const file = new FileWrapper(specFileStream);
126
+ const authInfo = await getAuthInfo(configDir.toString());
106
127
  const authorizationHeader = this.createAuthorizationHeader(authInfo, null);
107
- const client = this.createApiClient(authorizationHeader);
108
- const transformationController = new sdk_1.TransformationController(client);
128
+ const client = apiClientFactory.createApiClient(authorizationHeader, commandMetadata.shell);
129
+ const transformationController = new TransformationController(client);
109
130
  try {
110
- const file = new sdk_1.FileWrapper(fs.createReadStream(specPath));
111
- const generation = await transformationController.transformViaFile(sdk_1.ContentType.EnumMultipartformdata, file, sdk_1.ExportFormats.Apimatic);
131
+ const generation = await transformationController.transformViaFile(ContentType.EnumMultipartformdata, file, ExportFormats.Apimatic, this.createOriginQueryParameter(commandMetadata.commandName));
112
132
  if (!generation.result.success) {
113
- return this.createGenericErrorResult();
133
+ return err(ServiceError.InvalidResponse);
114
134
  }
115
135
  const transformationId = generation.result.id;
116
136
  const { result } = await transformationController.downloadTransformedFile(transformationId);
117
137
  if (result.readable) {
118
- return result_1.Result.success((await (0, utils_1.parseStreamBodyToJson)(result)));
138
+ return ok((await parseStreamBodyToJson(result)));
119
139
  }
120
140
  else {
121
- return this.createGenericErrorResult();
141
+ return err(ServiceError.InvalidResponse);
122
142
  }
123
143
  }
124
- catch (_a) {
125
- return this.createGenericErrorResult();
144
+ catch (error) {
145
+ return err(handleServiceError(error));
126
146
  }
127
147
  }
128
- createGenericErrorResult() {
129
- return result_1.Result.failure("An unexpected error occurred");
148
+ parseBadRequestResponse(errorMessage) {
149
+ // #TODO: Fix server-side error message and simplify this function
150
+ if (!errorMessage) {
151
+ return "Bad request.";
152
+ }
153
+ // Parse the JSON string
154
+ const parsedResult = JSON.parse(errorMessage);
155
+ // Check if it has the expected structure with Errors
156
+ if (parsedResult.Errors && Array.isArray(parsedResult.Errors) && parsedResult.Errors.length > 0) {
157
+ // Get the first error and clean it up
158
+ return parsedResult.Errors[0].split(".")[0] + ".";
159
+ // Split on <br/> and take the first part, then strip remaining HTML tags
160
+ // return firstError.split("<br/>")[0].replace(/<[^<>]*?>/g, "");
161
+ }
162
+ else if (parsedResult.Success === false) {
163
+ return "API definition file validation failed.";
164
+ }
165
+ return errorMessage;
130
166
  }
131
167
  }
132
- exports.PortalService = PortalService;
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5mcmFzdHJ1Y3R1cmUvc2VydmljZXMvcG9ydGFsLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0NBQW9DO0FBQ3BDLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsdUNBYXVCO0FBQ3ZCLGtFQUF3RTtBQUV4RSxzREFBbUQ7QUFDbkQsNkNBQTRHO0FBSTVHLE1BQWEsYUFBYTtJQUExQjtRQUNtQixpQkFBWSxHQUFHLGlCQUFXLENBQUMscUJBQXFCLENBQUM7UUFDakQsWUFBTyxHQUFHLENBQUMsQ0FBQztRQWdFckIsOEJBQXlCLEdBQUcsQ0FBQyxRQUF5QixFQUFFLGVBQThCLEVBQVUsRUFBRTtZQUN4RyxNQUFNLEdBQUcsR0FBRyxlQUFlLEtBQUksUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLE9BQU8sQ0FBQSxDQUFDO1lBQ2pELE9BQU8sY0FBYyxHQUFHLGFBQUgsR0FBRyxjQUFILEdBQUcsR0FBSSxFQUFFLEVBQUUsQ0FBQztRQUNuQyxDQUFDLENBQUM7UUFFTSxvQkFBZSxHQUFHLENBQUMsbUJBQTJCLEVBQVUsRUFBRTtZQUNoRSxPQUFPLElBQUksWUFBTSxDQUFDO2dCQUNoQixxQ0FBcUMsRUFBRTtvQkFDckMsYUFBYSxFQUFFLG1CQUFtQjtpQkFDbkM7Z0JBQ0QsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2FBQ3RCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUVNLG1DQUE4QixHQUFHLEtBQUssRUFDNUMsOEJBQThELEVBQzlELG1CQUEyQixFQUNLLEVBQUU7WUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxpQkFBVyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7WUFDdkUsTUFBTSxRQUFRLEdBQ1osTUFBTSw4QkFBOEIsQ0FBQyxpQ0FBaUMsQ0FBQyxJ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
168
+ //# sourceMappingURL=portal-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-service.js","sourceRoot":"","sources":["../../../src/infrastructure/services/portal-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { DomainEvent } from "../../types/events/domain-event.js";
2
+ import { DirectoryPath } from "../../types/file/directoryPath.js";
3
+ export declare class TelemetryService {
4
+ private readonly configDirectory;
5
+ private readonly apiService;
6
+ constructor(configDirectory: DirectoryPath);
7
+ trackEvent<T extends DomainEvent>(event: T, shell: string): Promise<void>;
8
+ private getAuthInfo;
9
+ }
@@ -0,0 +1,38 @@
1
+ import process from "process";
2
+ import os from "os";
3
+ import fs from "fs-extra";
4
+ import { envInfo } from "../env-info.js";
5
+ import path from "path";
6
+ import { ApiService } from "./api-service.js";
7
+ export class TelemetryService {
8
+ constructor(configDirectory) {
9
+ this.configDirectory = configDirectory;
10
+ this.apiService = new ApiService();
11
+ }
12
+ async trackEvent(event, shell) {
13
+ const authInfo = await this.getAuthInfo(this.configDirectory.toString());
14
+ const telemetryOptedOut = process.env.APIMATIC_CLI_TELEMETRY_OPTOUT === "1";
15
+ const authKey = authInfo === null || authInfo === void 0 ? void 0 : authInfo.authKey;
16
+ if (telemetryOptedOut || (authInfo === null || authInfo === void 0 ? void 0 : authInfo.APIMATIC_CLI_TELEMETRY_OPTOUT) === "1" || !authKey) {
17
+ return;
18
+ }
19
+ const payload = {
20
+ payload: event,
21
+ timestamp: new Date().toISOString(),
22
+ cliVersion: envInfo.getCLIVersion(),
23
+ platform: os.platform(),
24
+ releaseVersion: os.release(),
25
+ nodeVersion: process.version
26
+ };
27
+ await this.apiService.sendTelemetry(JSON.stringify(payload), authKey, shell);
28
+ }
29
+ async getAuthInfo(configDirectory) {
30
+ try {
31
+ return JSON.parse(await fs.readFile(path.join(configDirectory, "config.json"), "utf8"));
32
+ }
33
+ catch (_a) {
34
+ return null;
35
+ }
36
+ }
37
+ }
38
+ //# sourceMappingURL=telemetry-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-service.js","sourceRoot":"","sources":["../../../src/infrastructure/services/telemetry-service.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,UAAU,CAAC;AAG1B,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAY9C,MAAM,OAAO,gBAAgB;IAG3B,YAA6B,eAA8B;QAA9B,oBAAe,GAAf,eAAe,CAAe;QAF1C,eAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IAEe,CAAC;IAExD,KAAK,CAAC,UAAU,CAAwB,KAAQ,EAAE,KAAa;QACpE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzE,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,GAAG,CAAC;QAC5E,MAAM,OAAO,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,CAAC;QAElC,IAAI,iBAAiB,IAAI,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,6BAA6B,MAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACrF,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAqB;YAChC,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,UAAU,EAAE,OAAO,CAAC,aAAa,EAAE;YACnC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;YACvB,cAAc,EAAE,EAAE,CAAC,OAAO,EAAE;YAC5B,WAAW,EAAE,OAAO,CAAC,OAAO;SAC7B,CAAC;QAEF,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC/E,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,eAAuB;QAC/C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1F,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ import { ExportFormats, ApiValidationSummary } from "@apimatic/sdk";
2
+ import { DirectoryPath } from "../../types/file/directoryPath.js";
3
+ import { FilePath } from "../../types/file/filePath.js";
4
+ import { CommandMetadata } from "../../types/common/command-metadata.js";
5
+ import { Result } from "neverthrow";
6
+ export interface TransformViaFileParams {
7
+ file: FilePath;
8
+ format: ExportFormats;
9
+ configDir: DirectoryPath;
10
+ commandMetadata: CommandMetadata;
11
+ authKey?: string | null;
12
+ }
13
+ export interface TransformationResultData {
14
+ stream: NodeJS.ReadableStream;
15
+ apiValidationSummary: ApiValidationSummary;
16
+ }
17
+ export declare class TransformationService {
18
+ private readonly CONTENT_TYPE;
19
+ transformViaFile({ file, format, configDir, commandMetadata, authKey }: TransformViaFileParams): Promise<Result<TransformationResultData, string>>;
20
+ private createAuthorizationHeader;
21
+ private readonly createOriginQueryParameter;
22
+ private readonly handleTransformationErrors;
23
+ }
@@ -0,0 +1,56 @@
1
+ import fsExtra from "fs-extra";
2
+ import { ContentType, FileWrapper, TransformationController, ApiError } from "@apimatic/sdk";
3
+ import { getAuthInfo } from "../../client-utils/auth-manager.js";
4
+ import { apiClientFactory } from "./api-client-factory.js";
5
+ import { err, ok } from "neverthrow";
6
+ export class TransformationService {
7
+ constructor() {
8
+ this.CONTENT_TYPE = ContentType.EnumMultipartformdata;
9
+ this.createOriginQueryParameter = (commandName) => {
10
+ return {
11
+ origin: `APIMATIC CLI ${commandName}`
12
+ };
13
+ };
14
+ this.handleTransformationErrors = async (error) => {
15
+ if (error instanceof ApiError) {
16
+ const apiError = error;
17
+ if (apiError.statusCode === 400) {
18
+ return "Your API Definition is invalid. Please use the APIMatic VS Code Extension to fix the errors and try again.";
19
+ }
20
+ else if (apiError.statusCode === 401) {
21
+ const message = JSON.parse(apiError.body).message;
22
+ return `${message} You are not authorized to perform this action. Please run 'auth:login' or provide a valid auth key.`;
23
+ }
24
+ return `Error ${apiError.statusCode}: An error occurred during the transformation. Please try again or contact support@apimatic.io for assistance.`;
25
+ }
26
+ else {
27
+ return "An unexpected error occurred while validating your API Definition. Please try again later. If the problem persists, please reach out to our team at support@apimatic.io";
28
+ }
29
+ };
30
+ }
31
+ async transformViaFile({ file, format, configDir, commandMetadata, authKey }) {
32
+ const authInfo = await getAuthInfo(configDir.toString());
33
+ const authorizationHeader = this.createAuthorizationHeader(authInfo, authKey !== null && authKey !== void 0 ? authKey : null);
34
+ const client = apiClientFactory.createApiClient(authorizationHeader, commandMetadata.shell);
35
+ const transformationController = new TransformationController(client);
36
+ try {
37
+ const fileStream = fsExtra.createReadStream(file.toString());
38
+ const fileWrapper = new FileWrapper(fileStream);
39
+ const generation = await transformationController.transformViaFile(this.CONTENT_TYPE, fileWrapper, format, this.createOriginQueryParameter(commandMetadata.commandName));
40
+ const { id, apiValidationSummary } = generation.result;
41
+ const { result } = await transformationController.downloadTransformedFile(id);
42
+ return ok({
43
+ stream: result,
44
+ apiValidationSummary
45
+ });
46
+ }
47
+ catch (error) {
48
+ return err(await this.handleTransformationErrors(error));
49
+ }
50
+ }
51
+ createAuthorizationHeader(authInfo, overrideAuthKey) {
52
+ const key = overrideAuthKey || (authInfo === null || authInfo === void 0 ? void 0 : authInfo.authKey);
53
+ return `X-Auth-Key ${key !== null && key !== void 0 ? key : ""}`;
54
+ }
55
+ }
56
+ //# sourceMappingURL=transformation-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformation-service.js","sourceRoot":"","sources":["../../../src/infrastructure/services/transformation-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { ApiValidationSummary } from "@apimatic/sdk";
2
+ import { DirectoryPath } from "../../types/file/directoryPath.js";
3
+ import { Result } from "neverthrow";
4
+ import { FilePath } from "../../types/file/filePath.js";
5
+ import { CommandMetadata } from "../../types/common/command-metadata.js";
6
+ export interface ValidateViaFileParams {
7
+ file: FilePath;
8
+ commandMetadata: CommandMetadata;
9
+ authKey?: string | null;
10
+ }
11
+ export declare class ValidationService {
12
+ private readonly configDir;
13
+ constructor(configDir: DirectoryPath);
14
+ validateViaFile({ file, commandMetadata, authKey }: ValidateViaFileParams): Promise<Result<ApiValidationSummary, string>>;
15
+ private createAuthorizationHeader;
16
+ private handleValidationErrors;
17
+ }
@@ -0,0 +1,49 @@
1
+ import fsExtra from "fs-extra";
2
+ import { ApiValidationExternalApisController, ContentType, FileWrapper, ApiError } from "@apimatic/sdk";
3
+ import { getAuthInfo } from "../../client-utils/auth-manager.js";
4
+ import { apiClientFactory } from "./api-client-factory.js";
5
+ import { err, ok } from "neverthrow";
6
+ export class ValidationService {
7
+ constructor(configDir) {
8
+ this.configDir = configDir;
9
+ }
10
+ async validateViaFile({ file, commandMetadata, authKey }) {
11
+ const authInfo = await getAuthInfo(this.configDir.toString());
12
+ const authorizationHeader = this.createAuthorizationHeader(authInfo, authKey !== null && authKey !== void 0 ? authKey : null);
13
+ const client = apiClientFactory.createApiClient(authorizationHeader, commandMetadata.shell);
14
+ const controller = new ApiValidationExternalApisController(client);
15
+ try {
16
+ const fileDescriptor = new FileWrapper(fsExtra.createReadStream(file.toString()));
17
+ //TODO: Update spec to include origin query parameter.
18
+ const validation = await controller.validateApiViaFile(ContentType.EnumMultipartformdata, fileDescriptor);
19
+ return ok(validation.result);
20
+ }
21
+ catch (error) {
22
+ return err(await this.handleValidationErrors(error));
23
+ }
24
+ }
25
+ createAuthorizationHeader(authInfo, overrideAuthKey) {
26
+ const key = overrideAuthKey || (authInfo === null || authInfo === void 0 ? void 0 : authInfo.authKey);
27
+ return `X-Auth-Key ${key !== null && key !== void 0 ? key : ""}`;
28
+ }
29
+ async handleValidationErrors(error) {
30
+ if (error instanceof ApiError) {
31
+ const apiError = error;
32
+ if (apiError.statusCode === 400) {
33
+ return "Your API Definition is invalid. Please fix the issues and try again.";
34
+ }
35
+ else if (apiError.statusCode === 401) {
36
+ return "You are not authorized to perform this action. Please run 'auth:login' or provide a valid auth key.";
37
+ }
38
+ else if (apiError.statusCode === 403) {
39
+ return "You do not have permission to perform this action.";
40
+ }
41
+ else if (apiError.statusCode === 500) {
42
+ return "An unexpected error occurred validating the API specification, please try again later. If the problem persists, please reach out to our team at support@apimatic.io";
43
+ }
44
+ return `Error ${apiError.statusCode}: An error occurred during validation.`;
45
+ }
46
+ return "Unexpected error occurred while validating API specification.";
47
+ }
48
+ }
49
+ //# sourceMappingURL=validation-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-service.js","sourceRoot":"","sources":["../../../src/infrastructure/services/validation-service.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,UAAU,CAAC;AAC/B,OAAO,EAEL,mCAAmC,EAEnC,WAAW,EACX,WAAW,EACX,QAAQ,EACT,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAY,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,EAAE,EAAU,MAAM,YAAY,CAAC;AAU7C,MAAM,OAAO,iBAAiB;IAC5B,YAA6B,SAAwB;QAAxB,cAAS,GAAT,SAAS,CAAe;IAAG,CAAC;IAEzD,KAAK,CAAC,eAAe,CAAC,EACpB,IAAI,EACJ,eAAe,EACf,OAAO,EACe;QACtB,MAAM,QAAQ,GAAoB,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/E,MAAM,mBAAmB,GAAG,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,IAAI,CAAC,CAAC;QACtF,MAAM,MAAM,GAAG,gBAAgB,CAAC,eAAe,CAAC,mBAAmB,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;QAC5F,MAAM,UAAU,GAAG,IAAI,mCAAmC,CAAC,MAAM,CAAC,CAAC;QAEnE,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAClF,sDAAsD;YACtD,MAAM,UAAU,GAAsC,MAAM,UAAU,CAAC,kBAAkB,CACvF,WAAW,CAAC,qBAAqB,EACjC,cAAc,CACf,CAAC;YAEF,OAAO,EAAE,CAAC,UAAU,CAAC,MAA8B,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAEO,yBAAyB,CAAC,QAAyB,EAAE,eAA8B;QACzF,MAAM,GAAG,GAAG,eAAe,KAAI,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,CAAA,CAAC;QACjD,OAAO,cAAc,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,EAAE,EAAE,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,KAAc;QACjD,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,KAAiB,CAAC;YAEnC,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAChC,OAAO,sEAAsE,CAAC;YAChF,CAAC;iBAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBACvC,OAAO,qGAAqG,CAAC;YAC/G,CAAC;iBAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBACvC,OAAO,oDAAoD,CAAC;YAC9D,CAAC;iBAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBACvC,OAAO,qKAAqK,CAAC;YAC/K,CAAC;YAED,OAAO,SAAS,QAAQ,CAAC,UAAU,wCAAwC,CAAC;QAC9E,CAAC;QAED,OAAO,+DAA+D,CAAC;IACzE,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ import { DirectoryPath } from "../types/file/directoryPath.js";
2
+ export declare function withDirPath<T>(fn: (results: DirectoryPath) => Promise<T>): Promise<T>;
@@ -0,0 +1,6 @@
1
+ import { DirectoryPath } from "../types/file/directoryPath.js";
2
+ import { withDir } from "tmp-promise";
3
+ export function withDirPath(fn) {
4
+ return withDir(results => fn(new DirectoryPath(results.path)), { unsafeCleanup: true });
5
+ }
6
+ //# sourceMappingURL=tmp-extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmp-extensions.js","sourceRoot":"","sources":["../../src/infrastructure/tmp-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,UAAU,WAAW,CACzB,EAA0C;IAE1C,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { DirectoryPath } from "../types/file/directoryPath.js";
2
+ import { FilePath } from "../types/file/filePath.js";
3
+ export declare class ZipService {
4
+ archive(sourceDir: DirectoryPath, outputZipPath: FilePath): Promise<void>;
5
+ unArchive(sourceFile: FilePath, destinationDirectory: DirectoryPath): Promise<void>;
6
+ }
@@ -0,0 +1,39 @@
1
+ import fs from "fs";
2
+ import archiver from "archiver";
3
+ import extract from "extract-zip";
4
+ export class ZipService {
5
+ async archive(sourceDir, outputZipPath) {
6
+ return new Promise((resolve, reject) => {
7
+ const output = fs.createWriteStream(outputZipPath.toString());
8
+ const archive = archiver("zip");
9
+ output.on("close", () => resolve());
10
+ archive.on("error", (err) => reject(err));
11
+ archive.pipe(output);
12
+ archive.directory(sourceDir.toString(), false); // false: don't nest under folder
13
+ archive.finalize();
14
+ });
15
+ }
16
+ async unArchive(sourceFile, destinationDirectory) {
17
+ const MAX_FILES = 100000;
18
+ const MAX_SIZE = 1000000000; // 1 GB
19
+ let fileCount = 0;
20
+ let totalSize = 0;
21
+ await extract(sourceFile.toString(), {
22
+ dir: destinationDirectory.toString(),
23
+ onEntry: function (entry) {
24
+ fileCount++;
25
+ if (fileCount > MAX_FILES) {
26
+ throw new Error("Reached max. file count");
27
+ }
28
+ // The uncompressedSize comes from the zip headers, so it might not be trustworthy.
29
+ // Alternatively, calculate the size from the readStream.
30
+ let entrySize = entry.uncompressedSize;
31
+ totalSize += entrySize;
32
+ if (totalSize > MAX_SIZE) {
33
+ throw new Error("Reached max. size");
34
+ }
35
+ }
36
+ });
37
+ }
38
+ }
39
+ //# sourceMappingURL=zip-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-service.js","sourceRoot":"","sources":["../../src/infrastructure/zip-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,OAAO,MAAM,aAAa,CAAC;AAIlC,MAAM,OAAO,UAAU;IACd,KAAK,CAAC,OAAO,CAAC,SAAwB,EAAE,aAAuB;QACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAEhC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACpC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAE1C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,iCAAiC;YACjF,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,UAAoB,EAAE,oBAAmC;QAC9E,MAAM,SAAS,GAAG,MAAO,CAAC;QAC1B,MAAM,QAAQ,GAAG,UAAa,CAAC,CAAC,OAAO;QACvC,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE;YACnC,GAAG,EAAE,oBAAoB,CAAC,QAAQ,EAAE;YACpC,OAAO,EAAE,UAAU,KAAK;gBACtB,SAAS,EAAE,CAAC;gBACZ,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;oBAC1B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAC7C,CAAC;gBACD,mFAAmF;gBACnF,yDAAyD;gBACzD,IAAI,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC;gBACvC,SAAS,IAAI,SAAS,CAAC;gBACvB,IAAI,SAAS,GAAG,QAAQ,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}