@bespunky/angular-zen
Version:
The Angular tools you always wished were there.
53 lines • 6.89 kB
JavaScript
export class MockElement {
constructor(tagName) {
this.tagName = tagName;
this.children = [];
}
remove() {
if (this.parentElement)
this.parentElement.removeChild(this);
}
removeChild(node) {
if (node.parentElement !== this)
return;
const index = this.children.indexOf(node);
if (index > -1) {
this.children.splice(index, 1);
node.parentElement = null;
}
}
appendChild(node) {
this.children.push(node);
node.parentElement = this;
if (node.onload instanceof Function)
setTimeout(node.onload, 0);
}
querySelectorAll(selector) {
throw new Error(`
Providing a general implementation for querySelectorAll() to support all cases is to complex.
Use jest.spyOn() and fake this to provide an implementation for the specific use case.
See MockElement.extractXXXFromSelector() methods for utils.
`);
}
/**
* Extracts an array of {name, value} objects mapping the attributes from the specified selector string.
* Attributes with no value will be mapped with wildcard value (i.e. '**').
*
* @param {string} selector
* @returns {*}
*/
extractAttributesFromSelector(selector) {
// Searches for [key="value"] and [key] groups and extracts the attribute and value from each
const regex = /(?:(\[(?<attr>\w+)(?:="(?<value>[^\]]+)")?)\]*)/g;
let match;
const attributes = [];
while ((match = regex.exec(selector)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (match.index === regex.lastIndex)
regex.lastIndex++;
attributes.push({ name: match.groups?.['attr'], value: match.groups?.['value'] || '**' });
}
return attributes;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC5tb2NrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXplbi9jb3JlL3Rlc3Rpbmcvc3JjL21vY2tzL2VsZW1lbnQubW9jay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sV0FBVztJQVFwQixZQUFtQixPQUFnQjtRQUFoQixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBTDVCLGFBQVEsR0FBZSxFQUFFLENBQUM7SUFLTSxDQUFDO0lBRWpDLE1BQU07UUFFVCxJQUFJLElBQUksQ0FBQyxhQUFhO1lBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVNLFdBQVcsQ0FBQyxJQUFTO1FBRXhCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJO1lBQUUsT0FBTztRQUV4QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUxQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFDZDtZQUNJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUUvQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztTQUM3QjtJQUNMLENBQUM7SUFFTSxXQUFXLENBQUMsSUFBUztRQUV4QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUUxQixJQUFJLElBQUksQ0FBQyxNQUFNLFlBQVksUUFBUTtZQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxRQUFnQjtRQUVwQyxNQUFNLElBQUksS0FBSyxDQUFDOzs7O1NBSWYsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDZCQUE2QixDQUFDLFFBQWdCO1FBRWpELDZGQUE2RjtRQUM3RixNQUFNLEtBQUssR0FBRyxrREFBa0QsQ0FBQztRQUNqRSxJQUFJLEtBQTZCLENBQUM7UUFFbEMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXRCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLElBQUksRUFDOUM7WUFDSSxvRUFBb0U7WUFDcEUsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxTQUFTO2dCQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUV2RCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7U0FDN0Y7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgTW9ja0VsZW1lbnRcbntcbiAgICBwdWJsaWMgcGFyZW50RWxlbWVudD86IE1vY2tFbGVtZW50O1xuICAgIHB1YmxpYyBjaGlsZHJlbiAgICAgOiBhbnlbXSA9IFtdO1xuXG4gICAgcHVibGljIGRpcj8gICAgICA6ICdsdHInIHwgJ3J0bCc7XG4gICAgcHVibGljIGNsYXNzTmFtZT86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0YWdOYW1lPzogc3RyaW5nKSB7IH1cblxuICAgIHB1YmxpYyByZW1vdmUoKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50RWxlbWVudCkgdGhpcy5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVDaGlsZChub2RlOiBhbnkpOiB2b2lkXG4gICAge1xuICAgICAgICBpZiAobm9kZS5wYXJlbnRFbGVtZW50ICE9PSB0aGlzKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmNoaWxkcmVuLmluZGV4T2Yobm9kZSk7XG5cbiAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgbm9kZS5wYXJlbnRFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhcHBlbmRDaGlsZChub2RlOiBhbnkpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2gobm9kZSk7XG5cbiAgICAgICAgbm9kZS5wYXJlbnRFbGVtZW50ID0gdGhpcztcblxuICAgICAgICBpZiAobm9kZS5vbmxvYWQgaW5zdGFuY2VvZiBGdW5jdGlvbikgc2V0VGltZW91dChub2RlLm9ubG9hZCwgMCk7XG4gICAgfVxuXG4gICAgcHVibGljIHF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3I6IHN0cmluZyk6IGFueVtdXG4gICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuICAgICAgICAgICAgUHJvdmlkaW5nIGEgZ2VuZXJhbCBpbXBsZW1lbnRhdGlvbiBmb3IgcXVlcnlTZWxlY3RvckFsbCgpIHRvIHN1cHBvcnQgYWxsIGNhc2VzIGlzIHRvIGNvbXBsZXguXG4gICAgICAgICAgICBVc2UgamVzdC5zcHlPbigpIGFuZCBmYWtlIHRoaXMgdG8gcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHNwZWNpZmljIHVzZSBjYXNlLlxuICAgICAgICAgICAgU2VlIE1vY2tFbGVtZW50LmV4dHJhY3RYWFhGcm9tU2VsZWN0b3IoKSBtZXRob2RzIGZvciB1dGlscy5cbiAgICAgICAgYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgYW4gYXJyYXkgb2Yge25hbWUsIHZhbHVlfSBvYmplY3RzIG1hcHBpbmcgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yIHN0cmluZy5cbiAgICAgKiBBdHRyaWJ1dGVzIHdpdGggbm8gdmFsdWUgd2lsbCBiZSBtYXBwZWQgd2l0aCB3aWxkY2FyZCB2YWx1ZSAoaS5lLiAnKionKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqL1xuICAgIHB1YmxpYyBleHRyYWN0QXR0cmlidXRlc0Zyb21TZWxlY3RvcihzZWxlY3Rvcjogc3RyaW5nKTogYW55XG4gICAge1xuICAgICAgICAvLyBTZWFyY2hlcyBmb3IgW2tleT1cInZhbHVlXCJdIGFuZCBba2V5XSBncm91cHMgYW5kIGV4dHJhY3RzIHRoZSBhdHRyaWJ1dGUgYW5kIHZhbHVlIGZyb20gZWFjaFxuICAgICAgICBjb25zdCByZWdleCA9IC8oPzooXFxbKD88YXR0cj5cXHcrKSg/Oj1cIig/PHZhbHVlPlteXFxdXSspXCIpPylcXF0qKS9nO1xuICAgICAgICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gW107XG4gICAgICAgIFxuICAgICAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhzZWxlY3RvcikpICE9PSBudWxsKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBpbmZpbml0ZSBsb29wcyB3aXRoIHplcm8td2lkdGggbWF0Y2hlc1xuICAgICAgICAgICAgaWYgKG1hdGNoLmluZGV4ID09PSByZWdleC5sYXN0SW5kZXgpIHJlZ2V4Lmxhc3RJbmRleCsrO1xuXG4gICAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goeyBuYW1lOiBtYXRjaC5ncm91cHM/LlsnYXR0ciddLCB2YWx1ZTogbWF0Y2guZ3JvdXBzPy5bJ3ZhbHVlJ10gfHwgJyoqJyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIH1cbn0iXX0=