Documentation Index
Fetch the complete documentation index at: https://docs.jelou.ai/llms.txt
Use this file to discover all available pages before exploring further.
Encapsule uma API externa injetando credenciais dos secrets. O cliente chama sua função, e sua função chama a API real com as chaves corretas.
Padrão: rota com parâmetros + injeção de autenticação + transformação de resposta.
import { define, z } from "@jelou/functions";
export default define({
name: "api-proxy",
description: "Proxy to an external API with injected authentication",
input: z.object({
fields: z.array(z.string()).optional().describe("Fields to include in the response"),
}),
config: {
path: "/users/:id",
methods: ["GET"],
cors: {
origin: "https://app.example.com",
credentials: true,
},
},
handler: async (input, ctx) => {
const apiKey = ctx.env.get("INTERNAL_API_KEY");
const baseUrl = ctx.env.get("API_BASE_URL");
ctx.log("Proxy request", {
userId: ctx.params.id,
fields: input.fields,
});
const res = await fetch(
`${baseUrl}/api/users/${ctx.params.id}`,
{ headers: { Authorization: `Bearer ${apiKey}` } },
);
if (!res.ok) {
ctx.log("Upstream error", { status: res.status, userId: ctx.params.id });
return { error: "not_found", status: res.status };
}
const user = await res.json();
const result: Record<string, unknown> = {
id: user.id,
name: user.name,
email: user.email,
};
if (input.fields?.includes("address")) {
result.address = user.address;
}
if (input.fields?.includes("orders")) {
result.recentOrders = user.orders?.slice(0, 5);
}
return result;
},
});
Testes locais
curl "http://localhost:3000/users/42?fields=address,orders"
config.path: "/users/:id" — o :id é capturado em ctx.params.id.
- As credenciais nunca são expostas ao cliente; elas ficam nos secrets.
cors.origin restringe quais domínios podem chamar o proxy pelo navegador.
- Você pode transformar ou filtrar a resposta antes de retorná-la.