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
JavaScript
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