@aws/nx-plugin 1.0.0-rc.32 → 1.0.0-rc.34

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 (277) hide show
  1. package/LICENSE-THIRD-PARTY +75 -86
  2. package/generators.json +27 -0
  3. package/package.json +10 -10
  4. package/src/connection/generator.js +12 -1
  5. package/src/connection/generator.js.map +1 -1
  6. package/src/connection/supported-connections.d.ts +10 -1
  7. package/src/connection/supported-connections.js +13 -0
  8. package/src/connection/supported-connections.js.map +1 -1
  9. package/src/infra/app/__snapshots__/generator.spec.ts.snap +21 -21
  10. package/src/infra/app/files/app/src/main.ts.template +1 -1
  11. package/src/infra/app/files/app/src/stages/application-stage.ts.template +1 -1
  12. package/src/infra/app/generator.js +3 -1
  13. package/src/infra/app/generator.js.map +1 -1
  14. package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +12 -12
  15. package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +74 -10
  16. package/src/open-api/ts-client/__snapshots__/generator.content-type.spec.ts.snap +22 -4
  17. package/src/open-api/ts-client/__snapshots__/generator.duplicate-types.spec.ts.snap +53 -8
  18. package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +32 -4
  19. package/src/open-api/ts-client/__snapshots__/generator.fast-api-gaps.spec.ts.snap +736 -0
  20. package/src/open-api/ts-client/__snapshots__/generator.fast-api.spec.ts.snap +86 -11
  21. package/src/open-api/ts-client/__snapshots__/generator.multipart.spec.ts.snap +21 -3
  22. package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +2 -2
  23. package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +6 -6
  24. package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +2 -2
  25. package/src/open-api/ts-client/__snapshots__/generator.spec-compliance.spec.ts.snap +1883 -0
  26. package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +4 -4
  27. package/src/open-api/ts-client/files/client.gen.ts.template +196 -13
  28. package/src/open-api/ts-client/files/types.gen.ts.template +2 -0
  29. package/src/open-api/ts-client/generator.js +27 -2
  30. package/src/open-api/ts-client/generator.js.map +1 -1
  31. package/src/open-api/ts-hooks/files/options-proxy.gen.ts.template +2 -2
  32. package/src/open-api/ts-hooks/generator.js +5 -1
  33. package/src/open-api/ts-hooks/generator.js.map +1 -1
  34. package/src/open-api/utils/codegen-data/languages.js +6 -0
  35. package/src/open-api/utils/codegen-data/languages.js.map +1 -1
  36. package/src/open-api/utils/codegen-data/types.d.ts +16 -1
  37. package/src/open-api/utils/codegen-data/types.js.map +1 -1
  38. package/src/open-api/utils/codegen-data.js +71 -0
  39. package/src/open-api/utils/codegen-data.js.map +1 -1
  40. package/src/open-api/utils/normalise.js +53 -8
  41. package/src/open-api/utils/normalise.js.map +1 -1
  42. package/src/open-api/utils/parser.js +48 -15
  43. package/src/open-api/utils/parser.js.map +1 -1
  44. package/src/preset/__snapshots__/generator.spec.ts.snap +5 -3
  45. package/src/preset/generator.d.ts +1 -1
  46. package/src/preset/generator.js +5 -2
  47. package/src/preset/generator.js.map +1 -1
  48. package/src/preset/schema.d.js.map +1 -1
  49. package/src/preset/schema.d.ts +2 -0
  50. package/src/preset/schema.json +6 -0
  51. package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +7 -7
  52. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +8 -8
  53. package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +89 -3
  54. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +2 -2
  55. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +12 -12
  56. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
  57. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +91 -5
  58. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +2038 -0
  59. package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +104 -0
  60. package/src/py/rdb/agent-connection/generator.d.ts +10 -0
  61. package/src/py/rdb/agent-connection/generator.js +46 -0
  62. package/src/py/rdb/agent-connection/generator.js.map +1 -0
  63. package/src/py/rdb/agent-connection/schema.d.js +8 -0
  64. package/src/py/rdb/agent-connection/schema.d.js.map +1 -0
  65. package/src/py/rdb/agent-connection/schema.d.ts +15 -0
  66. package/src/py/rdb/agent-connection/schema.json +27 -0
  67. package/src/py/rdb/fast-api-connection/__snapshots__/generator.spec.ts.snap +44 -0
  68. package/src/py/rdb/fast-api-connection/files/__apiModuleName__/dependencies/__rdbNameSnake__.py.template +14 -0
  69. package/src/py/rdb/fast-api-connection/generator.d.ts +10 -0
  70. package/src/py/rdb/fast-api-connection/generator.js +54 -0
  71. package/src/py/rdb/fast-api-connection/generator.js.map +1 -0
  72. package/src/py/rdb/fast-api-connection/schema.d.js +8 -0
  73. package/src/py/rdb/fast-api-connection/schema.d.js.map +1 -0
  74. package/src/py/rdb/fast-api-connection/schema.d.ts +13 -0
  75. package/src/py/rdb/fast-api-connection/schema.json +23 -0
  76. package/src/py/rdb/files/Dockerfile.create-db-user.template +10 -0
  77. package/src/py/rdb/files/Dockerfile.migration.template +10 -0
  78. package/src/py/rdb/files/__name__/__init__.py.template +3 -0
  79. package/src/py/rdb/files/__name__/connection.py.template +55 -0
  80. package/src/py/rdb/files/__name__/create_db_user_handler.py.template +97 -0
  81. package/src/py/rdb/files/__name__/migration_handler.py.template +36 -0
  82. package/src/py/rdb/files/__name__/models/__init__.py.template +3 -0
  83. package/src/py/rdb/files/__name__/models/example.py.template +8 -0
  84. package/src/py/rdb/files/__name__/utils.py.template +104 -0
  85. package/src/py/rdb/files/alembic.ini.template +38 -0
  86. package/src/py/rdb/files/config.json.template +14 -0
  87. package/src/py/rdb/files/migrations/env.py.template +80 -0
  88. package/src/py/rdb/files/migrations/script.py.mako.template +28 -0
  89. package/src/py/rdb/generator.d.ts +6 -0
  90. package/src/py/rdb/generator.js +263 -0
  91. package/src/py/rdb/generator.js.map +1 -0
  92. package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +101 -0
  93. package/src/py/rdb/mcp-server-connection/generator.d.ts +10 -0
  94. package/src/py/rdb/mcp-server-connection/generator.js +46 -0
  95. package/src/py/rdb/mcp-server-connection/generator.js.map +1 -0
  96. package/src/py/rdb/mcp-server-connection/schema.d.js +8 -0
  97. package/src/py/rdb/mcp-server-connection/schema.d.js.map +1 -0
  98. package/src/py/rdb/mcp-server-connection/schema.d.ts +15 -0
  99. package/src/py/rdb/mcp-server-connection/schema.json +27 -0
  100. package/src/py/rdb/schema.d.js +6 -0
  101. package/src/py/rdb/schema.d.js.map +1 -0
  102. package/src/py/rdb/schema.d.ts +16 -0
  103. package/src/py/rdb/schema.json +77 -0
  104. package/src/py/rdb/utils.d.ts +6 -0
  105. package/src/py/rdb/utils.js +16 -0
  106. package/src/py/rdb/utils.js.map +1 -0
  107. package/src/sdk/py.d.ts +2 -0
  108. package/src/sdk/py.js +1 -0
  109. package/src/sdk/py.js.map +1 -1
  110. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +7 -7
  111. package/src/smithy/ts/api/files/handler.ts.template +2 -2
  112. package/src/smithy/ts/api/files/local-server.ts.template +2 -2
  113. package/src/smithy/ts/api/files/operations/echo.ts.template +2 -2
  114. package/src/smithy/ts/api/files/service.ts.template +3 -3
  115. package/src/smithy/ts/api/generator.js +3 -1
  116. package/src/smithy/ts/api/generator.js.map +1 -1
  117. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +12 -12
  118. package/src/trpc/backend/files/src/client/index.ts.template +1 -1
  119. package/src/trpc/backend/files/src/handler.ts.template +1 -1
  120. package/src/trpc/backend/files/src/index.ts.template +5 -5
  121. package/src/trpc/backend/files/src/init.ts.template +1 -1
  122. package/src/trpc/backend/files/src/local-server.ts.template +1 -1
  123. package/src/trpc/backend/files/src/middleware/index.ts.template +7 -7
  124. package/src/trpc/backend/files/src/procedures/echo.ts.template +2 -2
  125. package/src/trpc/backend/files/src/router.ts.template +2 -2
  126. package/src/trpc/backend/files/src/schema/index.ts.template +1 -1
  127. package/src/trpc/backend/generator.js +3 -1
  128. package/src/trpc/backend/generator.js.map +1 -1
  129. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +89 -3
  130. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client-strands.ts.template +2 -2
  131. package/src/ts/agent/a2a-connection/generator.js +3 -1
  132. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  133. package/src/ts/agent/files/a2a/index.ts.template +1 -1
  134. package/src/ts/agent/files/ag-ui/index.ts.template +1 -1
  135. package/src/ts/agent/files/http/client.ts.template +2 -2
  136. package/src/ts/agent/files/http/index.ts.template +2 -2
  137. package/src/ts/agent/files/http/router.ts.template +3 -3
  138. package/src/ts/agent/gateway-connection/files/agent-connection/app/__gatewayKebabCase__-client-strands.ts.template +2 -2
  139. package/src/ts/agent/gateway-connection/generator.js +3 -1
  140. package/src/ts/agent/gateway-connection/generator.js.map +1 -1
  141. package/src/ts/agent/generator.js +5 -2
  142. package/src/ts/agent/generator.js.map +1 -1
  143. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +2 -2
  144. package/src/ts/agent/mcp-connection/generator.js +3 -1
  145. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  146. package/src/ts/astro-docs/files/translation/scripts/translate.ts.template +3 -2
  147. package/src/ts/astro-docs/generator.js +2 -0
  148. package/src/ts/astro-docs/generator.js.map +1 -1
  149. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +2 -2
  150. package/src/ts/dynamodb/files/src/client.ts.template +5 -2
  151. package/src/ts/dynamodb/files/src/entities/example.ts.template +1 -1
  152. package/src/ts/dynamodb/files/src/entities/index.ts.template +1 -1
  153. package/src/ts/dynamodb/files/src/index.ts.template +2 -2
  154. package/src/ts/dynamodb/generator.js +3 -1
  155. package/src/ts/dynamodb/generator.js.map +1 -1
  156. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
  157. package/src/ts/lib/generator.js +7 -1
  158. package/src/ts/lib/generator.js.map +1 -1
  159. package/src/ts/lib/ts-project-utils.js +19 -4
  160. package/src/ts/lib/ts-project-utils.js.map +1 -1
  161. package/src/ts/lib/types.d.ts +6 -0
  162. package/src/ts/lib/types.js.map +1 -1
  163. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +94 -8
  164. package/src/ts/mcp-server/generator.js +3 -2
  165. package/src/ts/mcp-server/generator.js.map +1 -1
  166. package/src/ts/nx-generator/files/local/generator.ts.template +2 -2
  167. package/src/ts/nx-generator/files/nx-plugin-for-aws/generator/generator.ts.template +2 -2
  168. package/src/ts/nx-generator/generator.js +5 -2
  169. package/src/ts/nx-generator/generator.js.map +1 -1
  170. package/src/ts/nx-plugin/files/mcp-server/server.ts.template +5 -5
  171. package/src/ts/nx-plugin/files/mcp-server/tools/create-workspace-command.ts.template +2 -2
  172. package/src/ts/nx-plugin/files/mcp-server/tools/general-guidance.ts.template +1 -1
  173. package/src/ts/nx-plugin/files/mcp-server/tools/generator-guide.ts.template +2 -2
  174. package/src/ts/nx-plugin/files/mcp-server/tools/list-generators.ts.template +2 -2
  175. package/src/ts/nx-plugin/files/mcp-server/utils.ts.template +3 -3
  176. package/src/ts/nx-plugin/generator.js +3 -1
  177. package/src/ts/nx-plugin/generator.js.map +1 -1
  178. package/src/ts/nx-plugin/utils.js +7 -4
  179. package/src/ts/nx-plugin/utils.js.map +1 -1
  180. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +149 -177
  181. package/src/ts/rdb/files/src/create-db-user-handler.ts.template +2 -2
  182. package/src/ts/rdb/files/src/index.ts.template +1 -1
  183. package/src/ts/rdb/files/src/migration-handler.ts.template +1 -1
  184. package/src/ts/rdb/files/src/prisma.ts.template +7 -4
  185. package/src/ts/rdb/generator.js +7 -4
  186. package/src/ts/rdb/generator.js.map +1 -1
  187. package/src/ts/rdb/schema.json +1 -1
  188. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +45 -45
  189. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +2 -2
  190. package/src/utils/agent-chat/agent-chat.js +3 -1
  191. package/src/utils/agent-chat/agent-chat.js.map +1 -1
  192. package/src/utils/agent-chat/files/a2a/chat.ts.template +1 -1
  193. package/src/utils/agent-chat/files/ag-ui/chat.ts.template +1 -1
  194. package/src/utils/agent-chat/files/http-py/chat.ts.template +2 -2
  195. package/src/utils/agent-chat/files/http-ts/chat.ts.template +1 -1
  196. package/src/utils/agent-connection/agent-connection.js +4 -1
  197. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  198. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client-config.ts.template +2 -2
  199. package/src/utils/agent-connection/files/core-auth/agentcore-fetch.ts.template +1 -1
  200. package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-transport.ts.template +2 -2
  201. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-transport.ts.template +2 -2
  202. package/src/utils/agent-connection/files/core-shared/agentcore-transport.ts.template +1 -1
  203. package/src/utils/agent-connection/files/core-strands/a2a/agentcore-a2a-client-strands.ts.template +1 -1
  204. package/src/utils/agent-connection/files/core-strands/base/with-session-id-strands.ts.template +1 -1
  205. package/src/utils/agent-connection/files/core-strands/gateway/agentcore-gateway-mcp-client-strands.ts.template +1 -1
  206. package/src/utils/agent-connection/files/core-strands/mcp/agentcore-mcp-client-strands.ts.template +1 -1
  207. package/src/utils/agent-core-constructs/agent-core-constructs.js +10 -3
  208. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  209. package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +3 -3
  210. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +4 -4
  211. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +1 -1
  212. package/src/utils/agent-core-constructs/files/terraform/app/agent-core/__nameKebabCase__/__nameKebabCase__.tf.template +27 -0
  213. package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +60 -1
  214. package/src/utils/api-constructs/api-constructs.js +8 -2
  215. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  216. package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +8 -8
  217. package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +8 -8
  218. package/src/utils/api-constructs/files/cdk/core/api/http/http-api.ts.template +3 -3
  219. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account/index.js.template +32 -20
  220. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account.ts.template +1 -1
  221. package/src/utils/api-constructs/files/cdk/core/api/rest/rest-api.ts.template +4 -4
  222. package/src/utils/api-constructs/files/cdk/core/api/trpc/trpc-utils.ts.template +1 -1
  223. package/src/utils/ast.js +16 -0
  224. package/src/utils/ast.js.map +1 -1
  225. package/src/utils/commands.d.ts +1 -1
  226. package/src/utils/commands.js +4 -1
  227. package/src/utils/commands.js.map +1 -1
  228. package/src/utils/dynamodb-constructs/dynamodb-constructs.js +9 -2
  229. package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -1
  230. package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +3 -3
  231. package/src/utils/dynamodb-constructs/files/cdk/core/dynamodb.ts.template +1 -1
  232. package/src/utils/files/common/constructs/src/core/index.ts.template +4 -4
  233. package/src/utils/files/common/constructs/src/index.ts.template +2 -2
  234. package/src/utils/files/common/infra-config/src/index.ts.template +3 -3
  235. package/src/utils/files/common/infra-config/src/resolve-stage.ts.template +2 -2
  236. package/src/utils/files/common/infra-config/src/stages.config.ts.template +1 -1
  237. package/src/utils/files/common/scripts/src/infra/infra-deploy.ts.template +1 -1
  238. package/src/utils/files/common/scripts/src/infra/infra-destroy.ts.template +1 -1
  239. package/src/utils/files/common/scripts/src/infra/stage-credentials/run.ts.template +3 -3
  240. package/src/utils/files/common/shadcn/src/index.ts.template +2 -2
  241. package/src/utils/function-constructs/files/cdk/app/lambda-functions/__nameKebabCase__.ts.template +1 -1
  242. package/src/utils/function-constructs/function-constructs.js +3 -1
  243. package/src/utils/function-constructs/function-constructs.js.map +1 -1
  244. package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +2 -2
  245. package/src/utils/identity-constructs/identity-constructs.js +5 -1
  246. package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
  247. package/src/utils/module-format.d.ts +28 -0
  248. package/src/utils/module-format.js +28 -0
  249. package/src/utils/module-format.js.map +1 -0
  250. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +61 -17
  251. package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +68 -78
  252. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +88 -8
  253. package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +5 -32
  254. package/src/utils/rdb-constructs/rdb-constructs.d.ts +11 -1
  255. package/src/utils/rdb-constructs/rdb-constructs.js +9 -2
  256. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  257. package/src/utils/shared-constructs.js +12 -22
  258. package/src/utils/shared-constructs.js.map +1 -1
  259. package/src/utils/shared-infra-config.js +3 -1
  260. package/src/utils/shared-infra-config.js.map +1 -1
  261. package/src/utils/shared-infra-scripts.js +3 -1
  262. package/src/utils/shared-infra-scripts.js.map +1 -1
  263. package/src/utils/shared-rdb-scripts.js +5 -1
  264. package/src/utils/shared-rdb-scripts.js.map +1 -1
  265. package/src/utils/shared-shadcn.js +3 -1
  266. package/src/utils/shared-shadcn.js.map +1 -1
  267. package/src/utils/test.d.ts +2 -0
  268. package/src/utils/test.js +7 -1
  269. package/src/utils/test.js.map +1 -1
  270. package/src/utils/versions.d.ts +73 -69
  271. package/src/utils/versions.js +71 -67
  272. package/src/utils/versions.js.map +1 -1
  273. package/src/utils/website-constructs/files/cdk/app/static-websites/__websiteNameKebabCase__.ts.template +2 -2
  274. package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +2 -2
  275. package/src/utils/website-constructs/website-constructs.js +9 -2
  276. package/src/utils/website-constructs/website-constructs.js.map +1 -1
  277. package/src/utils/files/terraform/scripts/reset-runtime-config.ts.template +0 -25
@@ -0,0 +1,736 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`openApiTsClientGenerator - FastAPI gaps > JSON-encoded primitive responses > should JSON-parse primitives on a JSON wire and keep text/plain raw > client.gen.ts 1`] = `
4
+ "/**
5
+ * Utility for serialisation and deserialisation of API types.
6
+ */
7
+ export class $IO {
8
+ public static $mapValues = (data: any, fn: (item: any) => any) =>
9
+ Object.fromEntries(Object.entries(data).map(([k, v]) => [k, fn(v)]));
10
+ }
11
+
12
+ /**
13
+ * Client configuration for TestApi
14
+ */
15
+ export interface TestApiConfig {
16
+ /**
17
+ * Base URL for the API
18
+ */
19
+ url: string;
20
+ /**
21
+ * Custom instance of fetch. By default the global 'fetch' is used.
22
+ * You can override this to add custom middleware for use cases such as adding authentication headers.
23
+ */
24
+ fetch?: typeof fetch;
25
+ /**
26
+ * Additional configuration
27
+ */
28
+ options?: {
29
+ /**
30
+ * By default, the client will add a Content-Type header, set to the media type defined for
31
+ * the request in the OpenAPI specification.
32
+ * Set this to false to omit this header.
33
+ */
34
+ omitContentTypeHeader?: boolean;
35
+ };
36
+ }
37
+
38
+ /**
39
+ * API Client for TestApi
40
+ */
41
+ export class TestApi {
42
+ private $config: TestApiConfig;
43
+
44
+ constructor(config: TestApiConfig) {
45
+ this.$config = config;
46
+
47
+ this.plainStamp = this.plainStamp.bind(this);
48
+ this.plainStr = this.plainStr.bind(this);
49
+ this.plainText = this.plainText.bind(this);
50
+ }
51
+
52
+ private $collectionDelimiters: { [format: string]: string } = {
53
+ csv: ',',
54
+ ssv: ' ',
55
+ pipes: '|',
56
+ };
57
+
58
+ private $deepObject = (key: string, value: any): string[] => {
59
+ if (value === undefined || value === null) {
60
+ return [];
61
+ }
62
+ if (typeof value !== 'object') {
63
+ return [\`\${key}=\${encodeURIComponent(String(value))}\`];
64
+ }
65
+ return Object.entries(value).flatMap(([prop, v]) =>
66
+ this.$deepObject(\`\${key}[\${encodeURIComponent(prop)}]\`, v),
67
+ );
68
+ };
69
+
70
+ private $url = (
71
+ path: string,
72
+ pathParameters: { [key: string]: any },
73
+ queryParameters: { [key: string]: any },
74
+ collectionFormats?: {
75
+ [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' | 'deepObject';
76
+ },
77
+ ): string => {
78
+ const baseUrl = this.$config.url.endsWith('/')
79
+ ? this.$config.url.slice(0, -1)
80
+ : this.$config.url;
81
+ const pathWithParameters = Object.entries(pathParameters).reduce(
82
+ (withParams, [key, value]) =>
83
+ withParams.replace(\`{\${key}}\`, encodeURIComponent(\`\${value}\`)),
84
+ path,
85
+ );
86
+ const queryString = Object.entries(queryParameters)
87
+ .flatMap(([key, value]) => {
88
+ if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
89
+ return value.map(
90
+ (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
91
+ );
92
+ }
93
+ if (
94
+ collectionFormats?.[key] === 'deepObject' &&
95
+ value !== null &&
96
+ typeof value === 'object'
97
+ ) {
98
+ return this.$deepObject(encodeURIComponent(key), value);
99
+ }
100
+ const delimiter =
101
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
102
+ return [
103
+ \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(delimiter) : String(value))}\`,
104
+ ];
105
+ })
106
+ .join('&');
107
+ return (
108
+ baseUrl + pathWithParameters + (queryString ? \`?\${queryString}\` : '')
109
+ );
110
+ };
111
+
112
+ private $headers = (
113
+ headerParameters: { [key: string]: any },
114
+ collectionFormats?: { [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' },
115
+ ): [string, string][] => {
116
+ return Object.entries(headerParameters).flatMap(([key, value]) => {
117
+ if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
118
+ return value.map((v) => [key, String(v)]) as [string, string][];
119
+ }
120
+ const delimiter =
121
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
122
+ return [
123
+ [
124
+ key,
125
+ Array.isArray(value)
126
+ ? value.map(String).join(delimiter)
127
+ : String(value),
128
+ ],
129
+ ];
130
+ });
131
+ };
132
+
133
+ private $fetch: typeof fetch = (...args) =>
134
+ (this.$config.fetch ?? fetch)(...args);
135
+
136
+ public async plainStamp(): Promise<Date> {
137
+ const pathParameters: { [key: string]: any } = {};
138
+ const queryParameters: { [key: string]: any } = {};
139
+ const headerParameters: { [key: string]: any } = {};
140
+
141
+ const body = undefined;
142
+
143
+ const response = await this.$fetch(
144
+ this.$url('/plain-stamp', pathParameters, queryParameters),
145
+ {
146
+ headers: this.$headers(headerParameters),
147
+ method: 'GET',
148
+ body,
149
+ },
150
+ );
151
+
152
+ if (response.status === 200) {
153
+ return new Date(await response.json());
154
+ }
155
+ throw new Error(
156
+ \`Unknown response status \${response.status} returned by API\`,
157
+ );
158
+ }
159
+
160
+ public async plainStr(): Promise<string> {
161
+ const pathParameters: { [key: string]: any } = {};
162
+ const queryParameters: { [key: string]: any } = {};
163
+ const headerParameters: { [key: string]: any } = {};
164
+
165
+ const body = undefined;
166
+
167
+ const response = await this.$fetch(
168
+ this.$url('/plain-str', pathParameters, queryParameters),
169
+ {
170
+ headers: this.$headers(headerParameters),
171
+ method: 'GET',
172
+ body,
173
+ },
174
+ );
175
+
176
+ if (response.status === 200) {
177
+ return await response.json();
178
+ }
179
+ throw new Error(
180
+ \`Unknown response status \${response.status} returned by API\`,
181
+ );
182
+ }
183
+
184
+ public async plainText(): Promise<string> {
185
+ const pathParameters: { [key: string]: any } = {};
186
+ const queryParameters: { [key: string]: any } = {};
187
+ const headerParameters: { [key: string]: any } = {};
188
+
189
+ const body = undefined;
190
+
191
+ const response = await this.$fetch(
192
+ this.$url('/plain-text', pathParameters, queryParameters),
193
+ {
194
+ headers: this.$headers(headerParameters),
195
+ method: 'GET',
196
+ body,
197
+ },
198
+ );
199
+
200
+ if (response.status === 200) {
201
+ return await response.text();
202
+ }
203
+ throw new Error(
204
+ \`Unknown response status \${response.status} returned by API\`,
205
+ );
206
+ }
207
+ }
208
+ "
209
+ `;
210
+
211
+ exports[`openApiTsClientGenerator - FastAPI gaps > JSON-encoded primitive responses > should JSON-parse primitives on a JSON wire and keep text/plain raw > types.gen.ts 1`] = `
212
+ "export type PlainStampError = never;
213
+ export type PlainStrError = never;
214
+ export type PlainTextError = never;
215
+ "
216
+ `;
217
+
218
+ exports[`openApiTsClientGenerator - FastAPI gaps > tuples (3.1 prefixItems) > should type tuples positionally and revive dates inside them > client.gen.ts 1`] = `
219
+ "import type { TupleOutput, PutTuplesRequest } from './types.gen.js';
220
+
221
+ /**
222
+ * Utility for serialisation and deserialisation of API types.
223
+ */
224
+ export class $IO {
225
+ public static $mapValues = (data: any, fn: (item: any) => any) =>
226
+ Object.fromEntries(Object.entries(data).map(([k, v]) => [k, fn(v)]));
227
+
228
+ public static TupleOutput = {
229
+ toJson: (model: TupleOutput): any => {
230
+ if (model === undefined || model === null) {
231
+ return model;
232
+ }
233
+ return {
234
+ ...(model.pair === undefined
235
+ ? {}
236
+ : {
237
+ pair: model.pair,
238
+ }),
239
+ ...(model.stamped === undefined
240
+ ? {}
241
+ : {
242
+ stamped: [
243
+ (model.stamped as any)[0],
244
+ (model.stamped as any)[1].toISOString(),
245
+ ],
246
+ }),
247
+ ...(model.points === undefined
248
+ ? {}
249
+ : {
250
+ points: model.points,
251
+ }),
252
+ };
253
+ },
254
+ fromJson: (json: any): TupleOutput => {
255
+ if (json === undefined || json === null) {
256
+ return json;
257
+ }
258
+ return {
259
+ pair: json['pair'],
260
+ stamped: [json['stamped'][0], new Date(json['stamped'][1])] as [
261
+ string,
262
+ Date,
263
+ ],
264
+ points: json['points'],
265
+ };
266
+ },
267
+ };
268
+ }
269
+
270
+ /**
271
+ * Client configuration for TestApi
272
+ */
273
+ export interface TestApiConfig {
274
+ /**
275
+ * Base URL for the API
276
+ */
277
+ url: string;
278
+ /**
279
+ * Custom instance of fetch. By default the global 'fetch' is used.
280
+ * You can override this to add custom middleware for use cases such as adding authentication headers.
281
+ */
282
+ fetch?: typeof fetch;
283
+ /**
284
+ * Additional configuration
285
+ */
286
+ options?: {
287
+ /**
288
+ * By default, the client will add a Content-Type header, set to the media type defined for
289
+ * the request in the OpenAPI specification.
290
+ * Set this to false to omit this header.
291
+ */
292
+ omitContentTypeHeader?: boolean;
293
+ };
294
+ }
295
+
296
+ /**
297
+ * API Client for TestApi
298
+ */
299
+ export class TestApi {
300
+ private $config: TestApiConfig;
301
+
302
+ constructor(config: TestApiConfig) {
303
+ this.$config = config;
304
+
305
+ this.getTuples = this.getTuples.bind(this);
306
+ this.putTuples = this.putTuples.bind(this);
307
+ }
308
+
309
+ private $collectionDelimiters: { [format: string]: string } = {
310
+ csv: ',',
311
+ ssv: ' ',
312
+ pipes: '|',
313
+ };
314
+
315
+ private $deepObject = (key: string, value: any): string[] => {
316
+ if (value === undefined || value === null) {
317
+ return [];
318
+ }
319
+ if (typeof value !== 'object') {
320
+ return [\`\${key}=\${encodeURIComponent(String(value))}\`];
321
+ }
322
+ return Object.entries(value).flatMap(([prop, v]) =>
323
+ this.$deepObject(\`\${key}[\${encodeURIComponent(prop)}]\`, v),
324
+ );
325
+ };
326
+
327
+ private $url = (
328
+ path: string,
329
+ pathParameters: { [key: string]: any },
330
+ queryParameters: { [key: string]: any },
331
+ collectionFormats?: {
332
+ [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' | 'deepObject';
333
+ },
334
+ ): string => {
335
+ const baseUrl = this.$config.url.endsWith('/')
336
+ ? this.$config.url.slice(0, -1)
337
+ : this.$config.url;
338
+ const pathWithParameters = Object.entries(pathParameters).reduce(
339
+ (withParams, [key, value]) =>
340
+ withParams.replace(\`{\${key}}\`, encodeURIComponent(\`\${value}\`)),
341
+ path,
342
+ );
343
+ const queryString = Object.entries(queryParameters)
344
+ .flatMap(([key, value]) => {
345
+ if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
346
+ return value.map(
347
+ (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
348
+ );
349
+ }
350
+ if (
351
+ collectionFormats?.[key] === 'deepObject' &&
352
+ value !== null &&
353
+ typeof value === 'object'
354
+ ) {
355
+ return this.$deepObject(encodeURIComponent(key), value);
356
+ }
357
+ const delimiter =
358
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
359
+ return [
360
+ \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(delimiter) : String(value))}\`,
361
+ ];
362
+ })
363
+ .join('&');
364
+ return (
365
+ baseUrl + pathWithParameters + (queryString ? \`?\${queryString}\` : '')
366
+ );
367
+ };
368
+
369
+ private $headers = (
370
+ headerParameters: { [key: string]: any },
371
+ collectionFormats?: { [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' },
372
+ ): [string, string][] => {
373
+ return Object.entries(headerParameters).flatMap(([key, value]) => {
374
+ if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
375
+ return value.map((v) => [key, String(v)]) as [string, string][];
376
+ }
377
+ const delimiter =
378
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
379
+ return [
380
+ [
381
+ key,
382
+ Array.isArray(value)
383
+ ? value.map(String).join(delimiter)
384
+ : String(value),
385
+ ],
386
+ ];
387
+ });
388
+ };
389
+
390
+ private $fetch: typeof fetch = (...args) =>
391
+ (this.$config.fetch ?? fetch)(...args);
392
+
393
+ public async getTuples(): Promise<TupleOutput> {
394
+ const pathParameters: { [key: string]: any } = {};
395
+ const queryParameters: { [key: string]: any } = {};
396
+ const headerParameters: { [key: string]: any } = {};
397
+
398
+ const body = undefined;
399
+
400
+ const response = await this.$fetch(
401
+ this.$url('/tuples', pathParameters, queryParameters),
402
+ {
403
+ headers: this.$headers(headerParameters),
404
+ method: 'GET',
405
+ body,
406
+ },
407
+ );
408
+
409
+ if (response.status === 200) {
410
+ return $IO.TupleOutput.fromJson(await response.json());
411
+ }
412
+ throw new Error(
413
+ \`Unknown response status \${response.status} returned by API\`,
414
+ );
415
+ }
416
+
417
+ public async putTuples(input: PutTuplesRequest): Promise<void> {
418
+ const pathParameters: { [key: string]: any } = {};
419
+ const queryParameters: { [key: string]: any } = {};
420
+ const headerParameters: { [key: string]: any } = {};
421
+ if (!this.$config.options?.omitContentTypeHeader) {
422
+ headerParameters['Content-Type'] = 'application/json';
423
+ }
424
+ const body =
425
+ typeof input === 'object'
426
+ ? JSON.stringify($IO.TupleOutput.toJson(input))
427
+ : String($IO.TupleOutput.toJson(input));
428
+
429
+ const response = await this.$fetch(
430
+ this.$url('/tuples', pathParameters, queryParameters),
431
+ {
432
+ headers: this.$headers(headerParameters),
433
+ method: 'POST',
434
+ body,
435
+ },
436
+ );
437
+
438
+ if (response.status === 204) {
439
+ return undefined;
440
+ }
441
+ throw new Error(
442
+ \`Unknown response status \${response.status} returned by API\`,
443
+ );
444
+ }
445
+ }
446
+ "
447
+ `;
448
+
449
+ exports[`openApiTsClientGenerator - FastAPI gaps > tuples (3.1 prefixItems) > should type tuples positionally and revive dates inside them > types.gen.ts 1`] = `
450
+ "export type TupleOutput = {
451
+ pair: [number, string];
452
+ stamped: [string, Date];
453
+ points: Array<[number, number]>;
454
+ };
455
+ export type GetTuplesError = never;
456
+
457
+ export type PutTuplesRequest = TupleOutput;
458
+ export type PutTuplesError = never;
459
+ "
460
+ `;
461
+
462
+ exports[`openApiTsClientGenerator - FastAPI gaps > urlencoded form bodies > should send urlencoded key=value pairs, not JSON > client.gen.ts 1`] = `
463
+ "import type {
464
+ Login200Response,
465
+ LoginRequestContent,
466
+ LoginRequest,
467
+ } from './types.gen.js';
468
+
469
+ /**
470
+ * Utility for serialisation and deserialisation of API types.
471
+ */
472
+ export class $IO {
473
+ public static $mapValues = (data: any, fn: (item: any) => any) =>
474
+ Object.fromEntries(Object.entries(data).map(([k, v]) => [k, fn(v)]));
475
+
476
+ public static Login200Response = {
477
+ toJson: (model: Login200Response): any => {
478
+ if (model === undefined || model === null) {
479
+ return model;
480
+ }
481
+ return {
482
+ ...(model.username === undefined
483
+ ? {}
484
+ : {
485
+ username: model.username,
486
+ }),
487
+ };
488
+ },
489
+ fromJson: (json: any): Login200Response => {
490
+ if (json === undefined || json === null) {
491
+ return json;
492
+ }
493
+ return {
494
+ username: json['username'],
495
+ };
496
+ },
497
+ };
498
+
499
+ public static LoginRequestContent = {
500
+ toJson: (model: LoginRequestContent): any => {
501
+ if (model === undefined || model === null) {
502
+ return model;
503
+ }
504
+ return {
505
+ ...(model.username === undefined
506
+ ? {}
507
+ : {
508
+ username: model.username,
509
+ }),
510
+ ...(model.password === undefined
511
+ ? {}
512
+ : {
513
+ password: model.password,
514
+ }),
515
+ ...(model.remember === undefined
516
+ ? {}
517
+ : {
518
+ remember: model.remember,
519
+ }),
520
+ ...(model.scopes === undefined
521
+ ? {}
522
+ : {
523
+ scopes: model.scopes,
524
+ }),
525
+ };
526
+ },
527
+ fromJson: (json: any): LoginRequestContent => {
528
+ if (json === undefined || json === null) {
529
+ return json;
530
+ }
531
+ return {
532
+ username: json['username'],
533
+ password: json['password'],
534
+ ...(json['remember'] === undefined
535
+ ? {}
536
+ : {
537
+ remember: json['remember'],
538
+ }),
539
+ ...(json['scopes'] === undefined
540
+ ? {}
541
+ : {
542
+ scopes: json['scopes'],
543
+ }),
544
+ };
545
+ },
546
+ };
547
+ }
548
+
549
+ /**
550
+ * Client configuration for TestApi
551
+ */
552
+ export interface TestApiConfig {
553
+ /**
554
+ * Base URL for the API
555
+ */
556
+ url: string;
557
+ /**
558
+ * Custom instance of fetch. By default the global 'fetch' is used.
559
+ * You can override this to add custom middleware for use cases such as adding authentication headers.
560
+ */
561
+ fetch?: typeof fetch;
562
+ /**
563
+ * Additional configuration
564
+ */
565
+ options?: {
566
+ /**
567
+ * By default, the client will add a Content-Type header, set to the media type defined for
568
+ * the request in the OpenAPI specification.
569
+ * Set this to false to omit this header.
570
+ */
571
+ omitContentTypeHeader?: boolean;
572
+ };
573
+ }
574
+
575
+ /**
576
+ * API Client for TestApi
577
+ */
578
+ export class TestApi {
579
+ private $config: TestApiConfig;
580
+
581
+ constructor(config: TestApiConfig) {
582
+ this.$config = config;
583
+
584
+ this.login = this.login.bind(this);
585
+ }
586
+
587
+ private $collectionDelimiters: { [format: string]: string } = {
588
+ csv: ',',
589
+ ssv: ' ',
590
+ pipes: '|',
591
+ };
592
+
593
+ private $deepObject = (key: string, value: any): string[] => {
594
+ if (value === undefined || value === null) {
595
+ return [];
596
+ }
597
+ if (typeof value !== 'object') {
598
+ return [\`\${key}=\${encodeURIComponent(String(value))}\`];
599
+ }
600
+ return Object.entries(value).flatMap(([prop, v]) =>
601
+ this.$deepObject(\`\${key}[\${encodeURIComponent(prop)}]\`, v),
602
+ );
603
+ };
604
+
605
+ private $url = (
606
+ path: string,
607
+ pathParameters: { [key: string]: any },
608
+ queryParameters: { [key: string]: any },
609
+ collectionFormats?: {
610
+ [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' | 'deepObject';
611
+ },
612
+ ): string => {
613
+ const baseUrl = this.$config.url.endsWith('/')
614
+ ? this.$config.url.slice(0, -1)
615
+ : this.$config.url;
616
+ const pathWithParameters = Object.entries(pathParameters).reduce(
617
+ (withParams, [key, value]) =>
618
+ withParams.replace(\`{\${key}}\`, encodeURIComponent(\`\${value}\`)),
619
+ path,
620
+ );
621
+ const queryString = Object.entries(queryParameters)
622
+ .flatMap(([key, value]) => {
623
+ if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
624
+ return value.map(
625
+ (v) => \`\${encodeURIComponent(key)}=\${encodeURIComponent(\`\${v}\`)}\`,
626
+ );
627
+ }
628
+ if (
629
+ collectionFormats?.[key] === 'deepObject' &&
630
+ value !== null &&
631
+ typeof value === 'object'
632
+ ) {
633
+ return this.$deepObject(encodeURIComponent(key), value);
634
+ }
635
+ const delimiter =
636
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
637
+ return [
638
+ \`\${encodeURIComponent(key)}=\${encodeURIComponent(Array.isArray(value) ? value.map(String).join(delimiter) : String(value))}\`,
639
+ ];
640
+ })
641
+ .join('&');
642
+ return (
643
+ baseUrl + pathWithParameters + (queryString ? \`?\${queryString}\` : '')
644
+ );
645
+ };
646
+
647
+ private $headers = (
648
+ headerParameters: { [key: string]: any },
649
+ collectionFormats?: { [key: string]: 'multi' | 'csv' | 'ssv' | 'pipes' },
650
+ ): [string, string][] => {
651
+ return Object.entries(headerParameters).flatMap(([key, value]) => {
652
+ if (Array.isArray(value) && collectionFormats?.[key] === 'multi') {
653
+ return value.map((v) => [key, String(v)]) as [string, string][];
654
+ }
655
+ const delimiter =
656
+ this.$collectionDelimiters[collectionFormats?.[key] ?? 'csv'] ?? ',';
657
+ return [
658
+ [
659
+ key,
660
+ Array.isArray(value)
661
+ ? value.map(String).join(delimiter)
662
+ : String(value),
663
+ ],
664
+ ];
665
+ });
666
+ };
667
+
668
+ private $urlEncodedForm = (model: {
669
+ [key: string]: any;
670
+ }): URLSearchParams => {
671
+ const params = new URLSearchParams();
672
+ const append = (key: string, value: any): void => {
673
+ if (value === undefined || value === null) {
674
+ return;
675
+ }
676
+ if (Array.isArray(value)) {
677
+ value.forEach((v) => append(key, v));
678
+ } else if (typeof value === 'object') {
679
+ params.append(key, JSON.stringify(value));
680
+ } else {
681
+ params.append(key, String(value));
682
+ }
683
+ };
684
+ Object.entries(model).forEach(([key, value]) => append(key, value));
685
+ return params;
686
+ };
687
+
688
+ private $fetch: typeof fetch = (...args) =>
689
+ (this.$config.fetch ?? fetch)(...args);
690
+
691
+ public async login(input: LoginRequest): Promise<Login200Response> {
692
+ const pathParameters: { [key: string]: any } = {};
693
+ const queryParameters: { [key: string]: any } = {};
694
+ const headerParameters: { [key: string]: any } = {};
695
+ if (!this.$config.options?.omitContentTypeHeader) {
696
+ headerParameters['Content-Type'] = 'application/x-www-form-urlencoded';
697
+ }
698
+ const body = this.$urlEncodedForm(
699
+ $IO.LoginRequestContent.toJson(input),
700
+ ).toString();
701
+
702
+ const response = await this.$fetch(
703
+ this.$url('/login', pathParameters, queryParameters),
704
+ {
705
+ headers: this.$headers(headerParameters),
706
+ method: 'POST',
707
+ body,
708
+ },
709
+ );
710
+
711
+ if (response.status === 200) {
712
+ return $IO.Login200Response.fromJson(await response.json());
713
+ }
714
+ throw new Error(
715
+ \`Unknown response status \${response.status} returned by API\`,
716
+ );
717
+ }
718
+ }
719
+ "
720
+ `;
721
+
722
+ exports[`openApiTsClientGenerator - FastAPI gaps > urlencoded form bodies > should send urlencoded key=value pairs, not JSON > types.gen.ts 1`] = `
723
+ "export type Login200Response = {
724
+ username: string;
725
+ };
726
+ export type LoginRequestContent = {
727
+ username: string;
728
+ password: string;
729
+ remember?: boolean;
730
+ scopes?: Array<string>;
731
+ };
732
+
733
+ export type LoginRequest = LoginRequestContent;
734
+ export type LoginError = never;
735
+ "
736
+ `;