a71f801c3f
- Prisma schema: User, Session, RepoConfig, Preview, Job, WebhookToken, NoConfigComment, AdminSettings - Backend: auth (login/logout/me/first-user setup), webhook handler with HMAC verification, EC2 service, SSH service, deploy pipeline, job queue worker, cron workers - Frontend: Login with first-user detection, Dashboard, PreviewDetail with live log streaming, Settings, Repos config, Admin panel, SetupWizard, Privacy page - Docker Compose and Dockerfile for self-hosted deployment - Uses bcryptjs for Node 24 compatibility Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
120 lines
6.5 KiB
JavaScript
120 lines
6.5 KiB
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 index_exports = {};
|
|
__export(index_exports, {
|
|
server: () => server
|
|
});
|
|
module.exports = __toCommonJS(index_exports);
|
|
var import_env = require("./lib/env");
|
|
var import_rjweb_server = require("rjweb-server");
|
|
var import_runtime_node = require("@rjweb/runtime-node");
|
|
var import_node_fs = require("node:fs");
|
|
var import_path = require("path");
|
|
var import_db = require("./lib/db");
|
|
var import_logger = require("./lib/logger");
|
|
var import_cors = require("./lib/middlewares/cors");
|
|
var import_main = require("./lib/middlewares/main");
|
|
var import_auth = require("./lib/middlewares/auth");
|
|
var import_response = require("./lib/response");
|
|
var import_errors = require("./lib/errors");
|
|
var import_jobWorker = require("./workers/jobWorker");
|
|
var import_cronWorker = require("./workers/cronWorker");
|
|
var import_adminSettings = require("./lib/adminSettings");
|
|
var import_auth2 = require("./routes/auth");
|
|
var import_webhook = require("./routes/webhook");
|
|
var import_user = require("./routes/api/user");
|
|
var import_repos = require("./routes/api/repos");
|
|
var import_previews = require("./routes/api/previews");
|
|
var import_admin = require("./routes/api/admin");
|
|
const uiBuildPath = (0, import_path.join)(__dirname, "../../frontend/dist");
|
|
const uiIndexPath = (0, import_path.join)(uiBuildPath, "index.html");
|
|
const hasUiBuild = (0, import_node_fs.existsSync)(uiBuildPath);
|
|
const server = new import_rjweb_server.Server(
|
|
import_runtime_node.Runtime,
|
|
{
|
|
port: import_env.env.PORT,
|
|
bind: "0.0.0.0",
|
|
version: false,
|
|
performance: { lastModified: false, eTag: false },
|
|
logging: { warn: true, debug: false, error: true }
|
|
},
|
|
[
|
|
import_cors.corsMiddleware.use({}),
|
|
import_main.mainMiddleware.use({}),
|
|
import_auth.authResolutionMiddleware.use({}),
|
|
import_auth.authEnforcementMiddleware.use({})
|
|
]
|
|
);
|
|
server.path(
|
|
"/api/auth",
|
|
(path) => path.http("POST", "/login", (http) => http.onRequest(import_auth2.loginHandler)).http("POST", "/logout", (http) => http.onRequest(import_auth2.logoutHandler)).http("GET", "/me", (http) => http.onRequest(import_auth2.meHandler)).http("GET", "/setup-status", (http) => http.onRequest(import_auth2.setupStatusHandler)).http("POST", "/first-user", (http) => http.onRequest(import_auth2.firstUserHandler))
|
|
);
|
|
server.path(
|
|
"/webhook",
|
|
(path) => path.http("POST", "/:userId", (http) => http.onRequest(import_webhook.webhookHandler))
|
|
);
|
|
server.path(
|
|
"/api/user",
|
|
(path) => path.http("GET", "/settings", (http) => http.onRequest(import_user.getUserSettings)).http("PATCH", "/username", (http) => http.onRequest(import_user.updateUsername)).http("PATCH", "/password", (http) => http.onRequest(import_user.updatePassword)).http("PUT", "/gitea", (http) => http.onRequest(import_user.updateGitea)).http("PUT", "/aws", (http) => http.onRequest(import_user.updateAws)).http("GET", "/webhook-secret", (http) => http.onRequest(import_user.getWebhookSecret)).http("POST", "/webhook-secret/regenerate", (http) => http.onRequest(import_user.regenerateWebhookSecret))
|
|
);
|
|
server.path(
|
|
"/api/repos",
|
|
(path) => path.http("GET", "/", (http) => http.onRequest(import_repos.listRepos)).http("POST", "/config", (http) => http.onRequest(import_repos.saveRepoConfig)).http("POST", "/toggle", (http) => http.onRequest(import_repos.toggleRepoEnabled)).http("GET", "/:owner/:repo/config", (http) => http.onRequest(import_repos.getRepoConfig))
|
|
);
|
|
server.path(
|
|
"/api/previews",
|
|
(path) => path.http("GET", "/", (http) => http.onRequest(import_previews.listPreviews)).http("GET", "/:id", (http) => http.onRequest(import_previews.getPreview)).http("POST", "/:id/stop", (http) => http.onRequest(import_previews.stopPreviewRoute)).ws(
|
|
"/:id/logs",
|
|
(ws) => ws.onOpen(import_previews.previewLogsWs).onMessage(async () => {
|
|
}).onClose(async () => {
|
|
})
|
|
)
|
|
);
|
|
server.path(
|
|
"/api/admin",
|
|
(path) => path.http("GET", "/users", (http) => http.onRequest(import_admin.listUsers)).http("POST", "/users", (http) => http.onRequest(import_admin.createUser)).http("PATCH", "/users/:id", (http) => http.onRequest(import_admin.updateUser)).http("DELETE", "/users/:id", (http) => http.onRequest(import_admin.deleteUser)).http("GET", "/settings", (http) => http.onRequest(import_admin.getSettings)).http("PUT", "/settings", (http) => http.onRequest(import_admin.updateSettings)).http("GET", "/previews", (http) => http.onRequest(import_admin.adminListPreviews)).http("POST", "/previews/:id/stop", (http) => http.onRequest(import_admin.adminStopPreview))
|
|
);
|
|
if (hasUiBuild) {
|
|
server.path("/", (path) => path.static(uiBuildPath));
|
|
}
|
|
server.notFound(async (ctr) => {
|
|
const STATIC_EXT = /\.(js|mjs|css|png|jpg|jpeg|gif|svg|ico|woff2?|ttf|eot|map|json|txt|xml|webp|avif)(\?.*)?$/i;
|
|
if (!ctr.url.path.startsWith("/api") && !STATIC_EXT.test(ctr.url.path) && (0, import_node_fs.existsSync)(uiIndexPath)) {
|
|
return ctr.status(200).printFile(uiIndexPath, { addTypes: true });
|
|
}
|
|
return (0, import_response.makeResponse)({ ctr, content: { code: import_errors.ERROR_MESSAGES.NOT_FOUND.code, message: import_errors.ERROR_MESSAGES.NOT_FOUND.message } });
|
|
});
|
|
server.error("httpRequest", async (ctr, error) => {
|
|
import_logger.logger.error(error, "Unhandled HTTP request error");
|
|
return (0, import_response.makeResponse)({ ctr, content: { code: import_errors.ERROR_MESSAGES.INTERNAL_SERVER_ERROR.code } });
|
|
});
|
|
server.start().then(async (port) => {
|
|
await import_db.prisma.$connect();
|
|
import_logger.logger.info({ port }, "PP backend running");
|
|
await (0, import_adminSettings.getAdminSettings)();
|
|
(0, import_jobWorker.startJobWorker)();
|
|
(0, import_cronWorker.startCronWorkers)();
|
|
import_logger.logger.info("All workers started");
|
|
}).catch((err) => import_logger.logger.error(err, "Server failed to start"));
|
|
// Annotate the CommonJS export names for ESM import in node:
|
|
0 && (module.exports = {
|
|
server
|
|
});
|
|
//# sourceMappingURL=index.js.map
|