@cotype/core
Version:
<h2 align="center"> <img src="https://cotype.dev/logo.svg" alt="cotype" /> </h2>
251 lines • 10.4 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_join_1 = __importDefault(require("url-join"));
const fs = __importStar(require("fs-extra"));
const log_1 = __importDefault(require("./log"));
exports.log = log_1.default;
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 ContentPersistence_1 = __importDefault(require("./persistence/ContentPersistence"));
exports.ContentPersistence = ContentPersistence_1.default;
const responseTimeLogger_1 = __importDefault(require("./responseTimeLogger"));
const MigrationContext_1 = __importDefault(require("./persistence/MigrationContext"));
exports.MigrationContext = MigrationContext_1.default;
const http_proxy_middleware_1 = require("http-proxy-middleware");
const child_process_1 = require("child_process");
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(/\/admin\//g, `${url_join_1.default(basePath, "/admin")}/`);
}
const startDevServer = () => {
process.stdout.write("Starting development server...\n");
const child = child_process_1.spawn(`npm run watch`, [], {
cwd: path.resolve(__dirname, "../client/"),
shell: true
});
child.stdout.on("data", (data) => {
const string = data.toString();
if (string.includes("Compiled successfully!")) {
process.stdout.write("Development server updated!\n");
}
if (string.includes("Compiling...\n")) {
process.stdout.write("Development server compiling...\n");
}
if (string.includes("Failed to compile.") ||
string.includes("TypeScript error")) {
process.stderr.write(data);
}
});
child.stderr.on("data", data => {
process.stderr.write(data);
});
child.on("exit", data => {
process.stdout.write("Stopping development server!");
process.kill(1);
});
process.on("beforeExit", code => child.kill());
};
exports.clientMiddleware = (basePath = "/") => process.env.DEVCLIENT // Use Proxy to Dev Server
? [
http_proxy_middleware_1.createProxyMiddleware("/static", {
target: `http://localhost:4001`,
logLevel: "error",
changeOrigin: true
}),
http_proxy_middleware_1.createProxyMiddleware(url_join_1.default(basePath, "/admin"), {
target: `http://localhost:4001`,
logLevel: "error",
changeOrigin: true,
pathRewrite: { [`^/${basePath}/`]: "/" }
})
]
: express_promise_router_1.default()
.use(url_join_1.default(basePath, "/admin"), 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(url_join_1.default(basePath, "/admin"), (req, res, next) => {
if ((req.method === "GET" || req.method === "HEAD") &&
req.accepts("html")) {
res.send(getIndexHtml(basePath));
}
else
next();
});
function getModels(opts) {
const externalDataSources = (opts.externalDataSources || []).map(withAuth_1.default);
return {
models: model_1.default(opts.models, externalDataSources),
externalDataSources
};
}
const getBaseURLS = (basePath) => {
if (!basePath) {
return {
cms: "/",
media: url_join_1.default("/", "/media"),
preview: "/"
};
}
if (typeof basePath === "string") {
return {
cms: basePath,
media: url_join_1.default(basePath, "/media"),
preview: basePath
};
}
return {
cms: basePath.cms,
media: basePath.media ? basePath.media : url_join_1.default(basePath.cms, "/media"),
preview: basePath.preview || basePath.cms
};
};
async function getRestApiBuilder(opts) {
const { basePath } = opts;
const { models } = getModels(opts);
return content_1.getRestApiBuilder(models, getBaseURLS(basePath).cms);
}
exports.getRestApiBuilder = getRestApiBuilder;
async function init(opts) {
const { models, externalDataSources } = getModels(opts);
const { basePath, storage, thumbnailProvider, responseHeaders, contentHooks, migrationDir } = opts;
const baseURLS = getBaseURLS(basePath);
const mediaUrl = baseURLS.media;
const persistence = await persistence_1.default(models, await opts.persistenceAdapter, {
basePath: baseURLS.cms,
mediaUrl,
contentHooks,
migrationDir
});
const auth = auth_1.default(persistence, opts.anonymousPermissions, models);
const content = content_1.default({
persistence,
models,
externalDataSources,
basePath: baseURLS.cms,
mediaUrl,
responseHeaders
});
const settings = settings_1.default(persistence, models);
const media = media_1.default(persistence, models, storage, thumbnailProvider, baseURLS.cms);
const app = express_1.default();
app.use(express_1.default.json({ limit: "1mb" }));
app.use(session_1.default(opts.sessionOpts));
if (process.env.PERFORMANCE_LOGGING === "true") {
app.use(responseTimeLogger_1.default);
}
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(baseURLS.cms.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: baseURLS,
user: req.principal
});
});
// This routes purpose is to provide all content options
// for the MapInput inside the built-in roles models
router.get("/admin/rest/info/content", (req, res) => {
const filteredModels = filterModels_1.default(models, req.principal);
res.json(filteredModels.content.map(m => ({ value: m.name, label: m.singular })));
});
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_join_1.default(baseURLS.cms, "admin/rest/docs/"), url_join_1.default(baseURLS.cms, "admin/rest/swagger.json")));
router.get("/admin/rest", (req, res) => res.redirect(url_join_1.default(baseURLS.cms, "admin/rest/docs")));
content.routes(router);
if (process.env.DEVCLIENT) {
startDevServer();
}
app.use((opts.clientMiddleware && opts.clientMiddleware(baseURLS.cms)) ||
exports.clientMiddleware(baseURLS.cms));
if (opts.customSetup) {
opts.customSetup(app, persistence.content, persistence.settings);
}
app.get(baseURLS.cms, (_, res) => res.redirect(url_join_1.default(baseURLS.cms, "admin")));
app.use((err, req, res, _) => {
if (err instanceof HttpError_1.default) {
res.status(err.status);
}
else {
log_1.default.error(req.method, req.path, err);
res.status(500);
}
res.end(err.message);
return;
});
return { app, persistence };
}
exports.init = init;
//# sourceMappingURL=index.js.map