zuplo 6.67.32 → 6.68.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (644) hide show
  1. package/README.md +9 -0
  2. package/docs/_index.md +44 -0
  3. package/docs/ai-gateway/apps.mdx +28 -0
  4. package/docs/ai-gateway/custom-providers.mdx +54 -0
  5. package/docs/ai-gateway/getting-started.mdx +224 -0
  6. package/docs/ai-gateway/guardrails.mdx +65 -0
  7. package/docs/ai-gateway/integrations/ai-sdk.mdx +109 -0
  8. package/docs/ai-gateway/integrations/claude-code.mdx +49 -0
  9. package/docs/ai-gateway/integrations/codex.mdx +78 -0
  10. package/docs/ai-gateway/integrations/goose.mdx +104 -0
  11. package/docs/ai-gateway/integrations/langchain.mdx +66 -0
  12. package/docs/ai-gateway/integrations/openai.mdx +99 -0
  13. package/docs/ai-gateway/introduction.mdx +85 -0
  14. package/docs/ai-gateway/managing-apps.mdx +46 -0
  15. package/docs/ai-gateway/managing-providers.mdx +66 -0
  16. package/docs/ai-gateway/managing-teams.mdx +63 -0
  17. package/docs/ai-gateway/policies/akamai-ai-firewall.mdx +125 -0
  18. package/docs/ai-gateway/policies/comet-opik-tracing.mdx +139 -0
  19. package/docs/ai-gateway/policies/galileo-tracing.mdx +147 -0
  20. package/docs/ai-gateway/providers.mdx +32 -0
  21. package/docs/ai-gateway/teams.mdx +38 -0
  22. package/docs/ai-gateway/universal-api.mdx +43 -0
  23. package/docs/ai-gateway/usage-limits.mdx +89 -0
  24. package/docs/api-management/introduction.md +127 -0
  25. package/docs/articles/accounts/audit-logs.mdx +227 -0
  26. package/docs/articles/accounts/billing.mdx +25 -0
  27. package/docs/articles/accounts/default-api-key.mdx +30 -0
  28. package/docs/articles/accounts/delete-account.mdx +36 -0
  29. package/docs/articles/accounts/enterprise-sso.mdx +116 -0
  30. package/docs/articles/accounts/managing-account-members.mdx +45 -0
  31. package/docs/articles/accounts/managing-project-members.mdx +37 -0
  32. package/docs/articles/accounts/members-and-roles.mdx +21 -0
  33. package/docs/articles/accounts/roles-and-permissions.mdx +115 -0
  34. package/docs/articles/accounts/zuplo-api-keys.mdx +94 -0
  35. package/docs/articles/add-api-to-backstage.mdx +216 -0
  36. package/docs/articles/advanced-path-matching.mdx +139 -0
  37. package/docs/articles/api-key-administration.mdx +47 -0
  38. package/docs/articles/api-key-api.mdx +220 -0
  39. package/docs/articles/api-key-authentication.mdx +195 -0
  40. package/docs/articles/api-key-buckets.mdx +61 -0
  41. package/docs/articles/api-key-end-users.mdx +52 -0
  42. package/docs/articles/api-key-leak-detection.mdx +75 -0
  43. package/docs/articles/api-key-management.mdx +100 -0
  44. package/docs/articles/api-key-react-component.mdx +90 -0
  45. package/docs/articles/api-key-service-limits.mdx +14 -0
  46. package/docs/articles/archiving-requests-to-storage.mdx +119 -0
  47. package/docs/articles/branch-based-deployments.mdx +184 -0
  48. package/docs/articles/bypass-policy-for-testing.mdx +117 -0
  49. package/docs/articles/check-ip-address.mdx +17 -0
  50. package/docs/articles/ci-cd-azure/basic-deployment.mdx +49 -0
  51. package/docs/articles/ci-cd-azure/deploy-and-test.mdx +47 -0
  52. package/docs/articles/ci-cd-azure/local-testing.mdx +59 -0
  53. package/docs/articles/ci-cd-azure/multi-stage-deployment.mdx +88 -0
  54. package/docs/articles/ci-cd-azure/pr-preview-environments.mdx +50 -0
  55. package/docs/articles/ci-cd-azure/tag-based-releases.mdx +37 -0
  56. package/docs/articles/ci-cd-bitbucket/basic-deployment.mdx +27 -0
  57. package/docs/articles/ci-cd-bitbucket/deploy-and-test.mdx +41 -0
  58. package/docs/articles/ci-cd-bitbucket/local-testing.mdx +34 -0
  59. package/docs/articles/ci-cd-bitbucket/multi-stage-deployment.mdx +52 -0
  60. package/docs/articles/ci-cd-bitbucket/pr-preview-environments.mdx +46 -0
  61. package/docs/articles/ci-cd-bitbucket/tag-based-releases.mdx +27 -0
  62. package/docs/articles/ci-cd-circleci/basic-deployment.mdx +34 -0
  63. package/docs/articles/ci-cd-circleci/deploy-and-test.mdx +44 -0
  64. package/docs/articles/ci-cd-circleci/local-testing.mdx +50 -0
  65. package/docs/articles/ci-cd-circleci/multi-stage-deployment.mdx +82 -0
  66. package/docs/articles/ci-cd-circleci/pr-preview-environments.mdx +47 -0
  67. package/docs/articles/ci-cd-circleci/tag-based-releases.mdx +38 -0
  68. package/docs/articles/ci-cd-github/basic-deployment.mdx +48 -0
  69. package/docs/articles/ci-cd-github/cleanup-on-branch-delete.mdx +123 -0
  70. package/docs/articles/ci-cd-github/deploy-and-test.mdx +82 -0
  71. package/docs/articles/ci-cd-github/local-testing.mdx +102 -0
  72. package/docs/articles/ci-cd-github/multi-stage-deployment.mdx +136 -0
  73. package/docs/articles/ci-cd-github/pr-preview-environments.mdx +106 -0
  74. package/docs/articles/ci-cd-github/tag-based-releases.mdx +99 -0
  75. package/docs/articles/ci-cd-gitlab/basic-deployment.mdx +28 -0
  76. package/docs/articles/ci-cd-gitlab/deploy-and-test.mdx +44 -0
  77. package/docs/articles/ci-cd-gitlab/local-testing.mdx +39 -0
  78. package/docs/articles/ci-cd-gitlab/mr-preview-environments.mdx +52 -0
  79. package/docs/articles/ci-cd-gitlab/multi-stage-deployment.mdx +64 -0
  80. package/docs/articles/ci-cd-gitlab/tag-based-releases.mdx +28 -0
  81. package/docs/articles/composite-policy-reference.mdx +284 -0
  82. package/docs/articles/configuring-auth0-for-mcp-auth.mdx +186 -0
  83. package/docs/articles/configuring-okta-for-mcp-auth.mdx +208 -0
  84. package/docs/articles/convert-urls-to-openapi.mdx +62 -0
  85. package/docs/articles/cors.mdx +447 -0
  86. package/docs/articles/custom-audit-log-policy.mdx +95 -0
  87. package/docs/articles/custom-ci-cd-azure.mdx +81 -0
  88. package/docs/articles/custom-ci-cd-bitbucket.mdx +80 -0
  89. package/docs/articles/custom-ci-cd-circleci.mdx +78 -0
  90. package/docs/articles/custom-ci-cd-github.mdx +99 -0
  91. package/docs/articles/custom-ci-cd-gitlab.mdx +79 -0
  92. package/docs/articles/custom-ci-cd.mdx +82 -0
  93. package/docs/articles/custom-code-patterns.md +418 -0
  94. package/docs/articles/custom-domains.mdx +258 -0
  95. package/docs/articles/custom-logging-example.mdx +139 -0
  96. package/docs/articles/ddos-protection.mdx +138 -0
  97. package/docs/articles/development-options.mdx +49 -0
  98. package/docs/articles/environment-variables.mdx +134 -0
  99. package/docs/articles/environments.mdx +143 -0
  100. package/docs/articles/fastly-zuplo-host-setup.mdx +41 -0
  101. package/docs/articles/github-deployment-testing.mdx +101 -0
  102. package/docs/articles/gke-with-upstream-auth-policy.mdx +192 -0
  103. package/docs/articles/graphql-security.mdx +180 -0
  104. package/docs/articles/handling-form-data.mdx +61 -0
  105. package/docs/articles/health-checks.mdx +109 -0
  106. package/docs/articles/hosting-options.mdx +70 -0
  107. package/docs/articles/lazy-load-configuration-into-cache.mdx +92 -0
  108. package/docs/articles/limits.mdx +98 -0
  109. package/docs/articles/local-development-debugging.mdx +44 -0
  110. package/docs/articles/local-development-env-variables.mdx +23 -0
  111. package/docs/articles/local-development-installing-packages.mdx +23 -0
  112. package/docs/articles/local-development-routes-designer.mdx +27 -0
  113. package/docs/articles/local-development-services.mdx +40 -0
  114. package/docs/articles/local-development-troubleshooting.mdx +56 -0
  115. package/docs/articles/local-development.mdx +81 -0
  116. package/docs/articles/log-plugin-aws-cloudwatch.mdx +83 -0
  117. package/docs/articles/log-plugin-datadog.mdx +84 -0
  118. package/docs/articles/log-plugin-dynatrace.mdx +75 -0
  119. package/docs/articles/log-plugin-gcp.mdx +75 -0
  120. package/docs/articles/log-plugin-loki.mdx +136 -0
  121. package/docs/articles/log-plugin-new-relic.mdx +84 -0
  122. package/docs/articles/log-plugin-splunk.mdx +104 -0
  123. package/docs/articles/log-plugin-sumo.mdx +73 -0
  124. package/docs/articles/log-plugin-vmware-log-insight.mdx +154 -0
  125. package/docs/articles/log-request-response-data.mdx +398 -0
  126. package/docs/articles/logging.mdx +115 -0
  127. package/docs/articles/manual-mcp-oauth-testing.mdx +193 -0
  128. package/docs/articles/mcp-quickstart.mdx +135 -0
  129. package/docs/articles/metrics-plugins.mdx +371 -0
  130. package/docs/articles/migrate-from-apigee.md +408 -0
  131. package/docs/articles/migrate-from-aws-api-gateway.md +248 -0
  132. package/docs/articles/migrate-from-azure-apim.md +292 -0
  133. package/docs/articles/migrate-from-kong.md +300 -0
  134. package/docs/articles/migration-overview.md +81 -0
  135. package/docs/articles/monetization/api-access.mdx +69 -0
  136. package/docs/articles/monetization/billing-models.md +520 -0
  137. package/docs/articles/monetization/developer-portal.md +167 -0
  138. package/docs/articles/monetization/features.mdx +98 -0
  139. package/docs/articles/monetization/index.mdx +113 -0
  140. package/docs/articles/monetization/meters.mdx +135 -0
  141. package/docs/articles/monetization/monetization-policy.md +314 -0
  142. package/docs/articles/monetization/plan-examples.mdx +366 -0
  143. package/docs/articles/monetization/plans.mdx +266 -0
  144. package/docs/articles/monetization/pricing-models.mdx +225 -0
  145. package/docs/articles/monetization/private-plans.md +154 -0
  146. package/docs/articles/monetization/quickstart.md +355 -0
  147. package/docs/articles/monetization/rate-cards.mdx +171 -0
  148. package/docs/articles/monetization/stripe-integration.md +195 -0
  149. package/docs/articles/monetization/subscription-lifecycle.md +298 -0
  150. package/docs/articles/monetization/tax-collection.md +166 -0
  151. package/docs/articles/monetization/troubleshooting.md +272 -0
  152. package/docs/articles/monetization-custom.mdx +71 -0
  153. package/docs/articles/monetization-integrations.mdx +104 -0
  154. package/docs/articles/monitoring-your-gateway.mdx +53 -0
  155. package/docs/articles/monorepo-deployment.mdx +350 -0
  156. package/docs/articles/multiple-auth-policies.mdx +81 -0
  157. package/docs/articles/non-standard-ports.mdx +30 -0
  158. package/docs/articles/oauth-authentication.mdx +54 -0
  159. package/docs/articles/openapi-server-urls.mdx +60 -0
  160. package/docs/articles/openapi.mdx +130 -0
  161. package/docs/articles/opentelemetry.mdx +250 -0
  162. package/docs/articles/per-user-rate-limits-using-db.mdx +112 -0
  163. package/docs/articles/performance-testing.mdx +304 -0
  164. package/docs/articles/plugin-akamai-api-security.mdx +76 -0
  165. package/docs/articles/plugin-azure-blob.mdx +73 -0
  166. package/docs/articles/plugin-azure-event-hubs.mdx +64 -0
  167. package/docs/articles/plugin-hydrolix-traffic-peak.mdx +147 -0
  168. package/docs/articles/policies.mdx +33 -0
  169. package/docs/articles/rename-or-move-project.mdx +39 -0
  170. package/docs/articles/rick-and-morty-api-developer-portal-example.mdx +23 -0
  171. package/docs/articles/routing.mdx +193 -0
  172. package/docs/articles/s3-signed-url-uploads.mdx +521 -0
  173. package/docs/articles/secure-tunnel.mdx +84 -0
  174. package/docs/articles/securing-backend-mtls.mdx +268 -0
  175. package/docs/articles/securing-your-backend.mdx +148 -0
  176. package/docs/articles/security.mdx +105 -0
  177. package/docs/articles/sharing-code-across-projects.mdx +412 -0
  178. package/docs/articles/source-control-setup-azure.mdx +13 -0
  179. package/docs/articles/source-control-setup-bitbucket.mdx +43 -0
  180. package/docs/articles/source-control-setup-github.mdx +172 -0
  181. package/docs/articles/source-control-setup-gitlab.mdx +12 -0
  182. package/docs/articles/source-control.mdx +80 -0
  183. package/docs/articles/step-1-setup-basic-gateway-local.mdx +136 -0
  184. package/docs/articles/step-1-setup-basic-gateway.mdx +118 -0
  185. package/docs/articles/step-2-add-rate-limiting-local.mdx +126 -0
  186. package/docs/articles/step-2-add-rate-limiting.mdx +82 -0
  187. package/docs/articles/step-3-add-api-key-auth-local.mdx +199 -0
  188. package/docs/articles/step-3-add-api-key-auth.mdx +166 -0
  189. package/docs/articles/step-4-deploying-to-the-edge.mdx +220 -0
  190. package/docs/articles/step-5-dynamic-rate-limiting.mdx +167 -0
  191. package/docs/articles/support.mdx +144 -0
  192. package/docs/articles/terraform.mdx +114 -0
  193. package/docs/articles/testing-graphql.mdx +34 -0
  194. package/docs/articles/testing.mdx +522 -0
  195. package/docs/articles/troubleshooting-slow-responses.mdx +301 -0
  196. package/docs/articles/troubleshooting.md +302 -0
  197. package/docs/articles/tsconfig.mdx +105 -0
  198. package/docs/articles/tunnel-setup.mdx +195 -0
  199. package/docs/articles/tunnel-troubleshooting.mdx +50 -0
  200. package/docs/articles/update-zup-in-github-action.mdx +110 -0
  201. package/docs/articles/use-openapi-extension-data.mdx +79 -0
  202. package/docs/articles/users/multifactor-authentication.mdx +64 -0
  203. package/docs/articles/users/profile.mdx +13 -0
  204. package/docs/articles/versioning-on-zuplo.mdx +89 -0
  205. package/docs/articles/waf-ddos-akamai.md +133 -0
  206. package/docs/articles/waf-ddos-aws-waf-shield.mdx +85 -0
  207. package/docs/articles/waf-ddos-fastly.mdx +251 -0
  208. package/docs/articles/waf-ddos.mdx +140 -0
  209. package/docs/articles/zuplo-waf.mdx +156 -0
  210. package/docs/ask.mdx +3 -0
  211. package/docs/cli/authentication.mdx +56 -0
  212. package/docs/cli/connectivity.mdx +38 -0
  213. package/docs/cli/create-zuplo-api.mdx +80 -0
  214. package/docs/cli/delete.mdx +79 -0
  215. package/docs/cli/deploy.mdx +156 -0
  216. package/docs/cli/deploy.partial.mdx +46 -0
  217. package/docs/cli/dev.mdx +115 -0
  218. package/docs/cli/docs.mdx +66 -0
  219. package/docs/cli/editor.mdx +50 -0
  220. package/docs/cli/global-options.mdx +19 -0
  221. package/docs/cli/init.mdx +74 -0
  222. package/docs/cli/link.mdx +74 -0
  223. package/docs/cli/list.mdx +55 -0
  224. package/docs/cli/mtls-certificate-create.mdx +94 -0
  225. package/docs/cli/mtls-certificate-delete.mdx +55 -0
  226. package/docs/cli/mtls-certificate-describe.mdx +55 -0
  227. package/docs/cli/mtls-certificate-disable.mdx +55 -0
  228. package/docs/cli/mtls-certificate-list.mdx +47 -0
  229. package/docs/cli/mtls-certificate-update.mdx +72 -0
  230. package/docs/cli/openapi-convert.mdx +111 -0
  231. package/docs/cli/openapi-merge.mdx +138 -0
  232. package/docs/cli/openapi-merge.partial.mdx +29 -0
  233. package/docs/cli/openapi-overlay.mdx +123 -0
  234. package/docs/cli/overview.mdx +78 -0
  235. package/docs/cli/project-create.mdx +43 -0
  236. package/docs/cli/source-migrate.mdx +18 -0
  237. package/docs/cli/source-upgrade.mdx +41 -0
  238. package/docs/cli/test.mdx +70 -0
  239. package/docs/cli/test.partial.mdx +7 -0
  240. package/docs/cli/tunnel-create.mdx +53 -0
  241. package/docs/cli/tunnel-create.partial.mdx +9 -0
  242. package/docs/cli/tunnel-delete.mdx +35 -0
  243. package/docs/cli/tunnel-delete.partial.mdx +9 -0
  244. package/docs/cli/tunnel-describe.mdx +45 -0
  245. package/docs/cli/tunnel-describe.partial.mdx +5 -0
  246. package/docs/cli/tunnel-list.mdx +35 -0
  247. package/docs/cli/tunnel-list.partial.mdx +9 -0
  248. package/docs/cli/tunnel-rate-token.partial.mdx +9 -0
  249. package/docs/cli/tunnel-rotate-token.mdx +39 -0
  250. package/docs/cli/tunnel-services-describe.mdx +45 -0
  251. package/docs/cli/tunnel-services-describe.partial.mdx +9 -0
  252. package/docs/cli/tunnel-services-update.mdx +48 -0
  253. package/docs/cli/variable-create.mdx +91 -0
  254. package/docs/cli/variable-create.partial.mdx +5 -0
  255. package/docs/cli/variable-update.mdx +75 -0
  256. package/docs/cli/variable-update.partial.mdx +5 -0
  257. package/docs/concepts/api-keys.md +146 -0
  258. package/docs/concepts/authentication.mdx +109 -0
  259. package/docs/concepts/how-zuplo-works.mdx +120 -0
  260. package/docs/concepts/project-structure.mdx +174 -0
  261. package/docs/concepts/rate-limiting.md +246 -0
  262. package/docs/concepts/request-lifecycle.mdx +56 -0
  263. package/docs/concepts/source-control-and-deployment.mdx +229 -0
  264. package/docs/conferences/conference-prize-terms.mdx +80 -0
  265. package/docs/dedicated/akamai/ai-powered-applications.mdx +223 -0
  266. package/docs/dedicated/akamai/architecture.mdx +280 -0
  267. package/docs/dedicated/akamai/caching.mdx +212 -0
  268. package/docs/dedicated/akamai/cdn.mdx +156 -0
  269. package/docs/dedicated/architecture.mdx +208 -0
  270. package/docs/dedicated/custom-domains.mdx +31 -0
  271. package/docs/dedicated/federated-gateways.mdx +80 -0
  272. package/docs/dedicated/networking.mdx +69 -0
  273. package/docs/dedicated/overview.mdx +80 -0
  274. package/docs/dedicated/source-control.mdx +63 -0
  275. package/docs/dev-portal/dev-portal-create-consumer-on-auth.mdx +134 -0
  276. package/docs/dev-portal/introduction.mdx +65 -0
  277. package/docs/dev-portal/local-development.mdx +72 -0
  278. package/docs/dev-portal/migration.mdx +526 -0
  279. package/docs/dev-portal/node-modules.mdx +45 -0
  280. package/docs/dev-portal/updating.mdx +28 -0
  281. package/docs/dev-portal/zudoku/components/alert.mdx +130 -0
  282. package/docs/dev-portal/zudoku/components/badge.mdx +70 -0
  283. package/docs/dev-portal/zudoku/components/button.mdx +132 -0
  284. package/docs/dev-portal/zudoku/components/callout.mdx +112 -0
  285. package/docs/dev-portal/zudoku/components/card.mdx +104 -0
  286. package/docs/dev-portal/zudoku/components/checkbox.mdx +72 -0
  287. package/docs/dev-portal/zudoku/components/client-only.mdx +79 -0
  288. package/docs/dev-portal/zudoku/components/code-tabs.mdx +179 -0
  289. package/docs/dev-portal/zudoku/components/dialog.mdx +167 -0
  290. package/docs/dev-portal/zudoku/components/head.mdx +199 -0
  291. package/docs/dev-portal/zudoku/components/icons.mdx +27 -0
  292. package/docs/dev-portal/zudoku/components/input.mdx +96 -0
  293. package/docs/dev-portal/zudoku/components/label.mdx +86 -0
  294. package/docs/dev-portal/zudoku/components/link.mdx +242 -0
  295. package/docs/dev-portal/zudoku/components/markdown.mdx +151 -0
  296. package/docs/dev-portal/zudoku/components/mermaid.mdx +81 -0
  297. package/docs/dev-portal/zudoku/components/playground.mdx +87 -0
  298. package/docs/dev-portal/zudoku/components/secret.mdx +78 -0
  299. package/docs/dev-portal/zudoku/components/select.mdx +176 -0
  300. package/docs/dev-portal/zudoku/components/shadcn.mdx +73 -0
  301. package/docs/dev-portal/zudoku/components/slider.mdx +108 -0
  302. package/docs/dev-portal/zudoku/components/slot.mdx +119 -0
  303. package/docs/dev-portal/zudoku/components/stepper.mdx +138 -0
  304. package/docs/dev-portal/zudoku/components/switch.mdx +96 -0
  305. package/docs/dev-portal/zudoku/components/syntax-highlight.mdx +602 -0
  306. package/docs/dev-portal/zudoku/components/textarea.mdx +78 -0
  307. package/docs/dev-portal/zudoku/components/tooltip.mdx +195 -0
  308. package/docs/dev-portal/zudoku/components/typography.mdx +61 -0
  309. package/docs/dev-portal/zudoku/configuration/ai-assistants.md +64 -0
  310. package/docs/dev-portal/zudoku/configuration/api-catalog.md +108 -0
  311. package/docs/dev-portal/zudoku/configuration/api-reference.md +397 -0
  312. package/docs/dev-portal/zudoku/configuration/authentication-auth0.md +173 -0
  313. package/docs/dev-portal/zudoku/configuration/authentication-azure-ad.md +238 -0
  314. package/docs/dev-portal/zudoku/configuration/authentication-clerk.md +110 -0
  315. package/docs/dev-portal/zudoku/configuration/authentication-firebase.md +61 -0
  316. package/docs/dev-portal/zudoku/configuration/authentication-pingfederate.md +136 -0
  317. package/docs/dev-portal/zudoku/configuration/authentication-supabase.md +225 -0
  318. package/docs/dev-portal/zudoku/configuration/authentication.md +199 -0
  319. package/docs/dev-portal/zudoku/configuration/build-configuration.mdx +147 -0
  320. package/docs/dev-portal/zudoku/configuration/docs.md +282 -0
  321. package/docs/dev-portal/zudoku/configuration/footer.mdx +214 -0
  322. package/docs/dev-portal/zudoku/configuration/llms.md +89 -0
  323. package/docs/dev-portal/zudoku/configuration/navigation.mdx +408 -0
  324. package/docs/dev-portal/zudoku/configuration/overview.md +380 -0
  325. package/docs/dev-portal/zudoku/configuration/protected-routes.md +149 -0
  326. package/docs/dev-portal/zudoku/configuration/search.md +169 -0
  327. package/docs/dev-portal/zudoku/configuration/sentry.mdx +44 -0
  328. package/docs/dev-portal/zudoku/configuration/site.md +124 -0
  329. package/docs/dev-portal/zudoku/configuration/slots.mdx +124 -0
  330. package/docs/dev-portal/zudoku/configuration/vite-config.md +18 -0
  331. package/docs/dev-portal/zudoku/custom-plugins.md +287 -0
  332. package/docs/dev-portal/zudoku/customization/colors-theme.mdx +275 -0
  333. package/docs/dev-portal/zudoku/customization/fonts.md +110 -0
  334. package/docs/dev-portal/zudoku/extending/events.md +124 -0
  335. package/docs/dev-portal/zudoku/guides/custom-pages.md +106 -0
  336. package/docs/dev-portal/zudoku/guides/environment-variables.md +99 -0
  337. package/docs/dev-portal/zudoku/guides/mermaid.mdx +70 -0
  338. package/docs/dev-portal/zudoku/guides/navigation-migration.md +87 -0
  339. package/docs/dev-portal/zudoku/guides/navigation-rules.mdx +197 -0
  340. package/docs/dev-portal/zudoku/guides/processors.mdx +234 -0
  341. package/docs/dev-portal/zudoku/guides/static-files.md +55 -0
  342. package/docs/dev-portal/zudoku/guides/transforming-examples.md +156 -0
  343. package/docs/dev-portal/zudoku/guides/using-multiple-apis.md +87 -0
  344. package/docs/dev-portal/zudoku/markdown/admonitions.md +128 -0
  345. package/docs/dev-portal/zudoku/markdown/code-blocks.md +196 -0
  346. package/docs/dev-portal/zudoku/markdown/frontmatter.md +172 -0
  347. package/docs/dev-portal/zudoku/markdown/mdx.md +68 -0
  348. package/docs/dev-portal/zudoku/markdown/overview.md +275 -0
  349. package/docs/dev-portal/zudoku/plugins.md +5 -0
  350. package/docs/dev-portal/zudoku/writing.mdx +72 -0
  351. package/docs/errors/bad-request.mdx +39 -0
  352. package/docs/errors/build-error.mdx +45 -0
  353. package/docs/errors/fatal-project-error.mdx +39 -0
  354. package/docs/errors/gateway-timeout.mdx +33 -0
  355. package/docs/errors/get-head-body-error.mdx +41 -0
  356. package/docs/errors/main-mod-error.mdx +40 -0
  357. package/docs/errors/no-project-set.mdx +41 -0
  358. package/docs/errors/not-found.mdx +43 -0
  359. package/docs/errors/rate-limit-exceeded.mdx +31 -0
  360. package/docs/errors/schema-validation-failed.mdx +51 -0
  361. package/docs/errors/system-configuration-error.mdx +44 -0
  362. package/docs/errors/unauthorized.mdx +50 -0
  363. package/docs/errors/unknown-error.mdx +42 -0
  364. package/docs/errors.mdx +14 -0
  365. package/docs/guides/canary-routing-for-employees.mdx +385 -0
  366. package/docs/guides/geolocation-backend-routing.mdx +404 -0
  367. package/docs/guides/modify-openapi-paths.mdx +371 -0
  368. package/docs/guides/openapi-overlays.mdx +492 -0
  369. package/docs/guides/overview.mdx +12 -0
  370. package/docs/guides/user-based-backend-routing.mdx +437 -0
  371. package/docs/handlers/aws-lambda.mdx +201 -0
  372. package/docs/handlers/custom-handler.mdx +112 -0
  373. package/docs/handlers/legacy-dev-portal-handler.mdx +135 -0
  374. package/docs/handlers/mcp-server.mdx +730 -0
  375. package/docs/handlers/openapi.mdx +78 -0
  376. package/docs/handlers/redirect.mdx +115 -0
  377. package/docs/handlers/system-handlers.mdx +41 -0
  378. package/docs/handlers/url-forward.mdx +204 -0
  379. package/docs/handlers/url-rewrite.mdx +224 -0
  380. package/docs/handlers/websocket-handler.mdx +154 -0
  381. package/docs/home.mdx +6 -0
  382. package/docs/managed-edge/overview.md +78 -0
  383. package/docs/mcp-server/configuration-migration-guide.mdx +344 -0
  384. package/docs/mcp-server/custom-tools.mdx +487 -0
  385. package/docs/mcp-server/graphql.mdx +241 -0
  386. package/docs/mcp-server/introduction.mdx +122 -0
  387. package/docs/mcp-server/openai-apps-sdk.mdx +160 -0
  388. package/docs/mcp-server/prompts.mdx +283 -0
  389. package/docs/mcp-server/resources.mdx +288 -0
  390. package/docs/mcp-server/testing.mdx +53 -0
  391. package/docs/mcp-server/tools.mdx +306 -0
  392. package/docs/policies/_index.md +92 -0
  393. package/docs/policies/ab-test-inbound/intro.md +8 -0
  394. package/docs/policies/ab-test-inbound/policy.ts +14 -0
  395. package/docs/policies/ab-test-inbound/schema.json +27 -0
  396. package/docs/policies/ab-test-outbound/intro.md +8 -0
  397. package/docs/policies/ab-test-outbound/policy.ts +26 -0
  398. package/docs/policies/ab-test-outbound/schema.json +27 -0
  399. package/docs/policies/acl-policy-inbound/intro.md +5 -0
  400. package/docs/policies/acl-policy-inbound/policy.ts +32 -0
  401. package/docs/policies/acl-policy-inbound/schema.json +52 -0
  402. package/docs/policies/akamai-ai-firewall/schema.json +98 -0
  403. package/docs/policies/amberflo-metering-inbound/doc.md +183 -0
  404. package/docs/policies/amberflo-metering-inbound/intro.md +20 -0
  405. package/docs/policies/amberflo-metering-inbound/schema.json +108 -0
  406. package/docs/policies/api-key-inbound/doc.md +77 -0
  407. package/docs/policies/api-key-inbound/intro.md +30 -0
  408. package/docs/policies/api-key-inbound/schema.json +84 -0
  409. package/docs/policies/archive-request-aws-s3-inbound/intro.md +4 -0
  410. package/docs/policies/archive-request-aws-s3-inbound/policy.ts +58 -0
  411. package/docs/policies/archive-request-aws-s3-inbound/schema.json +68 -0
  412. package/docs/policies/archive-request-azure-storage-inbound/doc.md +31 -0
  413. package/docs/policies/archive-request-azure-storage-inbound/intro.md +4 -0
  414. package/docs/policies/archive-request-azure-storage-inbound/policy.ts +54 -0
  415. package/docs/policies/archive-request-azure-storage-inbound/schema.json +53 -0
  416. package/docs/policies/archive-request-gcp-storage-inbound/doc.md +63 -0
  417. package/docs/policies/archive-request-gcp-storage-inbound/intro.md +4 -0
  418. package/docs/policies/archive-request-gcp-storage-inbound/policy.ts +68 -0
  419. package/docs/policies/archive-request-gcp-storage-inbound/schema.json +47 -0
  420. package/docs/policies/archive-response-aws-s3-outbound/intro.md +2 -0
  421. package/docs/policies/archive-response-aws-s3-outbound/policy.ts +59 -0
  422. package/docs/policies/archive-response-aws-s3-outbound/schema.json +68 -0
  423. package/docs/policies/archive-response-azure-storage-outbound/doc.md +31 -0
  424. package/docs/policies/archive-response-azure-storage-outbound/intro.md +3 -0
  425. package/docs/policies/archive-response-azure-storage-outbound/policy.ts +54 -0
  426. package/docs/policies/archive-response-azure-storage-outbound/schema.json +53 -0
  427. package/docs/policies/audit-log-inbound/doc.md +78 -0
  428. package/docs/policies/audit-log-inbound/intro.md +10 -0
  429. package/docs/policies/audit-log-inbound/schema.json +81 -0
  430. package/docs/policies/auth0-jwt-auth-inbound/doc.md +125 -0
  431. package/docs/policies/auth0-jwt-auth-inbound/intro.md +17 -0
  432. package/docs/policies/auth0-jwt-auth-inbound/schema.json +74 -0
  433. package/docs/policies/authzen-inbound/doc.md +24 -0
  434. package/docs/policies/authzen-inbound/intro.md +31 -0
  435. package/docs/policies/authzen-inbound/schema.json +126 -0
  436. package/docs/policies/axiomatics-authz-inbound/doc.md +144 -0
  437. package/docs/policies/axiomatics-authz-inbound/intro.md +11 -0
  438. package/docs/policies/axiomatics-authz-inbound/schema.json +161 -0
  439. package/docs/policies/basic-auth-inbound/intro.md +9 -0
  440. package/docs/policies/basic-auth-inbound/schema.json +99 -0
  441. package/docs/policies/bot-detection-inbound/intro.md +4 -0
  442. package/docs/policies/bot-detection-inbound/schema.json +56 -0
  443. package/docs/policies/brownout-inbound/doc.md +55 -0
  444. package/docs/policies/brownout-inbound/intro.md +12 -0
  445. package/docs/policies/brownout-inbound/schema.json +115 -0
  446. package/docs/policies/caching-inbound/doc.md +209 -0
  447. package/docs/policies/caching-inbound/intro.md +23 -0
  448. package/docs/policies/caching-inbound/schema.json +98 -0
  449. package/docs/policies/change-method-inbound/schema.json +56 -0
  450. package/docs/policies/clear-headers-inbound/schema.json +59 -0
  451. package/docs/policies/clear-headers-outbound/schema.json +59 -0
  452. package/docs/policies/clerk-jwt-auth-inbound/doc.md +85 -0
  453. package/docs/policies/clerk-jwt-auth-inbound/intro.md +4 -0
  454. package/docs/policies/clerk-jwt-auth-inbound/schema.json +68 -0
  455. package/docs/policies/cognito-jwt-auth-inbound/intro.md +7 -0
  456. package/docs/policies/cognito-jwt-auth-inbound/schema.json +74 -0
  457. package/docs/policies/comet-opik-tracing-inbound/schema.json +65 -0
  458. package/docs/policies/complex-rate-limit-inbound/doc.md +20 -0
  459. package/docs/policies/complex-rate-limit-inbound/intro.md +23 -0
  460. package/docs/policies/complex-rate-limit-inbound/schema.json +142 -0
  461. package/docs/policies/composite-inbound/doc.md +69 -0
  462. package/docs/policies/composite-inbound/intro.md +15 -0
  463. package/docs/policies/composite-inbound/schema.json +59 -0
  464. package/docs/policies/composite-outbound/intro.md +6 -0
  465. package/docs/policies/composite-outbound/schema.json +59 -0
  466. package/docs/policies/curity-phantom-token-inbound/doc.md +109 -0
  467. package/docs/policies/curity-phantom-token-inbound/intro.md +3 -0
  468. package/docs/policies/curity-phantom-token-inbound/schema.json +68 -0
  469. package/docs/policies/custom-code-inbound/doc.md +267 -0
  470. package/docs/policies/custom-code-inbound/intro.md +2 -0
  471. package/docs/policies/custom-code-inbound/schema.json +48 -0
  472. package/docs/policies/custom-code-outbound/doc.md +235 -0
  473. package/docs/policies/custom-code-outbound/intro.md +2 -0
  474. package/docs/policies/custom-code-outbound/schema.json +43 -0
  475. package/docs/policies/firebase-jwt-inbound/intro.md +6 -0
  476. package/docs/policies/firebase-jwt-inbound/schema.json +68 -0
  477. package/docs/policies/formdata-to-json-inbound/schema.json +60 -0
  478. package/docs/policies/galileo-tracing-inbound/schema.json +65 -0
  479. package/docs/policies/geo-filter-inbound/doc.md +33 -0
  480. package/docs/policies/geo-filter-inbound/schema.json +108 -0
  481. package/docs/policies/graphql-complexity-limit-inbound/doc.md +48 -0
  482. package/docs/policies/graphql-complexity-limit-inbound/intro.md +2 -0
  483. package/docs/policies/graphql-complexity-limit-inbound/schema.json +90 -0
  484. package/docs/policies/graphql-disable-introspection-inbound/doc.md +66 -0
  485. package/docs/policies/graphql-disable-introspection-inbound/intro.md +15 -0
  486. package/docs/policies/graphql-disable-introspection-inbound/schema.json +48 -0
  487. package/docs/policies/graphql-introspection-filter-outbound/doc.md +148 -0
  488. package/docs/policies/graphql-introspection-filter-outbound/schema.json +79 -0
  489. package/docs/policies/hmac-auth-inbound/doc.md +30 -0
  490. package/docs/policies/hmac-auth-inbound/intro.md +10 -0
  491. package/docs/policies/hmac-auth-inbound/policy.ts +70 -0
  492. package/docs/policies/hmac-auth-inbound/schema.json +53 -0
  493. package/docs/policies/http-deprecation-outbound/doc.md +73 -0
  494. package/docs/policies/http-deprecation-outbound/schema.json +83 -0
  495. package/docs/policies/ip-restriction-inbound/intro.md +8 -0
  496. package/docs/policies/ip-restriction-inbound/policy.ts +40 -0
  497. package/docs/policies/ip-restriction-inbound/schema.json +58 -0
  498. package/docs/policies/jwt-scopes-inbound/schema.json +59 -0
  499. package/docs/policies/ldap-auth-inbound/schema.json +56 -0
  500. package/docs/policies/mock-api-inbound/schema.json +72 -0
  501. package/docs/policies/moesif-inbound/doc.md +44 -0
  502. package/docs/policies/moesif-inbound/intro.md +6 -0
  503. package/docs/policies/moesif-inbound/schema.json +68 -0
  504. package/docs/policies/monetization-inbound/doc.md +87 -0
  505. package/docs/policies/monetization-inbound/intro.md +6 -0
  506. package/docs/policies/monetization-inbound/schema.json +102 -0
  507. package/docs/policies/mtls-auth-inbound/intro.md +6 -0
  508. package/docs/policies/mtls-auth-inbound/schema.json +68 -0
  509. package/docs/policies/okta-fga-authz-inbound/doc.md +181 -0
  510. package/docs/policies/okta-fga-authz-inbound/intro.md +20 -0
  511. package/docs/policies/okta-fga-authz-inbound/schema.json +104 -0
  512. package/docs/policies/okta-jwt-auth-inbound/intro.md +7 -0
  513. package/docs/policies/okta-jwt-auth-inbound/schema.json +74 -0
  514. package/docs/policies/open-id-jwt-auth-inbound/doc.md +58 -0
  515. package/docs/policies/open-id-jwt-auth-inbound/intro.md +30 -0
  516. package/docs/policies/open-id-jwt-auth-inbound/schema.json +128 -0
  517. package/docs/policies/openfga-authz-inbound/doc.md +207 -0
  518. package/docs/policies/openfga-authz-inbound/intro.md +17 -0
  519. package/docs/policies/openfga-authz-inbound/schema.json +191 -0
  520. package/docs/policies/openmeter-inbound/doc.md +163 -0
  521. package/docs/policies/openmeter-inbound/intro.md +18 -0
  522. package/docs/policies/openmeter-inbound/schema.json +183 -0
  523. package/docs/policies/prompt-injection-outbound/doc.md +106 -0
  524. package/docs/policies/prompt-injection-outbound/intro.md +4 -0
  525. package/docs/policies/prompt-injection-outbound/schema.json +74 -0
  526. package/docs/policies/propel-auth-jwt-inbound/doc.md +88 -0
  527. package/docs/policies/propel-auth-jwt-inbound/intro.md +4 -0
  528. package/docs/policies/propel-auth-jwt-inbound/schema.json +74 -0
  529. package/docs/policies/query-param-to-header-inbound/doc.md +70 -0
  530. package/docs/policies/query-param-to-header-inbound/intro.md +5 -0
  531. package/docs/policies/query-param-to-header-inbound/schema.json +74 -0
  532. package/docs/policies/quota-inbound/doc.md +235 -0
  533. package/docs/policies/quota-inbound/intro.md +7 -0
  534. package/docs/policies/quota-inbound/schema.json +133 -0
  535. package/docs/policies/rate-limit-inbound/doc.md +78 -0
  536. package/docs/policies/rate-limit-inbound/intro.md +30 -0
  537. package/docs/policies/rate-limit-inbound/schema.json +134 -0
  538. package/docs/policies/rbac-policy-inbound/intro.md +3 -0
  539. package/docs/policies/rbac-policy-inbound/policy.ts +42 -0
  540. package/docs/policies/rbac-policy-inbound/schema.json +52 -0
  541. package/docs/policies/readme-metrics-inbound/doc.md +1 -0
  542. package/docs/policies/readme-metrics-inbound/intro.md +3 -0
  543. package/docs/policies/readme-metrics-inbound/schema.json +84 -0
  544. package/docs/policies/remove-headers-inbound/schema.json +59 -0
  545. package/docs/policies/remove-headers-outbound/schema.json +59 -0
  546. package/docs/policies/remove-query-params-inbound/schema.json +59 -0
  547. package/docs/policies/replace-string-outbound/schema.json +69 -0
  548. package/docs/policies/request-size-limit-inbound/schema.json +60 -0
  549. package/docs/policies/request-validation-inbound/doc.md +72 -0
  550. package/docs/policies/request-validation-inbound/intro.md +24 -0
  551. package/docs/policies/request-validation-inbound/schema.json +98 -0
  552. package/docs/policies/require-origin-inbound/intro.md +12 -0
  553. package/docs/policies/require-origin-inbound/schema.json +65 -0
  554. package/docs/policies/secret-masking-outbound/doc.md +41 -0
  555. package/docs/policies/secret-masking-outbound/intro.md +13 -0
  556. package/docs/policies/secret-masking-outbound/schema.json +65 -0
  557. package/docs/policies/semantic-cache-inbound/doc.md +63 -0
  558. package/docs/policies/semantic-cache-inbound/intro.md +4 -0
  559. package/docs/policies/semantic-cache-inbound/schema.json +179 -0
  560. package/docs/policies/set-body-inbound/intro.md +7 -0
  561. package/docs/policies/set-body-inbound/schema.json +56 -0
  562. package/docs/policies/set-headers-inbound/doc.md +41 -0
  563. package/docs/policies/set-headers-inbound/intro.md +2 -0
  564. package/docs/policies/set-headers-inbound/schema.json +83 -0
  565. package/docs/policies/set-headers-outbound/schema.json +83 -0
  566. package/docs/policies/set-query-params-inbound/schema.json +83 -0
  567. package/docs/policies/set-status-outbound/schema.json +62 -0
  568. package/docs/policies/sleep-inbound/schema.json +56 -0
  569. package/docs/policies/stripe-webhook-verification-inbound/intro.md +2 -0
  570. package/docs/policies/stripe-webhook-verification-inbound/schema.json +60 -0
  571. package/docs/policies/supabase-jwt-auth-inbound/doc.md +29 -0
  572. package/docs/policies/supabase-jwt-auth-inbound/intro.md +12 -0
  573. package/docs/policies/supabase-jwt-auth-inbound/schema.json +86 -0
  574. package/docs/policies/transform-body-inbound/intro.md +8 -0
  575. package/docs/policies/transform-body-inbound/policy.ts +16 -0
  576. package/docs/policies/transform-body-inbound/schema.json +27 -0
  577. package/docs/policies/transform-body-outbound/intro.md +8 -0
  578. package/docs/policies/transform-body-outbound/policy.ts +19 -0
  579. package/docs/policies/transform-body-outbound/schema.json +27 -0
  580. package/docs/policies/upstream-azure-ad-service-auth-inbound/doc.md +82 -0
  581. package/docs/policies/upstream-azure-ad-service-auth-inbound/intro.md +20 -0
  582. package/docs/policies/upstream-azure-ad-service-auth-inbound/schema.json +84 -0
  583. package/docs/policies/upstream-firebase-admin-auth-inbound/intro.md +10 -0
  584. package/docs/policies/upstream-firebase-admin-auth-inbound/schema.json +68 -0
  585. package/docs/policies/upstream-firebase-user-auth-inbound/intro.md +2 -0
  586. package/docs/policies/upstream-firebase-user-auth-inbound/schema.json +113 -0
  587. package/docs/policies/upstream-gcp-federated-auth-inbound/doc.md +139 -0
  588. package/docs/policies/upstream-gcp-federated-auth-inbound/intro.md +21 -0
  589. package/docs/policies/upstream-gcp-federated-auth-inbound/schema.json +96 -0
  590. package/docs/policies/upstream-gcp-jwt-inbound/intro.md +10 -0
  591. package/docs/policies/upstream-gcp-jwt-inbound/schema.json +62 -0
  592. package/docs/policies/upstream-gcp-service-auth-inbound/doc.md +132 -0
  593. package/docs/policies/upstream-gcp-service-auth-inbound/intro.md +25 -0
  594. package/docs/policies/upstream-gcp-service-auth-inbound/schema.json +95 -0
  595. package/docs/policies/upstream-zuplo-jwt-auth-inbound/doc.md +213 -0
  596. package/docs/policies/upstream-zuplo-jwt-auth-inbound/intro.md +16 -0
  597. package/docs/policies/upstream-zuplo-jwt-auth-inbound/schema.json +101 -0
  598. package/docs/policies/validate-json-schema-inbound/doc.md +129 -0
  599. package/docs/policies/validate-json-schema-inbound/intro.md +7 -0
  600. package/docs/policies/validate-json-schema-inbound/schema.json +56 -0
  601. package/docs/policies/web-bot-auth-inbound/doc.md +104 -0
  602. package/docs/policies/web-bot-auth-inbound/intro.md +16 -0
  603. package/docs/policies/web-bot-auth-inbound/schema.json +76 -0
  604. package/docs/policies/xml-to-json-outbound/doc.md +71 -0
  605. package/docs/policies/xml-to-json-outbound/intro.md +4 -0
  606. package/docs/policies/xml-to-json-outbound/schema.json +117 -0
  607. package/docs/programmable-api/audit-log.mdx +74 -0
  608. package/docs/programmable-api/background-dispatcher.mdx +124 -0
  609. package/docs/programmable-api/background-loader.mdx +104 -0
  610. package/docs/programmable-api/cache.mdx +186 -0
  611. package/docs/programmable-api/compatibility-dates.mdx +201 -0
  612. package/docs/programmable-api/console-logging.mdx +48 -0
  613. package/docs/programmable-api/context-data.mdx +127 -0
  614. package/docs/programmable-api/custom-cors-policy.mdx +64 -0
  615. package/docs/programmable-api/environment.mdx +328 -0
  616. package/docs/programmable-api/hooks.mdx +569 -0
  617. package/docs/programmable-api/http-problems.mdx +385 -0
  618. package/docs/programmable-api/jwt-service-plugin.mdx +420 -0
  619. package/docs/programmable-api/logger.mdx +223 -0
  620. package/docs/programmable-api/memory-zone-read-through-cache.mdx +96 -0
  621. package/docs/programmable-api/node-modules.mdx +67 -0
  622. package/docs/programmable-api/not-found-handler.mdx +47 -0
  623. package/docs/programmable-api/oauth-protected-resource-plugin.mdx +46 -0
  624. package/docs/programmable-api/overview.mdx +213 -0
  625. package/docs/programmable-api/problem-response-formatter.mdx +183 -0
  626. package/docs/programmable-api/request-user.mdx +289 -0
  627. package/docs/programmable-api/reusing-code.mdx +26 -0
  628. package/docs/programmable-api/route-raw.mdx +55 -0
  629. package/docs/programmable-api/runtime-behaviors.mdx +25 -0
  630. package/docs/programmable-api/runtime-errors.mdx +246 -0
  631. package/docs/programmable-api/runtime-extensions.mdx +340 -0
  632. package/docs/programmable-api/safely-clone-a-request-or-response.mdx +57 -0
  633. package/docs/programmable-api/streaming-zone-cache.mdx +155 -0
  634. package/docs/programmable-api/web-crypto-apis.mdx +219 -0
  635. package/docs/programmable-api/web-standard-apis.mdx +109 -0
  636. package/docs/programmable-api/zone-cache.mdx +131 -0
  637. package/docs/programmable-api/zp-body-removed.mdx +32 -0
  638. package/docs/programmable-api/zuplo-context.mdx +414 -0
  639. package/docs/programmable-api/zuplo-id-token.mdx +90 -0
  640. package/docs/programmable-api/zuplo-json.mdx +91 -0
  641. package/docs/programmable-api/zuplo-request.mdx +200 -0
  642. package/docs/sample-apis.mdx +78 -0
  643. package/docs/self-hosted/overview.md +60 -0
  644. package/package.json +6 -5
@@ -0,0 +1,101 @@
1
+ ---
2
+ title: Testing GitHub Deployments
3
+ sidebar_label: Testing Deployments
4
+ ---
5
+
6
+ Run your test suite automatically after every Zuplo deployment without replacing
7
+ the built-in GitHub integration. This approach uses GitHub's `deployment_status`
8
+ event to trigger tests after Zuplo finishes deploying.
9
+
10
+ ## Why This Approach?
11
+
12
+ Zuplo's GitHub integration already handles deployments perfectly — every push
13
+ deploys automatically with status checks in GitHub. Rather than replacing this
14
+ with custom CI/CD, you can extend it by running tests after each deployment
15
+ completes.
16
+
17
+ This gives you:
18
+
19
+ - **Automatic deployments** — Keep the built-in integration
20
+ - **Post-deploy testing** — Run tests against the live environment
21
+ - **PR checks** — Tests block merging until they pass
22
+ - **No duplicate deploys** — Tests run after Zuplo deploys, not instead of
23
+
24
+ ## Setup
25
+
26
+ Create a workflow that triggers on the `deployment_status` event:
27
+
28
+ ```yaml title=".github/workflows/test.yaml"
29
+ name: Test Deployment
30
+
31
+ on:
32
+ deployment_status:
33
+
34
+ jobs:
35
+ test:
36
+ # Only run when Zuplo deployment succeeds
37
+ if: |
38
+ github.event.deployment_status.state == 'success' &&
39
+ github.event.deployment_status.environment_url != ''
40
+ runs-on: ubuntu-latest
41
+ steps:
42
+ - uses: actions/checkout@v4
43
+
44
+ - uses: actions/setup-node@v4
45
+ with:
46
+ node-version: 20
47
+
48
+ - name: Install dependencies
49
+ run: npm install
50
+
51
+ - name: Run tests
52
+ run:
53
+ npx zuplo test --endpoint ${{
54
+ github.event.deployment_status.environment_url }}
55
+ ```
56
+
57
+ ## How It Works
58
+
59
+ 1. You push code to GitHub
60
+ 2. Zuplo's integration deploys automatically
61
+ 3. Zuplo reports deployment status back to GitHub
62
+ 4. The `deployment_status` event triggers your workflow
63
+ 5. Your tests run against the deployed environment URL
64
+ 6. Test results appear as a check on the commit/PR
65
+
66
+ The `environment_url` from the deployment status contains your Zuplo environment
67
+ URL, so tests always run against the correct environment.
68
+
69
+ ## Filtering by Environment
70
+
71
+ To only test specific environments (like staging or production):
72
+
73
+ ```yaml
74
+ jobs:
75
+ test:
76
+ if: |
77
+ github.event.deployment_status.state == 'success' &&
78
+ github.event.deployment_status.environment == 'production'
79
+ # ...
80
+ ```
81
+
82
+ ## Adding to PR Checks
83
+
84
+ GitHub automatically shows deployment status checks on pull requests. Your test
85
+ workflow results appear alongside them, giving reviewers confidence that both
86
+ deployment and tests succeeded.
87
+
88
+ ## When to Use Custom CI/CD Instead
89
+
90
+ This approach works great when you want to:
91
+
92
+ - Keep automatic deployments
93
+ - Run tests after deploy
94
+ - Add PR checks
95
+
96
+ Consider [custom GitHub Actions](./custom-ci-cd-github.mdx) if you need:
97
+
98
+ - Approval gates before production
99
+ - Multi-stage deployments (staging → production)
100
+ - Tests that must pass before any deployment
101
+ - Tag-based or release-based deployments
@@ -0,0 +1,192 @@
1
+ ---
2
+ title: Secure a GCP Backend with Zuplo Upstream Auth
3
+ sidebar_label: GCP Backend with Upstream Auth
4
+ ---
5
+
6
+ When using any API gateway as your API's entry point, it's critical that only
7
+ traffic that originates from the Gateway is allowed to call your backend. There
8
+ are [many way to this](./securing-your-backend.mdx) depending on your
9
+ requirements and how your backend is hosted. This article will explain how to
10
+ use Google IAM to secure a GKE cluster so that only requests made through your
11
+ Zuplo API Gateway will be allowed to call your GKE ingress.
12
+
13
+ Using GCP IAM to authorize your Zuplo Gateway to make requests to your backend
14
+ utilizes Googles core IAM system known as
15
+ "[Identity Aware Proxy](https://cloud.google.com/iap)" to secure public IP
16
+ address from unauthorized access. When correctly configured, this will ensure
17
+ that no unauthorized access makes it to your application.
18
+
19
+ While it's also possible to enforce authorization within your application
20
+ itself - for example using JWT Authentication. The key difference is that by
21
+ using your Cloud providers identity and authorization system, you are ensuring
22
+ that unauthorized requests are blocked before they even touch your backend. This
23
+ provides protection from any potential security vulnerabilities in your core,
24
+ web server, or operating system.
25
+
26
+ :::note
27
+
28
+ This article uses GKE as the example backend, but any GCP service that can be
29
+ set up behind an HTTP Load Balancer can be used.
30
+
31
+ :::
32
+
33
+ The diagram below shows how the end-to-end system interacts. The important steps
34
+ to this process are:
35
+
36
+ 1. The client makes a request to your Zuplo API Gateway
37
+ 1. The Zuplo API Gateway enforces any policies (for example authentication,
38
+ authorization, rate limiting)
39
+ 1. The Zuplo API Gateway proxies the request to the public IP address of your
40
+ GCP Load Balancer. Zuplo adds authorization information to the request that
41
+ identify the request as coming from Zuplo
42
+ 1. GCP Identity Aware proxy validates that the request comes from an authorized
43
+ Service Account identity. Unauthorized requests are rejected.
44
+ 1. Authorized requests are forwarded on through your GKE ingress to your
45
+ backend.
46
+
47
+ ![GKE diagram](../../public/media/gke-with-upstream-auth-policy/diagram.svg)
48
+
49
+ ## Zuplo Gateway Identity
50
+
51
+ Requests that are proxied from Zuplo to your GCP Load Balancer use the
52
+ [Upstream GCP Service Auth Policy](../policies/upstream-gcp-service-auth-inbound.mdx)
53
+ to authenticate the request via a
54
+ [GCP Service Account](https://cloud.google.com/iam/docs/service-account-overview).
55
+ The policy appends an `authorization` header to the request that the GCP
56
+ Identity Aware Proxy uses to determine if the request is authorized or not.
57
+
58
+ Using this system means that you can uniquely identify requests that come from
59
+ Zuplo as a their own identity. This means all request logs can be identified by
60
+ their source - for example your Zuplo Gateway, another system also using a GCP
61
+ Service account, a developer testing an internal system, etc.
62
+
63
+ :::tip{title="Multiple Service Account"}
64
+
65
+ While not normally needed, it's possible to configure multiple Upstream GCP
66
+ Service Auth Inbound policies in order to provide fine-grain authorization to
67
+ your internal resources by Service Account. For example, if you had two Zuplo
68
+ projects - one for external users and one for internal users - each could use
69
+ its own identity.
70
+
71
+ :::
72
+
73
+ For instructions on how to configure upstream GCP IAM auth, see the
74
+ [Upstream GCP Service Auth Policy document](../policies/upstream-gcp-service-auth-inbound.mdx)
75
+
76
+ ## GCP Configuration
77
+
78
+ Documentation on configuring GCP Identity Aware Proxy can be found on Google's
79
+ documentation. Below are a few links on how to configure the proxy with several
80
+ common backends.
81
+
82
+ - [Enabling IAP for Compute Engine](https://cloud.google.com/iap/docs/enabling-compute-howto)
83
+ - [Enabling IAP for GKE](https://cloud.google.com/iap/docs/enabling-kubernetes-howto)
84
+ - [Enabling IAP for Cloud Run](https://cloud.google.com/iap/docs/enabling-cloud-run)
85
+
86
+ :::tip{title="Cloud Run"}
87
+
88
+ Cloud Run doesn't need to use IAP in all cases. It's possible to restrict Cloud
89
+ Run to
90
+ [require IAM authentication in order to invoke the service](https://cloud.google.com/run/docs/securing/managing-access).
91
+
92
+ :::
93
+
94
+ ## Example
95
+
96
+ To see how this works in action, follow the steps in Google's document
97
+ _[Set up an external Application Load Balancer with Ingress](https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer)_.
98
+ This will configure a GKE cluster with a simple "hello world" web application
99
+ behind an HTTP Load Balancer. At the end of the tutorial, you should have a
100
+ public IP address that serves a simple web application.
101
+
102
+ You can test the request with a simple curl command.
103
+
104
+ ```shell
105
+ curl http://34.111.91.10/
106
+ Hello, world!
107
+ Version: 1.0.0
108
+ Hostname: web-58756b54cc-7hdcw
109
+ ```
110
+
111
+ In order to securely proxy traffic from Zuplo to GCP, you'll need to secure your
112
+ traffic over an SSL connection. Navigate to the GCP portal to manage your
113
+ [load balancer](https://console.cloud.google.com/net-services/loadbalancing/list/loadBalancers)
114
+ and select the load balancer that was created previously. Click, **Edit** on the
115
+ load balancer.
116
+
117
+ ![Edit load balancer](../../public/media/gke-with-upstream-auth-policy/770db332-ad94-41c6-a6f8-1498578fb78c.png)
118
+
119
+ Next, click **ADD FRONTEND IP AND PORT**. Enter the name and select **HTTPS** as
120
+ the protocol.
121
+
122
+ ![Add new frontend IP and port](../../public/media/gke-with-upstream-auth-policy/cd0b20d3-c109-4775-9fa0-1b3e391bcb84.png)
123
+
124
+ Then click **Add a Certificate**. Select Google-managed Certificate and enter
125
+ your domain name.
126
+
127
+ ![Add a certificate](../../public/media/gke-with-upstream-auth-policy/49760fbb-6eb4-46f9-a638-ac078fe85aab.png)
128
+
129
+ Next, select **Host and path rules** and enter the domain and associate it with
130
+ the backend.
131
+
132
+ ![Host and path rules configuration](../../public/media/gke-with-upstream-auth-policy/307e9026-d77e-4efd-9fc1-4c45ead963f1.png)
133
+
134
+ Click **Done** and then **Update** to update your Load Balancer. It will take a
135
+ few minutes to issue the SSL certificate for the domain.
136
+
137
+ After the Load Balancer updates you should be able to request your site using
138
+ the configured domain via HTTPS.
139
+
140
+ ```shell
141
+ curl https://api.example.com
142
+ Hello, world!
143
+ Version: 1.0.0
144
+ Hostname: web-58756b54cc-7hdcw
145
+ ```
146
+
147
+ :::tip{title="Checkpoint"}
148
+
149
+ At this point, your backend on GKE is exposed on the public internet via a GCP
150
+ HTTP Load Balancer via HTTP and HTTPS. For this demo, we won't go through the
151
+ changes, but in production you shouldn't expose an HTTP endpoint on your API.
152
+
153
+ :::
154
+
155
+ ### Enabling Identity Aware Proxy
156
+
157
+ To enable Identity Aware Proxy on your Load Balancer, follow googles document
158
+ _[Enabling IAP for GKE](https://cloud.google.com/iap/docs/enabling-kubernetes-howto)_
159
+
160
+ After you have enabled IAP, if you try to open your example API in the browser
161
+ you will now be prompted to authenticate using your Google Account. If you do so
162
+ you be shown a screen that blocks access to the application.
163
+
164
+ ![You don't have access](../../public/media/gke-with-upstream-auth-policy/a2ee889a-54c1-4e00-953b-1053c619ce52.png)
165
+
166
+ Your API is now completely inaccessible to unauthorized requests.
167
+
168
+ In order to allow your Zuplo Gateway access you need to
169
+ [grant its service account permission](https://cloud.google.com/iap/docs/managing-access)
170
+ to call the IAP protected API.
171
+
172
+ ![Add principals](../../public/media/gke-with-upstream-auth-policy/ecadec32-753b-4716-afb5-fafa69c91499.png)
173
+
174
+ ### Authorize Zuplo to Call the API
175
+
176
+ The last thing required is to configure Zuplo with a service account and policy
177
+ so that it can securely call your API. Follow the instructions on the
178
+ [Upstream GCP Service Auth Policy document](../policies/upstream-gcp-service-auth-inbound.mdx)
179
+ to set up the policy.
180
+
181
+ With the policy setup, create a route in your Zuplo portal that points to your
182
+ API. When you make a request you will once again see a successful response.
183
+
184
+ ```shell
185
+ curl https://zuplo-gateway.example.com
186
+ Hello, world!
187
+ Version: 1.0.0
188
+ Hostname: web-58756b54cc-7hdcw
189
+ ```
190
+
191
+ You can now add additional policies on Zuplo in order to authenticate requests,
192
+ add rate limiting, etc.
@@ -0,0 +1,180 @@
1
+ ---
2
+ title: Secure your GraphQL API with Zuplo
3
+ sidebar_label: Secure your GraphQL API
4
+ description:
5
+ Learn how to secure your GraphQL API using Zuplo's security policies to
6
+ prevent DoS attacks and protect schema information.
7
+ tags:
8
+ - authentication
9
+ - backends
10
+ ---
11
+
12
+ **Secure your GraphQL API with Zuplo**
13
+
14
+ GraphQL is a powerful query language for your APIs. While it offers great
15
+ flexibility for clients, it also exposes potential security risks. Fortunately,
16
+ with Zuplo, you can secure your GraphQL API by implementing various policies.
17
+ This article walks you through our security policies:
18
+ [GraphQL Complexity Limit](/docs/policies/graphql-complexity-limit-inbound), and
19
+ [GraphQL Disable Introspection](/docs/policies/graphql-disable-introspection-inbound).
20
+
21
+ ## 1. Understanding the Risks
22
+
23
+ ### a. Deeply Nested Queries
24
+
25
+ Without restrictions, a client can send deeply nested queries that could
26
+ potentially overwhelm your server, resulting in a Denial of Service (DoS)
27
+ attack. This is because deeply nested queries can cause the server to process a
28
+ huge amount of data and operations. While this might be a planned attack, it
29
+ could also be a mistake by a client who is unaware of the query depth limit.
30
+
31
+ ### b. Query Complexity
32
+
33
+ Even without deep nesting, a query can be crafted to be very complex. This could
34
+ force your server to execute resource-intensive operations, potentially slowing
35
+ down the system or causing a DoS.
36
+
37
+ ### c. Introspection
38
+
39
+ GraphQL allows clients to introspect your schema. While this is beneficial
40
+ during development, it can expose detailed schema information to potential
41
+ attackers in production.
42
+
43
+ ## 2. Add your GraphQL API & setting up Policies
44
+
45
+ ### Set Up POST Endpoint
46
+
47
+ If you didn't already do so, you need to set up a POST endpoint in your API.
48
+ This endpoint will be used to send the GraphQL queries to your API. The
49
+ urlRewriteHandler to rewrite the request to your GraphQL API. For this example
50
+ let's assume your GraphQL API is hosted at `https://api.example.com/graphql`.
51
+
52
+ To do so, add the following to your `config/routes.oas.json`
53
+
54
+ ```json
55
+ {
56
+ "post": {
57
+ "summary": "GraphQL Query",
58
+ "description": "The endpoint for GraphQL queries.",
59
+ "x-zuplo-route": {
60
+ "corsPolicy": "none",
61
+ "handler": {
62
+ "export": "urlRewriteHandler",
63
+ "module": "$import(@zuplo/runtime)",
64
+ "options": {
65
+ "rewritePattern": "https://api.example.com/graphql"
66
+ }
67
+ },
68
+ "policies": {
69
+ "inbound": [
70
+ "graphql-complexity-limit-policy",
71
+ "graphql-disable-introspection-policy"
72
+ ]
73
+ }
74
+ },
75
+ "operationId": "52bdf225-eaa7-441c-afb9-b7df046a142e"
76
+ }
77
+ }
78
+ ```
79
+
80
+ For all the risks mentioned above, Zuplo offers policies that can be configured
81
+ to protect your GraphQL API. These policies can be configured for Zuplo. We'll
82
+ create the configuration for the three policies `graphql-depth-limit`,
83
+ `graphql-complexity-points` and `graphql-disable-introspection-policy` next.
84
+
85
+ ### a. GraphQL Depth Limit
86
+
87
+ This policy limits how deep a query can be nested. Check our
88
+ [detailed policy documentation](/docs/policies/graphql-complexity-limit-inbound)
89
+ for more information.
90
+
91
+ Add this into your `config/policies.json`
92
+
93
+ ```json
94
+ {
95
+ "policies": [
96
+ {
97
+ "name": "graphql-complexity-limit-policy",
98
+ "policyType": "graphql-complexity-limit-inbound",
99
+ "handler": {
100
+ "export": "GraphQLComplexityLimitInboundPolicy",
101
+ "module": "$import(@zuplo/graphql)",
102
+ "options": {
103
+ "useDepthLimit": {
104
+ "depthLimit": 20
105
+ }
106
+ }
107
+ }
108
+ }
109
+ ]
110
+ }
111
+ ```
112
+
113
+ By limiting the query depth, you prevent malicious or mistakenly deep queries
114
+ from consuming excessive server resources.
115
+
116
+ ### b. GraphQL Complexity Limit
117
+
118
+ We can extend the same policy to also check for complexity. By defining a max
119
+ for each type of operation, and then it limits the total complexity a query can
120
+ have. In order to use the Complexity Limit you need to allow introspection in
121
+ your GraphQL API.
122
+
123
+ ```json
124
+ {
125
+ "policies": [
126
+ {
127
+ "name": "graphql-complexity-limit-policy",
128
+ "policyType": "graphql-complexity-limit-inbound",
129
+ "handler": {
130
+ "export": "GraphQLComplexityLimitInboundPolicy",
131
+ "module": "$import(@zuplo/graphql)",
132
+ "options": {
133
+ "useDepthLimit": {
134
+ "depthLimit": 20
135
+ },
136
+ "useComplexityLimit": {
137
+ "complexityLimit": 50,
138
+ "endpointUrl": "https://api.example.com/graphql"
139
+ }
140
+ }
141
+ }
142
+ }
143
+ ]
144
+ }
145
+ ```
146
+
147
+ The complexity limit ensures that a potential attacker can't overload the system
148
+ by sending overly complicated queries.
149
+
150
+ ### c. GraphQL Disable Introspection
151
+
152
+ Disable introspection in production environments to hide schema details.
153
+
154
+ ```json
155
+ {
156
+ "policies": [
157
+ {
158
+ "name": "graphql-disable-introspection-policy",
159
+ "policyType": "graphql-disable-introspection-inbound",
160
+ "handler": {
161
+ "export": "GraphQLDisableIntrospectionInboundPolicy",
162
+ "module": "$import(@zuplo/graphql)",
163
+ "options": {}
164
+ }
165
+ }
166
+ ]
167
+ }
168
+ ```
169
+
170
+ By disabling introspection in production, you prevent attackers from gaining
171
+ insights into your GraphQL schema, thereby reducing potential attack vectors.
172
+
173
+ ## 4. Example Repository
174
+
175
+ For those who prefer a hands-on approach or wish to see these configurations in
176
+ action, there is a GitHub repository with everything set up. This repository
177
+ offers a comprehensive example of how to configure and secure a GraphQL API
178
+ using Zuplo. Check out the
179
+ [GraphQL API with Zuplo example repository](https://github.com/zuplo/zuplo-graphql-example)
180
+ to dive deeper.
@@ -0,0 +1,61 @@
1
+ ---
2
+ title: Handling FormData
3
+ description:
4
+ Learn how to parse multipart/form-data uploads and process file content in
5
+ Zuplo runtime using function handlers.
6
+ tags:
7
+ - request-handling
8
+ - backends
9
+ ---
10
+
11
+ Zuplo supports working with `FormData` including `multipart/form-data`. In this
12
+ simple example we show how you can parse a multipart entry and read the stream
13
+ into memory for use in the Zuplo runtime.
14
+
15
+ In this case, we upload a JSON file as a multipart/form-data entry using
16
+ Insomnia, with a key `foo`
17
+
18
+ ![Insomnia multipart/form-data](../../public/media/handling-form-data/2d372851-af24-429b-8eeb-cb880589f30d.png)
19
+
20
+ We can then handle this programmatically inside Zuplo using a function handler.
21
+ We also modify the JSON before forwarding on to the target backend server.
22
+
23
+ ```ts
24
+ import { ZuploContext, ZuploRequest } from "@zuplo/runtime";
25
+
26
+ // FormData can return different types in different circumstances
27
+ // use this function to convert both to strings
28
+ async function readFileOrStringContent(data: unknown) {
29
+ if (data.constructor.name === "File") {
30
+ return await (data as File).text();
31
+ }
32
+ return data as string;
33
+ }
34
+
35
+ export default async function (request: ZuploRequest, context: ZuploContext) {
36
+ const formData = await request.formData();
37
+
38
+ // read the form-data entry as a 'Blob' type
39
+ const blob = formData.get("foo");
40
+
41
+ // stream the body into memory
42
+ const json = await readFileOrStringContent(blob);
43
+
44
+ // parse the JSON document
45
+ const object = JSON.parse(json);
46
+
47
+ // Modify the document somehow before forwarding on to the backend
48
+ object.newKey = "newValue";
49
+
50
+ // Make a standard POST to a backend with a JSON body
51
+ const response = fetch("https://backend-origin.com/example", {
52
+ method: "POST",
53
+ headers: {
54
+ "content-type": "application/json",
55
+ },
56
+ body: JSON.stringify(object, null, 2),
57
+ });
58
+
59
+ return response;
60
+ }
61
+ ```
@@ -0,0 +1,109 @@
1
+ ---
2
+ title: Health Check Handler
3
+ sidebar_label: Health Checks
4
+ description:
5
+ Learn how to set up health check endpoints to monitor your API Gateway and
6
+ backend services.
7
+ tags:
8
+ - observability
9
+ - backends
10
+ ---
11
+
12
+ Part of running a reliable API Gateway is ensuring that the service is healthy
13
+ and available. With Zuplo, it's easy to set up a health check endpoint that can
14
+ be used to ensure the health of both your Zuplo Gateway and your backend (as
15
+ well as the connectivity between them).
16
+
17
+ A typical health check endpoint on your API Gateway will exercise some of the
18
+ most important policies (such as authentication) and then make a simple request
19
+ to your backend to ensure that it's reachable and functioning.
20
+
21
+ ## Setting up a Health Check Handler
22
+
23
+ To set up a health check handler, you will need to create a new route in your
24
+ Zuplo Gateway. This route will be used to handle health check requests.
25
+
26
+ You'll create a new route with the path `/health` and the method `GET`. In your
27
+ OpenAPI file this would look like:
28
+
29
+ ```json title="config/routes.oas.json"
30
+ {
31
+ "paths": {
32
+ "/health": {
33
+ "get": {
34
+ "summary": "Health Check",
35
+ "description": "Checks the health of the API Gateway and backend.",
36
+ "responses": {
37
+ "200": {
38
+ "description": "OK"
39
+ },
40
+ "503": {
41
+ "description": "Service Unavailable"
42
+ }
43
+ },
44
+ "x-zuplo-route": {
45
+ "corsPolicy": "anything-goes",
46
+ "handler": {
47
+ "export": "default",
48
+ "module": "$import(./modules/health)"
49
+ },
50
+ "policies": {
51
+ "inbound": ["my-auth-policy"]
52
+ }
53
+ }
54
+ }
55
+ }
56
+ }
57
+ }
58
+ ```
59
+
60
+ Next, you'll create a custom handler module that will be used to process the
61
+ health check requests. This module will make a simple request to your backend to
62
+ ensure that it's reachable and functioning. If you have multiple backend
63
+ services you can check each of them.
64
+
65
+ ```ts title="modules/health.ts"
66
+ import { ZuploContext, ZuploRequest, ZuploResponse } from "@zuplo/runtime";
67
+
68
+ export default async function handler(
69
+ request: ZuploRequest,
70
+ context: ZuploContext,
71
+ ): Promise<ZuploResponse> {
72
+ try {
73
+ // Make a simple request to the backend to check its health
74
+ const responses = await Promise.allSettled([
75
+ fetch("https://backend-1.example.com/health", {
76
+ method: "GET",
77
+ headers: {
78
+ "Content-Type": "application/json",
79
+ },
80
+ }),
81
+ fetch("https://backend-2.example.com/health", {
82
+ method: "GET",
83
+ headers: {
84
+ "Content-Type": "application/json",
85
+ },
86
+ }),
87
+ ]);
88
+ const backendResponse = responses.find(
89
+ (res) => res.status === "fulfilled",
90
+ ) as PromiseFulfilledResult<Response> | undefined;
91
+ if (!backendResponse) {
92
+ context.log.error("All backend health checks failed", { responses });
93
+ return new ZuploResponse("Service Unavailable", { status: 503 });
94
+ } else {
95
+ const failedResponses = responses.filter(
96
+ (res) => res.status === "rejected",
97
+ ) as PromiseRejectedResult[];
98
+ context.log.error("Backend health check failed", {
99
+ statuses: failedResponses.map((res) => res.reason.status),
100
+ statusText: failedResponses.map((res) => res.reason.statusText),
101
+ });
102
+ return new ZuploResponse("Service Unavailable", { status: 503 });
103
+ }
104
+ } catch (error) {
105
+ context.log.error("Error during health check", { error });
106
+ return new ZuploResponse("Service Unavailable", { status: 503 });
107
+ }
108
+ }
109
+ ```