@cotype/core
Version:
<h2 align="center"> <img src="https://cotype.dev/logo.svg" alt="cotype" /> </h2>
180 lines • 7.55 kB
JavaScript
"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