Spaces:
Sleeping
Sleeping
/** | |
* Debounce a function to delay invoking until wait (ms) have elapsed since the last invocation. | |
* @param {function(...*): *} fn The function to be debounced. | |
* @param {number} wait Milliseconds to wait before invoking again. | |
* @return {function(...*): void} The debounced function. | |
*/ | |
function debounce(fn, wait) { | |
/** | |
* A cached setTimeout handler. | |
* @type {number | undefined} | |
*/ | |
let timer; | |
/** | |
* @returns {void} | |
*/ | |
function debounced() { | |
const context = this; | |
const args = arguments; | |
clearTimeout(timer); | |
timer = setTimeout(function () { | |
return fn.apply(context, args); | |
}, wait); | |
} | |
return debounced; | |
} | |
/** | |
* Prettify a filename from error stacks into the desired format. | |
* @param {string} filename The filename to be formatted. | |
* @returns {string} The formatted filename. | |
*/ | |
function formatFilename(filename) { | |
// Strip away protocol and domain for compiled files | |
const htmlMatch = /^https?:\/\/(.*)\/(.*)/.exec(filename); | |
if (htmlMatch && htmlMatch[1] && htmlMatch[2]) { | |
return htmlMatch[2]; | |
} | |
// Strip everything before the first directory for source files | |
const sourceMatch = /\/.*?([^./]+[/|\\].*)$/.exec(filename); | |
if (sourceMatch && sourceMatch[1]) { | |
return sourceMatch[1].replace(/\?$/, ''); | |
} | |
// Unknown filename type, use it as is | |
return filename; | |
} | |
/** | |
* Remove all children of an element. | |
* @param {HTMLElement} element A valid HTML element. | |
* @param {number} [skip] Number of elements to skip removing. | |
* @returns {void} | |
*/ | |
function removeAllChildren(element, skip) { | |
/** @type {Node[]} */ | |
const childList = Array.prototype.slice.call( | |
element.childNodes, | |
typeof skip !== 'undefined' ? skip : 0 | |
); | |
for (let i = 0; i < childList.length; i += 1) { | |
element.removeChild(childList[i]); | |
} | |
} | |
module.exports = { | |
debounce: debounce, | |
formatFilename: formatFilename, | |
removeAllChildren: removeAllChildren, | |
}; | |