@ffsm/napi
Version:
Napi - A framework using with Next.js for building APIs.
90 lines (89 loc) • 3.04 kB
JavaScript
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import { NextResponse } from "next/server";
import { NapiHttpCode, NapiHttpStatus, NapiMethod } from "./enums";
export class NapiJsonSchema {
constructor() { }
}
const statuses = {
[NapiMethod.GET]: {
status: NapiHttpStatus.OK,
statusText: NapiHttpCode.OK,
},
[NapiMethod.POST]: {
status: NapiHttpStatus.CREATED,
statusText: NapiHttpCode.CREATED,
},
[NapiMethod.PUT]: {
status: NapiHttpStatus.OK,
statusText: NapiHttpCode.OK,
},
[NapiMethod.DELETE]: {
status: NapiHttpStatus.OK,
statusText: NapiHttpCode.OK,
},
[NapiMethod.PATCH]: {
status: NapiHttpStatus.OK,
statusText: NapiHttpCode.OK,
},
[NapiMethod.OPTIONS]: {
status: NapiHttpStatus.OK,
statusText: NapiHttpCode.OK,
},
[NapiMethod.HEAD]: {
status: NapiHttpStatus.OK,
statusText: NapiHttpCode.OK,
},
};
export class NapiResponse {
constructor(controller, context, switchInstance) {
this.controller = controller;
this.context = context;
this.switchInstance = switchInstance;
}
async getInit() {
const router = this.context.getRouter();
const method = this.context.getMethod();
const headers = Object.assign({}, router.headers);
const cookies = router.cookies;
let rs = Object.assign(Object.assign({}, statuses[router.method]), { headers });
headers["set-cookie"] = cookies.map((_a) => {
var { name, value } = _a, options = __rest(_a, ["name", "value"]);
return router.cookie.serialize(name, value, options);
}).join("; ");
if (!method) {
return rs;
}
const payload = this.controller.getResponse(method);
if (!payload) {
return rs;
}
const { status, statusText, headers: payloadHeaders } = payload;
rs = Object.assign(rs, {
status,
statusText,
});
if (typeof payloadHeaders === "function") {
rs.headers = Object.assign(rs.headers, await payloadHeaders(this.switchInstance));
}
else if (payloadHeaders instanceof Promise) {
rs.headers = Object.assign(rs.headers, await payloadHeaders);
}
else if (typeof payloadHeaders === "object") {
rs.headers = Object.assign(rs.headers, payloadHeaders);
}
return rs;
}
async send(data) {
return NextResponse.json(data, await this.getInit());
}
}