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,90 @@
1
+ ---
2
+ title: API Key Manager React Component
3
+ sidebar_label: React Component
4
+ ---
5
+
6
+ Zuplo provides an open source react component that can be used on your own UI to
7
+ provider users with self-serve access to API Keys for your Zuplo powered API.
8
+
9
+ ![Component Screenshot](../../public/media/api-key-react-component/cedd8ad0-9433-4433-80f6-86545ba0d41a.png)
10
+
11
+ To see a demo of the component visit https://api-key-manager.com.
12
+
13
+ ## Getting Started
14
+
15
+ This component can be used with any React framework. It's compatible with
16
+ Tailwind CSS, but Tailwind isn't required.
17
+
18
+ :::tip
19
+
20
+ See our blog for an
21
+ [end to end tutorial](https://zuplo.com/blog/2023/08/08/open-source-release) on
22
+ using this React component and the translation API.
23
+
24
+ :::
25
+
26
+ ### Install
27
+
28
+ Install the component in your React project
29
+
30
+ ```bash
31
+ npm install @zuplo/react-api-key-manager
32
+ ```
33
+
34
+ ### With Tailwind
35
+
36
+ Import the component's stylesheet into your `global.css` or equivalent file. The
37
+ styles will use your project's tailwind configuration to provide a consistent
38
+ theme.
39
+
40
+ ```css
41
+ @tailwind base;
42
+ @tailwind components;
43
+ @tailwind utilities;
44
+ @import "@zuplo/react-api-key-manager/tailwind.css";
45
+ ```
46
+
47
+ ### Without Tailwind
48
+
49
+ Import the component's stylesheet into your root component (for example,
50
+ `App.jsx`), typically below your other stylesheets.
51
+
52
+ ```jsx
53
+ import "./styles/globals.css";
54
+ import "@zuplo/react-api-key-manager/index.css";
55
+ ```
56
+
57
+ ### Custom Styles
58
+
59
+ The component's CSS can be completely customized by copying either the
60
+ `tailwind.css` or `index.css` files from
61
+ `node_modules/@zuplo/react-api-key-manager/dist/` and modifying the styles to
62
+ suite your needs.
63
+
64
+ ## Usage
65
+
66
+ You can import the `ReactAPIKeyManager` into your React project directly.
67
+
68
+ ```ts
69
+ import {
70
+ ApiKeyManager,
71
+ DefaultApiKeyManagerProvider,
72
+ } from "@zuplo/react-api-key-manager";
73
+
74
+ const MyComponent = () => {
75
+ const defaultProvider = new DefaultApiKeyManagerProvider(
76
+ "<BASE_URL>",
77
+ "<ACCESS_TOKEN>"
78
+ );
79
+
80
+ return <ApiKeyManager provider={provider} />;
81
+ };
82
+ ```
83
+
84
+ ## Backend API
85
+
86
+ The API Key Manager component interacts with an API that allows authorized users
87
+ to manage their own keys. The easiest way to get started is to use the
88
+ [Auth Translation API](https://github.com/zuplo/sample-auth-translation-api)
89
+ sample and deploy it to [Zuplo](https://zuplo.com). By default this sample
90
+ connects the [Zuplo API Key Management Service](./api-key-management.mdx).
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: Service Limits
3
+ ---
4
+
5
+ Zuplo's API Key Service can handle billions of requests and tokens. The service
6
+ can accommodate even virtually any scale required. However, by default the
7
+ service is set with limits to ensure that each Zuplo customer has a performant
8
+ and reliable experience.
9
+
10
+ For customers who need limits beyond what's set in this document, reach out to
11
+ our sales team and we'll be happy to design a plan that fits your needs. Email
12
+ [sales@zuplo.com](mailto:sales@zuplo.com).
13
+
14
+ For more details see [Zuplo Platform Limits](./limits.mdx).
@@ -0,0 +1,119 @@
1
+ ---
2
+ title: Archiving requests to storage
3
+ sidebar_label: "Archiving Requests"
4
+ description:
5
+ Learn how to archive incoming request text bodies to Azure Blob Storage using
6
+ custom policies in Zuplo.
7
+ tags:
8
+ - request-handling
9
+ - observability
10
+ ---
11
+
12
+ > Note - this sample uses Policies, read [this guide](../policies) first.
13
+
14
+ In this sample, we'll show how you can archive the text body of incoming
15
+ requests to Azure Blob Storage. We also have a post on
16
+ [Archiving to AWS S3 Storage](https://zuplo.com/blog/2022/03/22/custom-policies-in-code-archiving-requests-to-s3).
17
+
18
+ First, let's set up Azure. You'll need a container in Azure storage
19
+ ([docs](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-create?tabs=azure-portal)).
20
+ Once you have your container you'll need the URL - click the **Properties** tab
21
+ of your container as shown below.
22
+
23
+ ![Azure](../../public/media/guides/archiving-requests-to-storage/Untitled.png)
24
+
25
+ This URL will be the `blobPath` in our policy options.
26
+
27
+ Next, we'll need a SAS (Shared Access Secret) to authenticate with Azure. You
28
+ can generate one of these on the `Shared access tokens` tab.
29
+
30
+ Note, you should minimize the permissions - and select only the `Create`
31
+ permission. Choose a sensible start and expiration time for your token. Note, we
32
+ don't recommend restricting IP addresses because Zuplo runs at the edge in over
33
+ 200 data-centers world-wide.
34
+
35
+ ![shared access tokens](../../public/media/guides/archiving-requests-to-storage/Untitled_1.png)
36
+
37
+ Then generate your SAS token - copy the token (not the URL) to the clipboard and
38
+ enter it into a new environment variable in your API called `BLOB_CREATE_SAS`.
39
+ You'll need another environment variable called `BLOB_CONTAINER_PATH`.
40
+
41
+ ![Zuplo portal](../../public/media/guides/archiving-requests-to-storage/Untitled_2.png)
42
+
43
+ > Note - production customers should talk to a Zuplo representative to get help
44
+ > managing their secure keys.
45
+
46
+ We'll write a policy called `request-archive-policy` that can be used on all
47
+ routes.
48
+
49
+ ```ts title="file-archive-policy.ts"
50
+ import { ZuploRequest, ZuploContext } from "@zuplo/runtime";
51
+
52
+ export type RequestArchivePolicyOptions = {
53
+ blobContainerPath: string;
54
+ blobCreateSas: string;
55
+ };
56
+
57
+ export default async function (
58
+ request: ZuploRequest,
59
+ context: ZuploContext,
60
+ options: RequestArchivePolicyOptions,
61
+ ) {
62
+ // because we will read the body, we need to
63
+ // create a clone of this request first, otherwise
64
+ // there may be two attempts to read the body
65
+ // causing a runtime error
66
+ const clone = request.clone();
67
+ const body = await clone.text();
68
+
69
+ // let's generate a unique blob name based on the date and requestId
70
+ const blobName = `${Date.now()}-${request.requestId}.req.txt`;
71
+
72
+ const url = `${options.blobContainerPath}/${blobName}?${options.blobCreateSas}`;
73
+
74
+ const result = await fetch(url, {
75
+ method: "PUT",
76
+ body: body,
77
+ headers: {
78
+ "x-ms-blob-type": "BlockBlob",
79
+ },
80
+ });
81
+
82
+ if (result.status > 201) {
83
+ const err = {
84
+ message: `Error archiving file`,
85
+ status: result.status,
86
+ body: await result.text(),
87
+ };
88
+ request.logger.error(err);
89
+ }
90
+
91
+ // continue
92
+ return request;
93
+ }
94
+ ```
95
+
96
+ Finally, you need to configure your policies.json file to include the policy,
97
+ example below:
98
+
99
+ ```json
100
+ {
101
+ "name": "request-archive-policy",
102
+ "policyType": "code-policy",
103
+ "handler": {
104
+ "export": "default",
105
+ "module": "$import(./modules/archive-request-policy)",
106
+ "options": {
107
+ "blobCreateSas": "$env(BLOB_CREATE_SAS)",
108
+ "blobContainerPath": "$env(BLOB_CONTAINER_PATH)"
109
+ }
110
+ }
111
+ }
112
+ ```
113
+
114
+ Don't forget to reference the `file-archive-policy` in the policies.inbound
115
+ property of your routes.
116
+
117
+ Here's the policy in action:
118
+
119
+ ![Archive request policy in action](../../public/media/guides/archiving-requests-to-storage/2021-11-21_22.51.33.gif)
@@ -0,0 +1,184 @@
1
+ ---
2
+ title: Branch-Based Deployments
3
+ sidebar_label: Branch-Based Deployments
4
+ ---
5
+
6
+ Zuplo uses a branch-based deployment model that automatically maps Git branches
7
+ to environments. This GitOps approach allows teams to manage API deployments
8
+ using familiar version control workflows.
9
+
10
+ ## How Branch-Based Deployments Work
11
+
12
+ When you connect your Zuplo project to a Git repository (GitHub, GitLab,
13
+ Bitbucket, or Azure DevOps), Zuplo automatically deploys your API whenever
14
+ changes are pushed to a branch. The deployment model follows these rules:
15
+
16
+ 1. **One branch = One environment**: Each Git branch creates a corresponding
17
+ Zuplo environment
18
+ 2. **Default branch = Production**: The repository's default branch (typically
19
+ `main` or `master`) deploys to the **Production** environment
20
+ 3. **All other branches = Preview**: Any branch that's not the default branch
21
+ deploys to a **Preview** environment
22
+
23
+ ```
24
+ Git Repository Zuplo Environments
25
+ ───────────────── ──────────────────
26
+ main ─────────────────► Production (main)
27
+ staging ─────────────────► Preview (staging)
28
+ feature/auth ─────────────────► Preview (feature/auth)
29
+ bugfix/123 ─────────────────► Preview (bugfix/123)
30
+ ```
31
+
32
+ ## Environment Names and URLs
33
+
34
+ When Zuplo deploys an environment from a branch, the environment name matches
35
+ the branch name. For example:
36
+
37
+ | Branch Name | Environment Name | Example URL |
38
+ | -------------- | ---------------- | --------------------------------------------------- |
39
+ | `main` | main | `https://my-project-main-abc1234.zuplo.app` |
40
+ | `staging` | staging | `https://my-project-staging-def5678.zuplo.app` |
41
+ | `feature/auth` | feature/auth | `https://my-project-feature-auth-ghi9012.zuplo.app` |
42
+
43
+ :::note
44
+
45
+ The environment URL includes a unique identifier to ensure each deployment has a
46
+ distinct address. Configure [custom domains](./custom-domains.mdx) for your
47
+ environments.
48
+
49
+ :::
50
+
51
+ ## Production vs Preview Environments
52
+
53
+ ### What Determines the Production Environment
54
+
55
+ The **Production** environment is determined by your repository's **default
56
+ branch** setting. This is configured in your Git provider (GitHub, GitLab,
57
+ etc.), not in Zuplo. When you change your repository's default branch, Zuplo
58
+ automatically treats the new default branch as Production.
59
+
60
+ To change which branch is your Production environment:
61
+
62
+ 1. Go to your Git repository settings (for example, GitHub > Settings >
63
+ General > Default branch)
64
+ 2. Change the default branch to your desired branch
65
+ 3. Zuplo will now treat deployments from this branch as Production
66
+
67
+ ### Technical Differences
68
+
69
+ There is **no technical difference** between Production and Preview
70
+ environments. Both:
71
+
72
+ - Have identical performance characteristics
73
+ - Support all Zuplo features
74
+ - Run on the same infrastructure
75
+
76
+ The distinction is primarily for:
77
+
78
+ - **Environment variable management**: You can set different values for
79
+ Production vs Preview environments
80
+ - **API key buckets**: Production and Preview environments use separate API key
81
+ buckets by default
82
+ - **Organization**: Helps teams distinguish between live and test deployments
83
+
84
+ ### Using Preview Environments as Production
85
+
86
+ Some customers choose to use Preview environments as additional "production"
87
+ deployments. For example, you might have:
88
+
89
+ - `main` → Production (US customers)
90
+ - `eu-production` → Preview, but serving EU customers
91
+ - `staging` → Preview for testing
92
+
93
+ This works because Preview environments have identical capabilities to
94
+ Production. You can override
95
+ [environment variables](./environment-variables.mdx) and
96
+ [API key buckets](./api-key-buckets.mdx) for specific Preview environments to
97
+ support this pattern.
98
+
99
+ ## Creating New Environments
100
+
101
+ Creating a new environment is as simple as creating a new Git branch:
102
+
103
+ ```bash
104
+ # Create and push a new branch
105
+ git checkout -b my-new-feature
106
+ git push -u origin my-new-feature
107
+ ```
108
+
109
+ Within seconds, Zuplo deploys a new environment named `my-new-feature`. You can
110
+ see the new environment in the Zuplo portal's environment selector.
111
+
112
+ ## Deleting Environments
113
+
114
+ When you delete a branch in your Git repository, the corresponding Zuplo
115
+ environment is **not automatically deleted**. To delete an environment:
116
+
117
+ 1. Go to the Zuplo portal
118
+ 2. Navigate to **Settings** > **Environments**
119
+ 3. Select the environment and delete it
120
+
121
+ Alternatively, use the [Zuplo CLI](../cli/delete.mdx):
122
+
123
+ ```bash
124
+ npx zuplo delete --url https://your-environment-url.zuplo.app --api-key $ZUPLO_API_KEY
125
+ ```
126
+
127
+ ## Automatic Deployments on Push
128
+
129
+ With the Git integration enabled, every push to a branch triggers an automatic
130
+ deployment:
131
+
132
+ 1. **Push to default branch**: Updates the Production environment
133
+ 2. **Push to other branches**: Updates the corresponding Preview environment
134
+ 3. **Create new branch**: Creates a new Preview environment
135
+ 4. **Merge pull request**: Updates the target branch's environment
136
+
137
+ This enables powerful GitOps workflows:
138
+
139
+ - **Feature branches**: Each feature gets its own testable environment
140
+ - **Pull request previews**: Review changes in a live environment before merging
141
+ - **Protected branches**: Use branch protection rules to gate Production
142
+ deployments
143
+
144
+ ## Environment Variables Per Branch
145
+
146
+ Environment variables can be scoped to specific environments:
147
+
148
+ | Scope | Description |
149
+ | ---------------- | ---------------------------------------------------------- |
150
+ | Production | Only applies to the Production environment |
151
+ | Preview | Applies to all Preview environments |
152
+ | Specific Preview | Applies to a specific Preview environment (by branch name) |
153
+ | Working Copy | Only applies to development environments |
154
+
155
+ See [Environment Variables](./environment-variables.mdx) for configuration
156
+ details.
157
+
158
+ ## Switching the Production Branch
159
+
160
+ If you need to change which branch serves as Production:
161
+
162
+ 1. **Update your Git repository's default branch**:
163
+ - GitHub: Settings > General > Default branch
164
+ - GitLab: Settings > Repository > Branch defaults
165
+ - Bitbucket: Repository settings > Branching model
166
+ - Azure DevOps: Project settings > Repositories > Default branch
167
+
168
+ 2. **Verify the change in Zuplo**: The environment deployed from your new
169
+ default branch will now be labeled as Production
170
+
171
+ :::caution
172
+
173
+ Changing the default branch affects which environment receives Production
174
+ environment variables and uses the Production API key bucket. Plan this change
175
+ carefully to avoid service disruption.
176
+
177
+ :::
178
+
179
+ ## Next Steps
180
+
181
+ - [Environments Overview](./environments.mdx) - Learn about environment types
182
+ - [Source Control Integration](./source-control.mdx) - Set up Git integration
183
+ - [Custom CI/CD Pipelines](./custom-ci-cd.mdx) - Build custom deployment
184
+ workflows
@@ -0,0 +1,117 @@
1
+ ---
2
+ title: Bypass a Policy for Testing
3
+ sidebar_label: Bypass a Policy
4
+ description:
5
+ Learn how to bypass policies for testing and debugging using API key metadata
6
+ or custom policies in Zuplo.
7
+ tags:
8
+ - testing
9
+ - authentication
10
+ - custom-code
11
+ ---
12
+
13
+ There are times when you need to bypass a policy for purposes such as testing,
14
+ debugging, writing health checks, etc. This guide will show you a few ways to
15
+ bypass a policy.
16
+
17
+ ## Bypass a Policy Using a Test API Key
18
+
19
+ If you are using Zuplo API Key Authentication and want to create a test API Key
20
+ that can bypass a policy, you can quickly do so by using the API Key metadata
21
+ and a custom policy.
22
+
23
+ ### Step 1: Create a Custom Policy
24
+
25
+ The
26
+ [Custom Code Inbound Policy](../policies/custom-code-inbound.mdx#writing-a-policy)
27
+ is essentially a wrapper around whatever policy you want to bypass. In this
28
+ example, we will create a custom policy that bypasses the `monetization-inbound`
29
+ policy.
30
+
31
+ This policy first checks for the presence of a `testApiKey` flag in the user's
32
+ `data` (which is the API Key metadata). If the flag is present, the policy
33
+ returns the request as is. Otherwise, it invokes the `monetization-inbound`
34
+ policy using the `invokeInboundPolicy` method on the `ZuploContext` object.
35
+
36
+ Create the custom policy configuration in the `policies.json` file.
37
+
38
+ ```json title="config/policies.json"
39
+ {
40
+ "policies": [{
41
+ {
42
+ "name": "monetization-with-bypass-inbound",
43
+ "policyType": "custom-code-inbound",
44
+ "handler": {
45
+ "export": "default",
46
+ "module": "$import(./modules/monetization-with-bypass)",
47
+ "options": {
48
+ "config1": "YOUR_VALUE",
49
+ "config2": true
50
+ }
51
+ },
52
+ }
53
+ }]
54
+ }
55
+ ```
56
+
57
+ Create a new module for the policy code.
58
+
59
+ ```ts title="modules/monetization-with-bypass.ts"
60
+ import { ZuploContext, ZuploRequest } from "@zuplo/runtime";
61
+
62
+ export default async function policy(
63
+ request: ZuploRequest,
64
+ context: ZuploContext,
65
+ ) {
66
+ if (request.user.data.testApiKey === true) {
67
+ context.log.info("Bypassing monetization-inbound policy for testing.");
68
+ return request;
69
+ }
70
+
71
+ return context.invokeInboundPolicy("monetization-inbound", request);
72
+ }
73
+ ```
74
+
75
+ ### Step 2: Replace the Monetization Policy with the Custom Policy
76
+
77
+ Wherever you use the `monetization-inbound` policy, replace it with the custom
78
+ the custom policy.
79
+
80
+ ```json title="config/routes.oas.json"
81
+ "x-zuplo-route": {
82
+ "corsPolicy": "none",
83
+ "handler": {
84
+ "export": "default",
85
+ "module": "$import(./modules/todos-and-users)",
86
+ "options": {}
87
+ },
88
+ "policies": {
89
+ "inbound": ["monetization-with-bypass-inbound"]
90
+ }
91
+ }
92
+ ```
93
+
94
+ ### Step 3: Create a Test API Key
95
+
96
+ To create a test API Key, navigate to **Services** in your Zuplo Project. Select
97
+ the API Key Bucket you want to use and click **Create Consumer**. Enter a name
98
+ for the consumer. Set the metadata to include the `testApiKey` flag as shown
99
+ below.
100
+
101
+ ![Test API Key](../../public/media/bypass-policy-for-testing/image.png)
102
+
103
+ Now when you call the API with the test API Key, the `monetization-inbound`
104
+ policy will be bypassed.
105
+
106
+ ## Use a JWT Token Claim
107
+
108
+ In the above example, we used the API Key metadata to bypass the policy.
109
+ However, if you are using JWT authentication, you can follow the same principle
110
+ by adding a custom claim to the JWT token. Many providers, like
111
+ [Auth0](https://auth0.com/docs/secure/tokens/json-web-tokens/create-custom-claims),
112
+ allow you to add custom claims to the JWT token.
113
+
114
+ The claims for a JWT token are added to the `request.user.data` object when you
115
+ use one of the Zuplo JWT Authentication policies. So you can use the same code
116
+ as the previous API Token example, by adding a custom `testApiKey` claim to the
117
+ JWT token.
@@ -0,0 +1,17 @@
1
+ ---
2
+ title: How to check an incoming IP address
3
+ sidebar_label: "Check IP Address"
4
+ description:
5
+ Learn how to access the true client IP address of requests using the
6
+ true-client-ip header.
7
+ tags:
8
+ - request-handling
9
+ - deployment
10
+ ---
11
+
12
+ Sometimes you want to access the true IP address of the gateway's client making
13
+ the current request. To do this you can read the `true-client-ip` header:
14
+
15
+ ```ts
16
+ const ip = request.headers.get("true-client-ip");
17
+ ```
@@ -0,0 +1,49 @@
1
+ ---
2
+ title: "Azure Pipelines: Basic Deployment"
3
+ sidebar_label: Basic Deployment
4
+ ---
5
+
6
+ The simplest pipeline deploys your API to Zuplo on every push to main.
7
+
8
+ ```yaml title="azure-pipelines.yml"
9
+ trigger:
10
+ - main
11
+
12
+ pool:
13
+ vmImage: ubuntu-latest
14
+
15
+ steps:
16
+ - task: NodeTool@0
17
+ inputs:
18
+ versionSpec: "20.x"
19
+ displayName: "Install Node.js"
20
+
21
+ - script: npm install
22
+ displayName: "Install dependencies"
23
+
24
+ - script: npx zuplo deploy --api-key $(ZUPLO_API_KEY)
25
+ displayName: "Deploy to Zuplo"
26
+ ```
27
+
28
+ This pipeline:
29
+
30
+ 1. Triggers on pushes to the `main` branch
31
+ 2. Sets up Node.js 20
32
+ 3. Installs dependencies
33
+ 4. Deploys to Zuplo using the branch name as the environment name
34
+
35
+ ## Adding the API Key
36
+
37
+ Add `ZUPLO_API_KEY` as a pipeline variable:
38
+
39
+ 1. Edit your pipeline in Azure DevOps
40
+ 2. Click **Variables**
41
+ 3. Add `ZUPLO_API_KEY` with your API key
42
+ 4. Check **Keep this value secret**
43
+
44
+ Or use a variable group for sharing across pipelines.
45
+
46
+ ## Next Steps
47
+
48
+ - Add [testing after deployment](./deploy-and-test.mdx)
49
+ - Set up [PR preview environments](./pr-preview-environments.mdx)
@@ -0,0 +1,47 @@
1
+ ---
2
+ title: "Azure Pipelines: Deploy and Test"
3
+ sidebar_label: Deploy and Test
4
+ ---
5
+
6
+ Run your test suite against the deployed environment to validate changes.
7
+
8
+ ```yaml title="azure-pipelines.yml"
9
+ trigger:
10
+ - main
11
+
12
+ pr:
13
+ - main
14
+
15
+ pool:
16
+ vmImage: ubuntu-latest
17
+
18
+ steps:
19
+ - task: NodeTool@0
20
+ inputs:
21
+ versionSpec: "20.x"
22
+ displayName: "Install Node.js"
23
+
24
+ - script: npm install
25
+ displayName: "Install dependencies"
26
+
27
+ - script: |
28
+ set -o pipefail
29
+ npx zuplo deploy --api-key $(ZUPLO_API_KEY) 2>&1 | tee ./DEPLOYMENT_STDOUT
30
+ displayName: "Deploy to Zuplo"
31
+
32
+ - script: |
33
+ DEPLOYMENT_URL=$(grep -oP 'Deployed to \K(https://[^ ]+)' ./DEPLOYMENT_STDOUT)
34
+ npx zuplo test --endpoint "$DEPLOYMENT_URL"
35
+ displayName: "Run tests"
36
+ ```
37
+
38
+ This pipeline:
39
+
40
+ 1. Deploys to Zuplo and captures the output
41
+ 2. Extracts the deployment URL from the output
42
+ 3. Runs tests against the deployed environment
43
+
44
+ ## Next Steps
45
+
46
+ - Add [PR preview environments](./pr-preview-environments.mdx) with cleanup
47
+ - Run [local tests](./local-testing.mdx) before deploying
@@ -0,0 +1,59 @@
1
+ ---
2
+ title: "Azure Pipelines: Local Testing in CI"
3
+ sidebar_label: Local Testing in CI
4
+ ---
5
+
6
+ Test against a local Zuplo server before deploying anywhere.
7
+
8
+ ```yaml title="azure-pipelines.yml"
9
+ trigger:
10
+ - main
11
+
12
+ pool:
13
+ vmImage: ubuntu-latest
14
+
15
+ stages:
16
+ - stage: LocalTest
17
+ displayName: "Local Testing"
18
+ jobs:
19
+ - job: Test
20
+ steps:
21
+ - task: NodeTool@0
22
+ inputs:
23
+ versionSpec: "20.x"
24
+ displayName: "Install Node.js"
25
+
26
+ - script: npm install
27
+ displayName: "Install dependencies"
28
+
29
+ - script: |
30
+ npx zuplo dev &
31
+ DEV_PID=$!
32
+ sleep 10
33
+ npx zuplo test --endpoint http://localhost:9000
34
+ kill $DEV_PID
35
+ displayName: "Start local server and run tests"
36
+
37
+ - stage: Deploy
38
+ displayName: "Deploy to Zuplo"
39
+ dependsOn: LocalTest
40
+ condition:
41
+ and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
42
+ jobs:
43
+ - job: Deploy
44
+ steps:
45
+ - task: NodeTool@0
46
+ inputs:
47
+ versionSpec: "20.x"
48
+
49
+ - script: npm install
50
+
51
+ - script: npx zuplo deploy --api-key $(ZUPLO_API_KEY)
52
+ displayName: "Deploy to Zuplo"
53
+ ```
54
+
55
+ Local tests run first. Only if they pass does deployment proceed.
56
+
57
+ ## Next Steps
58
+
59
+ - Add [multi-stage deployment](./multi-stage-deployment.mdx) with staging