You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.9 KiB
75 lines
1.9 KiB
2 years ago
|
/**
|
||
|
* 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,
|
||
|
};
|