@modern-js/server-core
Version:
A Progressive React Framework for modern web development.
172 lines (171 loc) • 5.2 kB
JavaScript
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var serverBase_exports = {};
__export(serverBase_exports, {
ServerBase: () => ServerBase,
createServerBase: () => createServerBase
});
module.exports = __toCommonJS(serverBase_exports);
var import_class_private_method_get = require("@swc/helpers/_/_class_private_method_get");
var import_class_private_method_init = require("@swc/helpers/_/_class_private_method_init");
var import_server = require("@modern-js/plugin-v2/server");
var import_hono = require("hono");
var import_context = require("./context");
var import_hooks = require("./plugins/compat/hooks");
var import_utils = require("./utils");
var _applyMiddlewares = /* @__PURE__ */ new WeakSet();
class ServerBase {
/**
* Order
* - server runner
* - apply middlewares
*/
async init() {
const { serverConfig, config: cliConfig } = this.options;
const mergedConfig = (0, import_utils.loadConfig)({
cliConfig,
serverConfig: serverConfig || {}
});
const { serverContext } = await import_server.server.run({
plugins: this.plugins,
options: this.options,
config: mergedConfig,
handleSetupResult: import_hooks.handleSetupResult
});
serverContext.serverBase = this;
await serverContext.hooks.onPrepare.call();
this.serverContext = serverContext;
(0, import_class_private_method_get._)(this, _applyMiddlewares, applyMiddlewares).call(this);
return this;
}
addPlugins(plugins) {
this.plugins.push(...plugins);
}
get hooks() {
return this.serverContext.hooks;
}
get all() {
return this.app.all.bind(this.app);
}
get use() {
return this.app.use.bind(this.app);
}
get get() {
return this.app.get.bind(this.app);
}
get post() {
return this.app.post.bind(this.app);
}
get put() {
return this.app.put.bind(this.app);
}
get delete() {
return this.app.delete.bind(this.app);
}
get patch() {
return this.app.patch.bind(this.app);
}
get handle() {
return this.app.fetch.bind(this.app);
}
get request() {
return this.app.request.bind(this.app);
}
get notFound() {
return this.app.notFound.bind(this.app);
}
get onError() {
return this.app.onError.bind(this.app);
}
constructor(options) {
(0, import_class_private_method_init._)(this, _applyMiddlewares);
this.plugins = [];
this.serverContext = null;
this.options = options;
this.app = new import_hono.Hono();
this.app.use("*", import_context.run);
}
}
function applyMiddlewares() {
const { middlewares } = this.serverContext;
const preMiddlewares = [];
const defaultMiddlewares = [];
const postMiddlewares = [];
for (const middleware of middlewares) {
switch (middleware.order) {
case "pre":
preMiddlewares.push(middleware);
break;
case "post":
postMiddlewares.push(middleware);
break;
default:
defaultMiddlewares.push(middleware);
}
}
const finalMiddlewares = [];
const insertMiddleware = (middleware) => {
if (middleware.before) {
const targetIndex = finalMiddlewares.findIndex((item) => {
var _middleware_before;
if ((_middleware_before = middleware.before) === null || _middleware_before === void 0 ? void 0 : _middleware_before.includes(item.name)) {
return true;
} else {
return false;
}
});
if (targetIndex !== -1) {
finalMiddlewares.splice(targetIndex, 0, middleware);
} else {
finalMiddlewares.push(middleware);
}
} else {
finalMiddlewares.push(middleware);
}
};
preMiddlewares.forEach(insertMiddleware);
defaultMiddlewares.forEach(insertMiddleware);
postMiddlewares.forEach(insertMiddleware);
for (const middleware of finalMiddlewares) {
const { path = "*", method = "all", handler } = middleware;
const handlers = handler2Handlers(handler);
this.app[method](path, ...handlers);
}
function handler2Handlers(handler) {
if (Array.isArray(handler)) {
return handler;
} else {
return [
handler
];
}
}
}
function createServerBase(options) {
if (options == null) {
throw new Error("can not start server without options");
}
const server2 = new ServerBase(options);
return server2;
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
ServerBase,
createServerBase
});