UNPKG

7.65 kBJavaScriptView Raw
1"use strict";
2/// <reference path="../typings/untyped-modules.d.ts"/>
3/// <reference path="../typings/request.d.ts"/>
4function __export(m) {
5 for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
6}
7var __importDefault = (this && this.__importDefault) || function (mod) {
8 return (mod && mod.__esModule) ? mod : { "default": mod };
9};
10var __importStar = (this && this.__importStar) || function (mod) {
11 if (mod && mod.__esModule) return mod;
12 var result = {};
13 if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
14 result["default"] = mod;
15 return result;
16};
17Object.defineProperty(exports, "__esModule", { value: true });
18const express_1 = __importDefault(require("express"));
19const express_promise_router_1 = __importDefault(require("express-promise-router"));
20const path = __importStar(require("path"));
21const url_1 = require("url");
22const fs = __importStar(require("fs-extra"));
23const log_1 = __importDefault(require("./log"));
24exports.log = log_1.default;
25const session_1 = __importDefault(require("./session"));
26const model_1 = __importDefault(require("./model"));
27const filterModels_1 = __importStar(require("./model/filterModels"));
28const navigationBuilder_1 = require("./model/navigationBuilder");
29const persistence_1 = __importDefault(require("./persistence"));
30const icons_1 = __importDefault(require("./icons"));
31const auth_1 = __importDefault(require("./auth"));
32const withAuth_1 = __importDefault(require("./auth/withAuth"));
33const content_1 = __importStar(require("./content"));
34const settings_1 = __importDefault(require("./settings"));
35const media_1 = __importDefault(require("./media"));
36const apiBuilder_1 = __importDefault(require("./api/apiBuilder"));
37const swaggerUi_1 = __importDefault(require("./api/swaggerUi"));
38const HttpError_1 = __importDefault(require("./HttpError"));
39const externalDataSourceHelper_1 = require("./externalDataSourceHelper");
40const ContentPersistence_1 = __importDefault(require("./persistence/ContentPersistence"));
41exports.ContentPersistence = ContentPersistence_1.default;
42var persistence_2 = require("./persistence");
43exports.Persistence = persistence_2.Persistence;
44var knex_1 = require("./persistence/adapter/knex");
45exports.knexAdapter = knex_1.default;
46var FsStorage_1 = require("./media/storage/FsStorage");
47exports.FsStorage = FsStorage_1.default;
48__export(require("./utils"));
49const root = path.resolve(__dirname, "../dist/client");
50let index;
51function getIndexHtml(basePath) {
52 if (!index)
53 index = fs.readFileSync(path.join(root, "index.html"), "utf8");
54 return index.replace(/"src\./g, `"${basePath}/static/src.`);
55}
56exports.clientMiddleware = express_promise_router_1.default()
57 .use("/static", express_1.default.static(root, {
58 maxAge: "1y",
59 immutable: true,
60 index: false // index.html will be served by the fallback middleware
61}), (_, res, next) => {
62 res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
63 next();
64})
65 .use((req, res, next) => {
66 if ((req.method === "GET" || req.method === "HEAD") &&
67 req.accepts("html")) {
68 const basePath = req.originalUrl.replace(/^(.*\/admin).*/, "$1");
69 res.send(getIndexHtml(basePath));
70 }
71 else
72 next();
73});
74function addSlash(str) {
75 return `${str.replace(/\/$/, "")}/`;
76}
77function getUrls(opts) {
78 const basePath = (opts.basePath || "").replace(new RegExp(path.posix.sep, "g"), "/");
79 const baseUrls = {
80 cms: basePath,
81 ...(opts.baseUrls || {})
82 };
83 return {
84 basePath: addSlash(basePath),
85 baseUrls: {
86 ...baseUrls,
87 cms: addSlash(baseUrls.cms)
88 }
89 };
90}
91function getModels(opts, baseUrls) {
92 const externalDataSources = externalDataSourceHelper_1.provide(opts.externalDataSources, { baseUrls }).map(withAuth_1.default);
93 return {
94 models: model_1.default(opts.models, externalDataSources),
95 externalDataSources
96 };
97}
98async function getRestApiBuilder(opts) {
99 const { baseUrls } = getUrls(opts);
100 const { models } = getModels(opts, baseUrls);
101 return content_1.getRestApiBuilder(models, baseUrls);
102}
103exports.getRestApiBuilder = getRestApiBuilder;
104async function init(opts) {
105 const { baseUrls, basePath } = getUrls(opts);
106 const { models, externalDataSources } = getModels(opts, baseUrls);
107 const p = await persistence_1.default(models, await opts.persistenceAdapter, {
108 baseUrls,
109 contentHooks: opts.contentHooks
110 });
111 const auth = auth_1.default(p, opts.anonymousPermissions);
112 const content = content_1.default(p, models, externalDataSources, baseUrls);
113 const settings = settings_1.default(p, models);
114 const media = media_1.default(p, models, opts.storage, opts.thumbnailProvider);
115 const app = express_1.default();
116 app.use(express_1.default.json({ limit: "1mb" }));
117 app.use(session_1.default(opts.sessionOpts));
118 app.all("/status", (req, res) => {
119 res.json({
120 uptime: process.uptime(),
121 nodeVersion: process.version,
122 memory: process.memoryUsage(),
123 pid: process.pid
124 });
125 });
126 const router = express_promise_router_1.default();
127 app.use(basePath.replace(/\/$/, ""), router);
128 auth.routes(router); // login, principal, logout
129 media.routes(router); // static, thumbs
130 settings.routes(router); // admin/rest/settings
131 icons_1.default.routes(router); // icons
132 router.get("/admin/rest/info", async (req, res) => {
133 if (!req.principal || !req.principal.id)
134 return res.json({});
135 const filteredModels = filterModels_1.default(models, req.principal);
136 const filter = filterModels_1.createModelFilter(req.principal);
137 const filteredInfo = navigationBuilder_1.buildInfo(opts.navigation || [], models, filter);
138 res.json({
139 ...filteredInfo,
140 models: filteredModels,
141 baseUrls,
142 user: req.principal
143 });
144 });
145 router.get("/admin/rest/info/content", (req, res) => {
146 const filteredModels = filterModels_1.default(models, req.principal);
147 res.json(filteredModels.content.map(m => m.name));
148 });
149 router.get("/admin/rest/info/settings", (req, res) => {
150 const filteredModels = filterModels_1.default(models, req.principal);
151 res.json(filteredModels.settings.map(m => m.name));
152 });
153 auth.describe(apiBuilder_1.default);
154 media.describe(apiBuilder_1.default);
155 content.describe(apiBuilder_1.default);
156 settings.describe(apiBuilder_1.default);
157 router.get("/admin/rest/swagger.json", (req, res) => {
158 res.json(apiBuilder_1.default.getSpec());
159 });
160 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")));
161 router.get("/admin/rest", (req, res) => res.redirect(url_1.resolve(baseUrls.cms, "admin/rest/docs")));
162 content.routes(router);
163 router.use("/admin", opts.clientMiddleware || exports.clientMiddleware);
164 if (opts.customSetup) {
165 opts.customSetup(app, p.content);
166 }
167 app.get(basePath, (_, res) => res.redirect(url_1.resolve(baseUrls.cms, "admin")));
168 app.use((err, req, res, _) => {
169 if (err instanceof HttpError_1.default) {
170 res.status(err.status);
171 }
172 else {
173 log_1.default.error(req.method, req.path, err);
174 res.status(500);
175 }
176 res.end(err.message);
177 return;
178 });
179 return { app, persistence: p };
180}
181exports.init = init;
182//# sourceMappingURL=index.js.map
\No newline at end of file