UNPKG

@cotype/core

Version:

<h2 align="center"> <img src="https://cotype.dev/logo.svg" alt="cotype" /> </h2>

180 lines • 7.55 kB
"use strict"; /// <reference path="../typings/untyped-modules.d.ts"/> /// <reference path="../typings/request.d.ts"/> function __export(m) { for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const express_1 = __importDefault(require("express")); const express_promise_router_1 = __importDefault(require("express-promise-router")); const path = __importStar(require("path")); const url_1 = require("url"); const fs = __importStar(require("fs-extra")); const session_1 = __importDefault(require("./session")); const model_1 = __importDefault(require("./model")); const filterModels_1 = __importStar(require("./model/filterModels")); const navigationBuilder_1 = require("./model/navigationBuilder"); const persistence_1 = __importDefault(require("./persistence")); const icons_1 = __importDefault(require("./icons")); const auth_1 = __importDefault(require("./auth")); const withAuth_1 = __importDefault(require("./auth/withAuth")); const content_1 = __importStar(require("./content")); const settings_1 = __importDefault(require("./settings")); const media_1 = __importDefault(require("./media")); const apiBuilder_1 = __importDefault(require("./api/apiBuilder")); const swaggerUi_1 = __importDefault(require("./api/swaggerUi")); const HttpError_1 = __importDefault(require("./HttpError")); const externalDataSourceHelper_1 = require("./externalDataSourceHelper"); const ContentPersistence_1 = __importDefault(require("./persistence/ContentPersistence")); exports.ContentPersistence = ContentPersistence_1.default; var persistence_2 = require("./persistence"); exports.Persistence = persistence_2.Persistence; var knex_1 = require("./persistence/adapter/knex"); exports.knexAdapter = knex_1.default; var FsStorage_1 = require("./media/storage/FsStorage"); exports.FsStorage = FsStorage_1.default; __export(require("./utils")); const root = path.resolve(__dirname, "../dist/client"); let index; function getIndexHtml(basePath) { if (!index) index = fs.readFileSync(path.join(root, "index.html"), "utf8"); return index.replace(/"src\./g, `"${basePath}/static/src.`); } exports.clientMiddleware = express_promise_router_1.default() .use("/static", express_1.default.static(root, { maxAge: "1y", immutable: true, index: false // index.html will be served by the fallback middleware }), (_, res, next) => { res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); next(); }) .use((req, res, next) => { if ((req.method === "GET" || req.method === "HEAD") && req.accepts("html")) { const basePath = req.originalUrl.replace(/^(.*\/admin).*/, "$1"); res.send(getIndexHtml(basePath)); } else next(); }); function addSlash(str) { return `${str.replace(/\/$/, "")}/`; } function getUrls(opts) { const basePath = (opts.basePath || "").replace(new RegExp(path.posix.sep, "g"), "/"); const baseUrls = { cms: basePath, ...(opts.baseUrls || {}) }; return { basePath: addSlash(basePath), baseUrls: { ...baseUrls, cms: addSlash(baseUrls.cms) } }; } function getModels(opts, baseUrls) { const externalDataSources = externalDataSourceHelper_1.provide(opts.externalDataSources, { baseUrls }).map(withAuth_1.default); return { models: model_1.default(opts.models, externalDataSources), externalDataSources }; } async function getRestApiBuilder(opts) { const { baseUrls } = getUrls(opts); const { models } = getModels(opts, baseUrls); return content_1.getRestApiBuilder(models, baseUrls); } exports.getRestApiBuilder = getRestApiBuilder; async function init(opts) { const { baseUrls, basePath } = getUrls(opts); const { models, externalDataSources } = getModels(opts, baseUrls); const p = await persistence_1.default(models, await opts.persistenceAdapter, { baseUrls, contentHooks: opts.contentHooks }); const auth = auth_1.default(p, opts.anonymousPermissions); const content = content_1.default(p, models, externalDataSources, baseUrls); const settings = settings_1.default(p, models); const media = media_1.default(p, models, opts.storage, opts.thumbnailProvider); const app = express_1.default(); app.use(express_1.default.json()); app.use(session_1.default(opts.sessionOpts)); app.all("/status", (req, res) => { res.json({ uptime: process.uptime(), nodeVersion: process.version, memory: process.memoryUsage(), pid: process.pid }); }); const router = express_promise_router_1.default(); app.use(basePath.replace(/\/$/, ""), router); auth.routes(router); // login, principal, logout media.routes(router); // static, thumbs settings.routes(router); // admin/rest/settings icons_1.default.routes(router); // icons router.get("/admin/rest/info", async (req, res) => { if (!req.principal || !req.principal.id) return res.json({}); const filteredModels = filterModels_1.default(models, req.principal); const filter = filterModels_1.createModelFilter(req.principal); const filteredInfo = navigationBuilder_1.buildInfo(opts.navigation || [], models, filter); res.json({ ...filteredInfo, models: filteredModels, baseUrls, user: req.principal }); }); router.get("/admin/rest/info/content", (req, res) => { const filteredModels = filterModels_1.default(models, req.principal); res.json(filteredModels.content.map(m => m.name)); }); router.get("/admin/rest/info/settings", (req, res) => { const filteredModels = filterModels_1.default(models, req.principal); res.json(filteredModels.settings.map(m => m.name)); }); auth.describe(apiBuilder_1.default); media.describe(apiBuilder_1.default); content.describe(apiBuilder_1.default); settings.describe(apiBuilder_1.default); router.get("/admin/rest/swagger.json", (req, res) => { res.json(apiBuilder_1.default.getSpec()); }); router.use("/admin/rest/docs", swaggerUi_1.default(url_1.resolve(baseUrls.cms, "admin/rest/docs/"), url_1.resolve(baseUrls.cms, "admin/rest/swagger.json"))); router.get("/admin/rest", (req, res) => res.redirect(url_1.resolve(baseUrls.cms, "admin/rest/docs"))); content.routes(router); router.use("/admin", opts.clientMiddleware || exports.clientMiddleware); if (opts.customSetup) { opts.customSetup(app, p.content); } app.get(basePath, (_, res) => res.redirect(url_1.resolve(baseUrls.cms, "admin"))); app.use((err, req, res, _) => { if (err instanceof HttpError_1.default) { res.status(err.status); } else { console.error(req.method, req.path, err); res.status(500); } res.end(err.message); return; }); return { app, persistence: p }; } exports.init = init; //# sourceMappingURL=index.js.map