UNPKG

@bespunky/angular-zen

Version:

The Angular tools you always wished were there.

53 lines 6.89 kB
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=