import fastify from "fastify";
import fastifyHttpErrorsEnhanced from "fastify-http-errors-enhanced";
import { ForbiddenError } from "http-errors-enhanced";

const server = fastify();

await server.register(fastifyHttpErrorsEnhanced);

// code プロパティが失われる
server.get("/error", () => new ForbiddenError());

// これらは同じで、エラーの引数のメッセージだったものが、スタックトレースが取れるようになる
// また、NODE_ENV=production のとき "An error occurred trying to process your request." にすべて置き換わる
server.get("/return", {
  handler() {
    return new Error("return.");
  },
});
server.get("/throw", {
  handler() {
    throw new Error("throw.");
  },
});
server.get("/async", {
  async handler() {
    throw new Error("async.");
  },
});
server.get("/async-return", {
  async handler() {
    return new Error("async return.");
  },
});

server.get("/validation", {
  schema: {
    // 400 エラーの構造が変わり failedValidations.query.a プロパティが生える
    querystring: {
      type: "object",
      properties: { a: { type: "string" } },
      required: ["a"],
    },
  },
  async handler() {
    return "ok";
  },
});

await server.listen({ port: 3000 });