@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 +37 -15
- package/dist/index.js.map +1 -1
- package/dist/initApi.d.ts.map +1 -1
- package/dist/requestValidation.d.ts +4 -0
- package/dist/requestValidation.d.ts.map +1 -0
- package/dist/types.d.ts +31 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
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,
|
|
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
|
|
27550
|
+
const requestPayload = method === "get" ? req.query : req.body ?? {};
|
|
27524
27551
|
try {
|
|
27525
|
-
const result = await handler(
|
|
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: (
|
|
27542
|
-
|
|
27543
|
-
|
|
27544
|
-
|
|
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" }));
|