@rpcbase/api 0.149.0 → 0.150.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.
package/dist/index.js CHANGED
@@ -27497,6 +27497,32 @@ var createApiErrorMiddleware = (options = {}) => (error, req, res, next) => {
27497
27497
  };
27498
27498
  var apiErrorMiddleware = createApiErrorMiddleware();
27499
27499
  //#endregion
27500
+ //#region src/requestValidation.ts
27501
+ var getErrorFields = (issues) => {
27502
+ const fields = {};
27503
+ for (const issue of issues) {
27504
+ const path = issue.path.map(String).join(".");
27505
+ if (!path) continue;
27506
+ const messages = fields[path] ?? [];
27507
+ messages.push(issue.message);
27508
+ fields[path] = messages;
27509
+ }
27510
+ return Object.keys(fields).length > 0 ? fields : void 0;
27511
+ };
27512
+ var getApiRoutePath = (route) => {
27513
+ if (typeof route === "string") return route;
27514
+ return "ROUTE" in route ? route.ROUTE : route.Route;
27515
+ };
27516
+ var parseApiRequest = (schema, input) => {
27517
+ const result = schema.safeParse(input);
27518
+ if (result.success) return result.data;
27519
+ throw new ApiHttpError(400, "invalid_request", {
27520
+ message: "Invalid request payload.",
27521
+ fields: getErrorFields(result.error.issues),
27522
+ cause: result.error
27523
+ });
27524
+ };
27525
+ //#endregion
27500
27526
  //#region src/initApi.ts
27501
27527
  var loadInitApiClient = async () => {
27502
27528
  return (await import("@rpcbase/client")).initApiClient;
@@ -27517,12 +27543,13 @@ var withApiRequestIdExposed = (options) => {
27517
27543
  };
27518
27544
  var initApi = async ({ app, routes, cors: corsOptions, errors }) => {
27519
27545
  await (await loadInitApiClient())({ app });
27520
- const registerHandler = (method, path, handler) => {
27546
+ const registerHandler = (method, route, handler) => {
27547
+ const path = getApiRoutePath(route);
27521
27548
  assert(path.startsWith("/api"), "API routes must start with /api");
27522
27549
  app[method](path, async (req, res, next) => {
27523
- const payload = method === "get" ? req.query : req.body ?? {};
27550
+ const requestPayload = method === "get" ? req.query : req.body ?? {};
27524
27551
  try {
27525
- const result = await handler(payload, {
27552
+ const result = await handler(typeof route === "string" ? requestPayload : parseApiRequest(route.requestSchema, requestPayload), {
27526
27553
  req,
27527
27554
  res
27528
27555
  });
@@ -27534,22 +27561,17 @@ var initApi = async ({ app, routes, cors: corsOptions, errors }) => {
27534
27561
  }
27535
27562
  });
27536
27563
  };
27564
+ const createApiMethod = (method) => ((route, handler) => {
27565
+ registerHandler(method, route, handler);
27566
+ });
27537
27567
  const api = {
27538
27568
  use: (path, middleware) => {
27539
27569
  app.use(path, middleware);
27540
27570
  },
27541
- get: (path, handler) => {
27542
- registerHandler("get", path, handler);
27543
- },
27544
- post: (path, handler) => {
27545
- registerHandler("post", path, handler);
27546
- },
27547
- put: (path, handler) => {
27548
- registerHandler("put", path, handler);
27549
- },
27550
- delete: (path, handler) => {
27551
- registerHandler("delete", path, handler);
27552
- }
27571
+ get: createApiMethod("get"),
27572
+ post: createApiMethod("post"),
27573
+ put: createApiMethod("put"),
27574
+ delete: createApiMethod("delete")
27553
27575
  };
27554
27576
  app.use("/api", (0, import_lib.default)(withApiRequestIdExposed(corsOptions)));
27555
27577
  app.use("/api", (0, import_express.json)({ limit: "8mb" }));