1 | "use strict";
|
2 |
|
3 |
|
4 | function __export(m) {
|
5 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
6 | }
|
7 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
8 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
9 | };
|
10 | var __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 | };
|
17 | Object.defineProperty(exports, "__esModule", { value: true });
|
18 | const express_1 = __importDefault(require("express"));
|
19 | const express_promise_router_1 = __importDefault(require("express-promise-router"));
|
20 | const path = __importStar(require("path"));
|
21 | const url_1 = require("url");
|
22 | const fs = __importStar(require("fs-extra"));
|
23 | const log_1 = __importDefault(require("./log"));
|
24 | exports.log = log_1.default;
|
25 | const session_1 = __importDefault(require("./session"));
|
26 | const model_1 = __importDefault(require("./model"));
|
27 | const filterModels_1 = __importStar(require("./model/filterModels"));
|
28 | const navigationBuilder_1 = require("./model/navigationBuilder");
|
29 | const persistence_1 = __importDefault(require("./persistence"));
|
30 | const icons_1 = __importDefault(require("./icons"));
|
31 | const auth_1 = __importDefault(require("./auth"));
|
32 | const withAuth_1 = __importDefault(require("./auth/withAuth"));
|
33 | const content_1 = __importStar(require("./content"));
|
34 | const settings_1 = __importDefault(require("./settings"));
|
35 | const media_1 = __importDefault(require("./media"));
|
36 | const apiBuilder_1 = __importDefault(require("./api/apiBuilder"));
|
37 | const swaggerUi_1 = __importDefault(require("./api/swaggerUi"));
|
38 | const HttpError_1 = __importDefault(require("./HttpError"));
|
39 | const externalDataSourceHelper_1 = require("./externalDataSourceHelper");
|
40 | const ContentPersistence_1 = __importDefault(require("./persistence/ContentPersistence"));
|
41 | exports.ContentPersistence = ContentPersistence_1.default;
|
42 | var persistence_2 = require("./persistence");
|
43 | exports.Persistence = persistence_2.Persistence;
|
44 | var knex_1 = require("./persistence/adapter/knex");
|
45 | exports.knexAdapter = knex_1.default;
|
46 | var FsStorage_1 = require("./media/storage/FsStorage");
|
47 | exports.FsStorage = FsStorage_1.default;
|
48 | __export(require("./utils"));
|
49 | const root = path.resolve(__dirname, "../dist/client");
|
50 | let index;
|
51 | function 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 | }
|
56 | exports.clientMiddleware = express_promise_router_1.default()
|
57 | .use("/static", express_1.default.static(root, {
|
58 | maxAge: "1y",
|
59 | immutable: true,
|
60 | index: false
|
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 | });
|
74 | function addSlash(str) {
|
75 | return `${str.replace(/\/$/, "")}/`;
|
76 | }
|
77 | function 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 | }
|
91 | function 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 | }
|
98 | async function getRestApiBuilder(opts) {
|
99 | const { baseUrls } = getUrls(opts);
|
100 | const { models } = getModels(opts, baseUrls);
|
101 | return content_1.getRestApiBuilder(models, baseUrls);
|
102 | }
|
103 | exports.getRestApiBuilder = getRestApiBuilder;
|
104 | async 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);
|
129 | media.routes(router);
|
130 | settings.routes(router);
|
131 | icons_1.default.routes(router);
|
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 | }
|
181 | exports.init = init;
|
182 |
|
\ | No newline at end of file |