site-accueil-insa/matomo/plugins/CoreVue/polyfills/src/index.ts

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;
};