{"version":3,"file":"yett.min.modern.js","sources":["../src/variables.js","../src/checks.js","../src/observer.js","../src/monkey.js","../src/unblock.js"],"sourcesContent":["export const TYPE_ATTRIBUTE = 'javascript/blocked'\nexport const CONSENT_VALUE = 'block'\n\nexport const patterns = {\n blacklist: window.YETT_BLACKLIST,\n whitelist: window.YETT_WHITELIST\n}\n\n// ipsis\nexport const settings = {\n checkAllScripts: window.YETT_CHECKALLSCRIPTS\n}\n\n// Backup list containing the original blacklisted script elements\nexport const backupScripts = {\n blacklisted: []\n}","import { patterns, TYPE_ATTRIBUTE, CONSENT_VALUE, settings } from './variables'\n\nexport const isOnBlacklist = function (src, type, dataConsent) {\n if (settings.checkAllScripts) {\n return (src &&\n (!type || type !== TYPE_ATTRIBUTE) &&\n (\n (!patterns.blacklist || patterns.blacklist.some(pattern => pattern.test(src))) &&\n (!patterns.whitelist || patterns.whitelist.every(pattern => !pattern.test(src)))\n )) || (\n dataConsent === CONSENT_VALUE\n )\n } else{\n return dataConsent === CONSENT_VALUE\n }\n}\n\nexport const willBeUnblocked = function (script) {\n const src = script.getAttribute('src')\n return (\n patterns.blacklist && patterns.blacklist.every(entry => !entry.test(src)) ||\n patterns.whitelist && patterns.whitelist.some(entry => entry.test(src))\n )\n}","import { backupScripts, TYPE_ATTRIBUTE } from './variables'\nimport { isOnBlacklist } from './checks'\n\n// Setup a mutation observer to track DOM insertion\nexport const observer = new MutationObserver(mutations => {\n for (let i = 0; i < mutations.length; i++) {\n const { addedNodes } = mutations[i];\n for(let i = 0; i < addedNodes.length; i++) {\n const node = addedNodes[i]\n // For each added script tag\n if(node.nodeType === 1 && node.tagName === 'SCRIPT') {\n const src = node.src\n const type = node.type\n const dataConsent = node.dataset.consent\n // If the src is inside the blacklist and is not inside the whitelist\n if(isOnBlacklist(src, type, dataConsent)) {\n // We backup the node\n backupScripts.blacklisted.push([node, node.type])\n\n // Blocks inline script execution in Safari & Chrome\n node.type = TYPE_ATTRIBUTE\n\n // Firefox has this additional event which prevents scripts from beeing executed\n const beforeScriptExecuteListener = function (event) {\n // Prevent only marked scripts from executing\n if(node.getAttribute('type') === TYPE_ATTRIBUTE)\n event.preventDefault()\n node.removeEventListener('beforescriptexecute', beforeScriptExecuteListener)\n }\n node.addEventListener('beforescriptexecute', beforeScriptExecuteListener)\n\n // Remove the node from the DOM\n node.parentElement && node.parentElement.removeChild(node)\n }\n }\n }\n }\n})\n\n// Starts the monitoring\nobserver.observe(document.documentElement, {\n childList: true,\n subtree: true\n})","import { TYPE_ATTRIBUTE } from './variables'\nimport { isOnBlacklist } from './checks'\n\nconst createElementBackup = document.createElement\n\nconst originalDescriptors = {\n src: Object.getOwnPropertyDescriptor(HTMLScriptElement.prototype, 'src'),\n type: Object.getOwnPropertyDescriptor(HTMLScriptElement.prototype, 'type')\n}\n\n// Monkey patch the createElement method to prevent dynamic scripts from executing\ndocument.createElement = function(...args) {\n // If this is not a script tag, bypass\n if(args[0].toLowerCase() !== 'script')\n return createElementBackup.bind(document)(...args)\n\n const scriptElt = createElementBackup.bind(document)(...args)\n\n // Define getters / setters to ensure that the script type is properly set\n try {\n Object.defineProperties(scriptElt, {\n 'src': {\n ...originalDescriptors.src,\n set(value) {\n if(isOnBlacklist(value, scriptElt.type)) {\n originalDescriptors.type.set.call(this, TYPE_ATTRIBUTE)\n }\n originalDescriptors.src.set.call(this, value)\n }\n },\n 'type': {\n ...originalDescriptors.type,\n get() {\n const typeValue = originalDescriptors.type.get.call(this);\n if(typeValue === TYPE_ATTRIBUTE || isOnBlacklist(this.src, typeValue)) {\n // Prevent script execution.\n return null\n }\n return typeValue\n },\n set(value) {\n const typeValue = isOnBlacklist(scriptElt.src, scriptElt.type) ? TYPE_ATTRIBUTE : value\n originalDescriptors.type.set.call(this, typeValue)\n }\n }\n })\n\n // Monkey patch the setAttribute function so that the setter is called instead\n scriptElt.setAttribute = function(name, value) {\n if(name === 'type' || name === 'src')\n scriptElt[name] = value\n else\n HTMLScriptElement.prototype.setAttribute.call(scriptElt, name, value)\n }\n } catch (error) {\n // eslint-disable-next-line\n console.warn(\n 'Yett: unable to prevent script execution for script src ', scriptElt.src, '.\\n',\n 'A likely cause would be because you are using a third-party browser extension that monkey patches the \"document.createElement\" function.'\n )\n }\n return scriptElt\n}","import {\n patterns,\n backupScripts,\n TYPE_ATTRIBUTE\n} from './variables'\n\nimport {\n willBeUnblocked\n} from './checks'\n\nimport {\n observer\n} from './observer'\n\nconst URL_REPLACER_REGEXP = new RegExp('[|\\\\{}()[\\\\]^$+*?.]', 'g')\n\n// Unblocks all (or a selection of) blacklisted scripts.\nexport const unblock = function (...scriptUrlsOrRegexes) {\n if (scriptUrlsOrRegexes.length < 1) {\n patterns.blacklist = []\n patterns.whitelist = []\n } else {\n if (patterns.blacklist) {\n patterns.blacklist = patterns.blacklist.filter(pattern => (\n scriptUrlsOrRegexes.every(urlOrRegexp => {\n if (typeof urlOrRegexp === 'string')\n return !pattern.test(urlOrRegexp)\n else if (urlOrRegexp instanceof RegExp)\n return pattern.toString() !== urlOrRegexp.toString()\n })\n ))\n }\n if (patterns.whitelist) {\n patterns.whitelist = [\n ...patterns.whitelist,\n ...scriptUrlsOrRegexes\n .map(urlOrRegexp => {\n if (typeof urlOrRegexp === 'string') {\n const escapedUrl = urlOrRegexp.replace(URL_REPLACER_REGEXP, '\\\\$&')\n const permissiveRegexp = '.*' + escapedUrl + '.*'\n if (patterns.whitelist.every(p => p.toString() !== permissiveRegexp.toString())) {\n return new RegExp(permissiveRegexp)\n }\n } else if (urlOrRegexp instanceof RegExp) {\n if (patterns.whitelist.every(p => p.toString() !== urlOrRegexp.toString())) {\n return urlOrRegexp\n }\n }\n return null\n })\n .filter(Boolean)\n ]\n }\n }\n\n\n // Parse existing script tags with a marked type\n const tags = document.querySelectorAll(`script[type=\"${TYPE_ATTRIBUTE}\"]`)\n for (let i = 0; i < tags.length; i++) {\n const script = tags[i]\n if (willBeUnblocked(script)) {\n backupScripts.blacklisted.push([script, 'application/javascript'])\n script.parentElement.removeChild(script)\n }\n }\n\n // Exclude 'whitelisted' scripts from the blacklist and append them to \n let indexOffset = 0;\n [...backupScripts.blacklisted].forEach(([script, type], index) => {\n if (willBeUnblocked(script)) {\n const scriptNode = document.createElement('script')\n for (let i = 0; i < script.attributes.length; i++) {\n let attribute = script.attributes[i]\n if (attribute.name !== 'src' && attribute.name !== 'type') {\n scriptNode.setAttribute(attribute.name, script.attributes[i].value)\n }\n }\n // ipsis - only add a source attribute when there was a source\n if (script.src !== '') {\n scriptNode.setAttribute('src', script.src)\n }\n // ipsis - add textContent, if there was any\n if (script.textContent !== '') {\n scriptNode.textContent = script.textContent\n }\n delete scriptNode.dataset.consent;\n scriptNode.setAttribute('type', type || 'application/javascript')\n document.head.appendChild(scriptNode)\n backupScripts.blacklisted.splice(index - indexOffset, 1)\n indexOffset++\n }\n })\n\n // Disconnect the observer if the blacklist is empty for performance reasons\n if (patterns.blacklist && patterns.blacklist.length < 1) {\n observer.disconnect()\n }\n}"],"names":["TYPE_ATTRIBUTE","CONSENT_VALUE","patterns","blacklist","window","YETT_BLACKLIST","whitelist","YETT_WHITELIST","settings","YETT_CHECKALLSCRIPTS","backupScripts","blacklisted","isOnBlacklist","src","type","dataConsent","some","pattern","test","every","willBeUnblocked","script","getAttribute","entry","observer","MutationObserver","mutations","i","length","addedNodes","_loop","node","nodeType","tagName","dataset","consent","push","addEventListener","beforeScriptExecuteListener","event","preventDefault","removeEventListener","parentElement","removeChild","observe","document","documentElement","childList","subtree","createElementBackup","createElement","originalDescriptors","Object","getOwnPropertyDescriptor","HTMLScriptElement","prototype","_len","arguments","args","Array","_key","toLowerCase","bind","scriptElt","defineProperties","_objectSpread","set","value","call","this","get","typeValue","setAttribute","name","error","console","warn","URL_REPLACER_REGEXP","RegExp","scriptUrlsOrRegexes","filter","urlOrRegexp","toString","map","permissiveRegexp","replace","p","Boolean","tags","querySelectorAll","concat","indexOffset","forEach","_ref","index","scriptNode","attributes","attribute","textContent","head","appendChild","splice","disconnect"],"mappings":"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"}