const { isExternalLink } = require('./strings.cjs'); /** * Transforms external links to make them safer and optionally add a target. The provided doc should be a document * object provided by JSDOM. The same document will be returned with the appropriate DOM manipulations. */ module.exports = function (doc, options) { options = { className: 'external-link', // the class name to add to links noopener: true, // sets rel="noopener" noreferrer: true, // sets rel="noreferrer" ignore: () => false, // callback function to filter links that should be ignored within: 'body', // element that contains the target links target: '', // sets the target attribute ...options }; const within = doc.querySelector(options.within); if (within) { within.querySelectorAll('a').forEach(link => { if (isExternalLink(link) && !options.ignore(link)) { link.classList.add(options.className); const rel = []; if (options.noopener) rel.push('noopener'); if (options.noreferrer) rel.push('noreferrer'); if (rel.length) { link.setAttribute('rel', rel.join(' ')); } if (options.target) { link.setAttribute('target', options.target); } } }); } return doc; };