@crowdin/app-project-module
Version:
Module that generates for you all common endpoints for serving standalone Crowdin App
86 lines (85 loc) • 3.75 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getAboutPageHead = getAboutPageHead;
exports.getAboutPageOptions = getAboutPageOptions;
exports.default = handle;
const axios_1 = __importDefault(require("axios"));
const util_1 = require("../util");
const crowdin_client_1 = require("../middlewares/crowdin-client");
const jsx_renderer_1 = require("../util/jsx-renderer");
function escapeHtml(value) {
return value
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
function getAboutPageHead({ name, storeLink }) {
const escapedName = escapeHtml(name);
const escapedStoreLink = storeLink ? escapeHtml(storeLink) : '';
return `
<head>
<title>${escapedName}</title>
<meta charset="utf-8" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
${escapedStoreLink ? `<link rel="canonical" href="${escapedStoreLink}" />` : ''}
<link rel="stylesheet" href="/assets/css/styles.css" />
</head>
`;
}
function getAboutPageOptions(config) {
return __awaiter(this, void 0, void 0, function* () {
let detailPage = '';
if (!(config === null || config === void 0 ? void 0 : config.detailPage)) {
try {
detailPage = `https://store.crowdin.com/${config.identifier}`;
yield axios_1.default.get(detailPage);
}
catch (e) {
detailPage = '';
}
}
return {
name: config.name,
logo: (0, util_1.getLogoUrl)(config),
manifest: config.baseUrl + '/manifest.json',
storeLink: (config === null || config === void 0 ? void 0 : config.detailPage) || detailPage,
showDebugLink: process.env.SHOW_DEBUG_LINK === 'true',
};
});
}
function handle(config) {
return (req, res, next) => __awaiter(this, void 0, void 0, function* () {
if (config.projectIntegration) {
const jwtToken = (0, crowdin_client_1.getToken)(req);
if (!jwtToken) {
const options = yield getAboutPageOptions(config);
const html = (0, jsx_renderer_1.renderJSXOnClient)({ name: 'about', props: options, head: getAboutPageHead(options) });
res.setHeader('Content-Type', 'text/html; charset=utf-8');
return res.send(html);
}
else {
next();
return;
}
}
const options = yield getAboutPageOptions(config);
const html = (0, jsx_renderer_1.renderJSXOnClient)({ name: 'about', props: options, head: getAboutPageHead(options) });
res.setHeader('Content-Type', 'text/html; charset=utf-8');
return res.send(html);
});
}