forked from rebillar/site-accueil-insa
66 lines
2 KiB
TypeScript
66 lines
2 KiB
TypeScript
/*!
|
|
* Matomo - free/libre analytics platform
|
|
*
|
|
* @link https://matomo.org
|
|
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
|
*/
|
|
|
|
/* eslint-disable */
|
|
|
|
// this is a dummy file used to compile core-js polyfills so we don't have to include them in any
|
|
// other file.
|
|
|
|
import DOMPurify from 'dompurify';
|
|
import * as tslib from 'tslib';
|
|
import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only';
|
|
|
|
window.tslib = tslib;
|
|
|
|
// fromEntries does not have a polyfill in @vue/cli-plugin-babel/preset
|
|
Object.fromEntries = function fromEntries(it) {
|
|
return [...it].reduce((result, [key, value]) => {
|
|
result[key] = value;
|
|
return result;
|
|
}, {});
|
|
};
|
|
|
|
import './jqueryNativeEventTrigger';
|
|
|
|
function htmlDecode(value: string) {
|
|
const textArea = document.createElement('textarea');
|
|
textArea.innerHTML = value;
|
|
return textArea.value;
|
|
}
|
|
|
|
const invisibleCharEncoded = htmlDecode('⁣');
|
|
|
|
// modify Vue's escaping functionality to also escape angularjs {{ fields.
|
|
// vue doesn't do this since it doesn't have this problem;
|
|
const oldToDisplayString = window.Vue.toDisplayString;
|
|
window.Vue.toDisplayString = function matomoToDisplayString(val: unknown): string {
|
|
let result = oldToDisplayString.call(this, val);
|
|
result = result.replace(/{{/g, `{${invisibleCharEncoded}{`);
|
|
return result;
|
|
};
|
|
|
|
function hasSafeRel(rel: string) {
|
|
const parts = rel.split(/\s+/);
|
|
return parts.includes('noopener') && parts.includes('noreferrer');
|
|
}
|
|
|
|
// remove target=_blank if a link doesn't have noopener noreferrer
|
|
DOMPurify.addHook('afterSanitizeAttributes', (node: Element) => {
|
|
if (node.hasAttribute('target')
|
|
&& node.getAttribute('target') === '_blank'
|
|
&& (!node.hasAttribute('rel')
|
|
|| !hasSafeRel(node.getAttribute('rel')))
|
|
) {
|
|
node.removeAttribute('target');
|
|
}
|
|
});
|
|
|
|
window.vueSanitize = function vueSanitize(val: unknown): string {
|
|
let result = DOMPurify.sanitize(val, { ADD_ATTR: ['target'] });
|
|
result = result.replace(/{{/g, '{⁣{');
|
|
return result;
|
|
};
|