@zenstackhq/server
Version:
ZenStack server-side adapters
75 lines • 2.54 kB
JavaScript
;
/* eslint-disable @typescript-eslint/no-non-null-assertion */
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = factory;
const api_1 = require("../api");
const shared_1 = require("../shared");
/**
* Creates a TanStack Start server route handler which encapsulates Prisma CRUD operations.
*
* @param options Options for initialization
* @returns A TanStack Start server route handler
*/
function factory(options) {
const { modelMeta, zodSchemas } = (0, shared_1.loadAssets)(options);
const requestHandler = options.handler || (0, api_1.RPCApiHandler)();
return async ({ request, params }) => {
const prisma = (await options.getPrisma(request, params));
if (!prisma) {
return new Response(JSON.stringify({ message: 'unable to get prisma from request context' }), {
status: 500,
headers: {
'Content-Type': 'application/json',
},
});
}
const url = new URL(request.url);
const query = Object.fromEntries(url.searchParams);
// Extract path from params._splat for catch-all routes
const path = params._splat;
if (!path) {
return new Response(JSON.stringify({ message: 'missing path parameter' }), {
status: 400,
headers: {
'Content-Type': 'application/json',
},
});
}
let requestBody;
if (request.body) {
try {
requestBody = await request.json();
}
catch {
// noop
}
}
try {
const r = await requestHandler({
method: request.method,
path,
query,
requestBody,
prisma,
modelMeta,
zodSchemas,
logger: options.logger,
});
return new Response(JSON.stringify(r.body), {
status: r.status,
headers: {
'Content-Type': 'application/json',
},
});
}
catch (err) {
return new Response(JSON.stringify({ message: `An unhandled error occurred: ${err}` }), {
status: 500,
headers: {
'Content-Type': 'application/json',
},
});
}
};
}
//# sourceMappingURL=handler.js.map