UNPKG

ngx-dynamic-hooks

Version:

Automatically insert live Angular components into a dynamic string of content (based on their selector or any pattern of your choice) and render the result in the DOM.

137 lines 17.1 kB
import { Inject, Injectable, SecurityContext } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "@angular/platform-browser"; /** * General implementation of PlatformService suited for both the standard browser and server environments */ export class DefaultPlatformService { constructor(document, rendererFactory, sanitizer) { this.document = document; this.rendererFactory = rendererFactory; this.sanitizer = sanitizer; this.renderer = this.rendererFactory.createRenderer(null, null); } getNgVersion() { if (typeof this.document !== "undefined") { const versionElement = this.querySelectorAll(this.document, '[ng-version]')?.[0]; const versionAttr = versionElement?.getAttribute('ng-version'); if (versionAttr) { return parseInt(versionAttr, 10); } } return null; } sanitize(content) { return this.sanitizer.sanitize(SecurityContext.HTML, content) || ''; } createElement(tagName) { return this.renderer.createElement(tagName); } sortElements(a, b) { if (a === b) return 0; if (!a.compareDocumentPosition) { // support for IE8 and below return a.sourceIndex - b.sourceIndex; } if (a.compareDocumentPosition(b) & 2) { // b comes before a return 1; } return -1; } cloneElement(element) { return element.cloneNode(true); } getTagName(element) { return element.tagName; } getOpeningTag(element) { // Approach by: https://stackoverflow.com/a/55859966/3099523 const innerLength = element.innerHTML.length; const outerLength = element.outerHTML.length; // Check for self-closing elements const openingTagLength = element.outerHTML[outerLength - 2] === '/' ? outerLength : outerLength - innerLength - element.tagName.length - 3; return element.outerHTML.slice(0, openingTagLength); } getClosingTag(element) { return element.outerHTML.slice(element.outerHTML.length - element.tagName.length - 3); } getAttributeNames(element) { return typeof element.getAttributeNames === 'function' ? element.getAttributeNames() : []; } getAttribute(element, attributeName) { return typeof element.getAttribute === 'function' ? element.getAttribute(attributeName) : null; } setAttribute(element, attributeName, value) { this.renderer.setAttribute(element, attributeName, value); } removeAttribute(element, attributeName) { this.renderer.removeAttribute(element, attributeName); } getParentNode(element) { try { return this.renderer.parentNode(element); } catch (e) { return null; } } querySelectorAll(parentElement, selector) { return Array.from(parentElement.querySelectorAll(selector)); } getChildNodes(node) { return Array.prototype.slice.call(node.childNodes); } appendChild(parentElement, childElement) { this.renderer.appendChild(parentElement, childElement); } insertBefore(parentElement, childElement, referenceElement) { this.renderer.insertBefore(parentElement, childElement, referenceElement); } clearChildNodes(element) { if (element) { while (element.firstChild) { this.removeChild(element, element.firstChild); } } } removeChild(parentElement, childElement) { parentElement.removeChild(childElement); } getInnerContent(element) { return element.innerHTML; } setInnerContent(element, content) { if (element) { element.innerHTML = content; } } isTextNode(element) { return element.nodeType === Node.TEXT_NODE; } createTextNode(content) { return document.createTextNode(content); } getTextContent(element) { return element.textContent; } dispatchEvent(element, name, payload) { element.dispatchEvent(new CustomEvent(name, { detail: payload, bubbles: true })); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DefaultPlatformService, deps: [{ token: DOCUMENT }, { token: i0.RendererFactory2 }, { token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DefaultPlatformService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DefaultPlatformService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: i0.RendererFactory2 }, { type: i1.DomSanitizer }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdFBsYXRmb3JtU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1keW5hbWljLWhvb2tzL3NyYy9saWIvc2VydmljZXMvcGxhdGZvcm0vZGVmYXVsdFBsYXRmb3JtU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBK0IsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2pHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBRTNDOztHQUVHO0FBSUgsTUFBTSxPQUFPLHNCQUFzQjtJQUdqQyxZQUFzQyxRQUFrQixFQUFVLGVBQWlDLEVBQVUsU0FBdUI7UUFBOUYsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFVLG9CQUFlLEdBQWYsZUFBZSxDQUFrQjtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDbEksSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN6QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sV0FBVyxHQUFHLGNBQWMsRUFBRSxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDL0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsT0FBTyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsUUFBUSxDQUFD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QUFlO1FBQy9DLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixPQUFPLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFhO1FBQ3RCLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzdDLENBQUM7SUFFRCxjQUFjLENBQUMsT0FBZTtRQUM1QixPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELGNBQWMsQ0FBQyxPQUFhO1FBQzFCLE9BQU8sT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUM3QixDQUFDO0lBRUQsYUFBYSxDQUFDLE9BQWEsRUFBRSxJQUFZLEVBQUUsT0FBWTtRQUNyRCxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDOytHQWhKVSxzQkFBc0Isa0JBR2IsUUFBUTttSEFIakIsc0JBQXNCLGNBRnJCLE1BQU07OzRGQUVQLHNCQUFzQjtrQkFIbEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQUljLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgUmVuZGVyZXIyLCBSZW5kZXJlckZhY3RvcnkyLCBTZWN1cml0eUNvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgQ29tcGxldGVQbGF0Zm9ybVNlcnZpY2UgfSBmcm9tICcuL3BsYXRmb3JtU2VydmljZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbi8qKlxuICogR2VuZXJhbCBpbXBsZW1lbnRhdGlvbiBvZiBQbGF0Zm9ybVNlcnZpY2Ugc3VpdGVkIGZvciBib3RoIHRoZSBzdGFuZGFyZCBicm93c2VyIGFuZCBzZXJ2ZXIgZW52aXJvbm1lbnRzXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERlZmF1bHRQbGF0Zm9ybVNlcnZpY2UgaW1wbGVtZW50cyBDb21wbGV0ZVBsYXRmb3JtU2VydmljZSB7XG4gIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMjtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCwgcHJpdmF0ZSByZW5kZXJlckZhY3Rvcnk6IFJlbmRlcmVyRmFjdG9yeTIsIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHsgXG4gICAgdGhpcy5yZW5kZXJlciA9IHRoaXMucmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuICB9XG5cbiAgZ2V0TmdWZXJzaW9uKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5kb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgdmVyc2lvbkVsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5kb2N1bWVudCwgJ1tuZy12ZXJzaW9uXScpPy5bMF07XG4gICAgICBjb25zdCB2ZXJzaW9uQXR0ciA9IHZlcnNpb25FbGVtZW50Py5nZXRBdHRyaWJ1dGUoJ25nLXZlcnNpb24nKTtcbiAgICAgIGlmICh2ZXJzaW9uQXR0cikge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQodmVyc2lvbkF0dHIsIDEwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgc2FuaXRpemUoY29udGVudDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5IVE1MLCBjb250ZW50KSB8fCAnJztcbiAgfVxuXG4gIGNyZWF0ZUVsZW1lbnQodGFnTmFtZTogc3RyaW5nKTogRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgfVxuXG4gIHNvcnRFbGVtZW50cyhhOiBFbGVtZW50LCBiOiBFbGVtZW50KTogbnVtYmVyIHtcbiAgICBpZiAoIGEgPT09IGIpIHJldHVybiAwO1xuXG4gICAgaWYgKCAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgICAgLy8gc3VwcG9ydCBmb3IgSUU4IGFuZCBiZWxvd1xuICAgICAgcmV0dXJuIChhIGFzIGFueSkuc291cmNlSW5kZXggLSAoYiBhcyBhbnkpLnNvdXJjZUluZGV4O1xuICAgIH1cblxuICAgIGlmICggYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDIpIHtcbiAgICAgIC8vIGIgY29tZXMgYmVmb3JlIGFcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGNsb25lRWxlbWVudChlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuY2xvbmVOb2RlKHRydWUpO1xuICB9XG5cbiAgZ2V0VGFnTmFtZShlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQudGFnTmFtZTtcbiAgfVxuXG4gIGdldE9wZW5pbmdUYWcoZWxlbWVudDogYW55KSB7XG4gICAgLy8gQXBwcm9hY2ggYnk6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS81NTg1OTk2Ni8zMDk5NTIzXG4gICAgY29uc3QgaW5uZXJMZW5ndGggPSBlbGVtZW50LmlubmVySFRNTC5sZW5ndGhcbiAgICBjb25zdCBvdXRlckxlbmd0aCA9IGVsZW1lbnQub3V0ZXJIVE1MLmxlbmd0aDtcbiAgICBcbiAgICAvLyBDaGVjayBmb3Igc2VsZi1jbG9zaW5nIGVsZW1lbnRzXG4gICAgY29uc3Qgb3BlbmluZ1RhZ0xlbmd0aCA9IGVsZW1lbnQub3V0ZXJIVE1MW291dGVyTGVuZ3RoIC0gMl0gPT09ICcvJyA/XG4gICAgICBvdXRlckxlbmd0aCA6XG4gICAgICBvdXRlckxlbmd0aCAtIGlubmVyTGVuZ3RoIC0gZWxlbWVudC50YWdOYW1lLmxlbmd0aCAtIDM7XG4gICAgXG4gICAgcmV0dXJuIGVsZW1lbnQub3V0ZXJIVE1MLnNsaWNlKDAsIG9wZW5pbmdUYWdMZW5ndGgpO1xuICB9XG5cbiAgZ2V0Q2xvc2luZ1RhZyhlbGVtZW50OiBhbnkpIHtcbiAgICByZXR1cm4gZWxlbWVudC5vdXRlckhUTUwuc2xpY2UoZWxlbWVudC5vdXRlckhUTUwubGVuZ3RoIC0gZWxlbWVudC50YWdOYW1lLmxlbmd0aCAtIDMpO1xuICB9XG5cbiAgZ2V0QXR0cmlidXRlTmFtZXMoZWxlbWVudDogTm9kZSkge1xuICAgIHJldHVybiB0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS5nZXRBdHRyaWJ1dGVOYW1lcyA9PT0gJ2Z1bmN0aW9uJyA/IChlbGVtZW50IGFzIGFueSkuZ2V0QXR0cmlidXRlTmFtZXMoKSA6IFtdO1xuICB9XG5cbiAgZ2V0QXR0cmlidXRlKGVsZW1lbnQ6IEVsZW1lbnQsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS5nZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbicgPyAoZWxlbWVudCBhcyBhbnkpLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA6IG51bGw7XG4gIH1cblxuICBzZXRBdHRyaWJ1dGUoZWxlbWVudDogRWxlbWVudCwgYXR0cmlidXRlTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgcmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQ6IGFueSwgYXR0cmlidXRlTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTmFtZSk7XG4gIH1cblxuICBnZXRQYXJlbnROb2RlKGVsZW1lbnQ6IE5vZGUpOiBOb2RlfG51bGwge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHF1ZXJ5U2VsZWN0b3JBbGwocGFyZW50RWxlbWVudDogRG9jdW1lbnR8RWxlbWVudCwgc2VsZWN0b3I6IHN0cmluZyk6IEVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ocGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG4gIH1cblxuICBnZXRDaGlsZE5vZGVzKG5vZGU6IE5vZGUpOiBOb2RlW10ge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChub2RlLmNoaWxkTm9kZXMpO1xuICB9XG5cbiAgYXBwZW5kQ2hpbGQocGFyZW50RWxlbWVudDogTm9kZSwgY2hpbGRFbGVtZW50OiBOb2RlKSB7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChwYXJlbnRFbGVtZW50LCBjaGlsZEVsZW1lbnQpO1xuICB9XG5cbiAgaW5zZXJ0QmVmb3JlKHBhcmVudEVsZW1lbnQ6IE5vZGUsIGNoaWxkRWxlbWVudDogTm9kZSwgcmVmZXJlbmNlRWxlbWVudDogTm9kZSkge1xuICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0QmVmb3JlKHBhcmVudEVsZW1lbnQsIGNoaWxkRWxlbWVudCwgcmVmZXJlbmNlRWxlbWVudCk7XG4gIH1cbiAgXG4gIGNsZWFyQ2hpbGROb2RlcyhlbGVtZW50OiBOb2RlKSB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZChlbGVtZW50LCBlbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUNoaWxkKHBhcmVudEVsZW1lbnQ6IE5vZGUsIGNoaWxkRWxlbWVudDogTm9kZSkge1xuICAgIHBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGRFbGVtZW50KTtcbiAgfVxuXG4gIGdldElubmVyQ29udGVudChlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJIVE1MO1xuICB9XG5cbiAgc2V0SW5uZXJDb250ZW50KGVsZW1lbnQ6IEVsZW1lbnQsIGNvbnRlbnQ6IHN0cmluZykge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBlbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnQ7XG4gICAgfVxuICB9XG5cbiAgaXNUZXh0Tm9kZShlbGVtZW50OiBOb2RlKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFO1xuICB9XG5cbiAgY3JlYXRlVGV4dE5vZGUoY29udGVudDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpO1xuICB9XG5cbiAgZ2V0VGV4dENvbnRlbnQoZWxlbWVudDogTm9kZSkge1xuICAgIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50O1xuICB9XG5cbiAgZGlzcGF0Y2hFdmVudChlbGVtZW50OiBOb2RlLCBuYW1lOiBzdHJpbmcsIHBheWxvYWQ6IGFueSkge1xuICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQobmFtZSwgeyBkZXRhaWw6IHBheWxvYWQsIGJ1YmJsZXM6IHRydWUgfSkpO1xuICB9XG59Il19