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.
51 lines • 5.71 kB
JavaScript
/**
* Polyfill for String.prototype.matchAll() from the ES2020 spec
*
* Note: The 'string.prototype.matchall' npm package was unstable for me so providing my own version here
*
* @param text - The text to search
* @param regExp - The RegExp object to use
*/
export function matchAll(text, regExp) {
// Must be global
if (!regExp.global) {
throw Error('TypeError: matchAll called with a non-global RegExp argument');
}
// Get matches
const result = [];
let match = regExp.exec(text);
while (match !== null) {
result.push(match);
match = regExp.exec(text);
}
// Reset internal index
regExp.lastIndex = 0;
return result;
}
/**
* Sort elements/nodes based on the order of their appearance in the document
*
* @param arr - The array to sort
* @param sortCallback - The callback to use to sort the elements
* @param getElement - An optional callback that returns the element to compare from each arr entry
*/
export function sortElements(arr, sortCallback, getElementCallback) {
const result = [...arr];
return result.sort(function (a, b) {
if (typeof getElementCallback === 'function') {
a = getElementCallback(a);
b = getElementCallback(b);
}
return sortCallback(a, b);
});
}
/**
* Indicates if an element is either a component host element or part of a component's view/template
*
* @param element - The element to inspect
*/
export function isAngularManagedElement(element) {
// Angular gives component host and view elements the following property, so can simply check for that
return element?.__ngContext__ !== undefined;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHluYW1pYy1ob29rcy9zcmMvbGliL3NlcnZpY2VzL3V0aWxzL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQVksRUFBRSxNQUFjO0lBQ25ELGlCQUFpQjtJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25CLE1BQU0sS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELGNBQWM7SUFDZCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDbEIsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixPQUFPLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFckIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUksR0FBUSxFQUFFLFlBQXdDLEVBQUUsa0JBQXFDO0lBQ3ZILE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN4QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBUyxDQUFDLEVBQUUsQ0FBQztRQUU5QixJQUFJLE9BQU8sa0JBQWtCLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDN0MsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsT0FBWTtJQUNsRCxzR0FBc0c7SUFDdEcsT0FBTyxPQUFPLEVBQUUsYUFBYSxLQUFLLFNBQVMsQ0FBQztBQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIFBvbHlmaWxsIGZvciBTdHJpbmcucHJvdG90eXBlLm1hdGNoQWxsKCkgZnJvbSB0aGUgRVMyMDIwIHNwZWNcbiAqXG4gKiBOb3RlOiBUaGUgJ3N0cmluZy5wcm90b3R5cGUubWF0Y2hhbGwnIG5wbSBwYWNrYWdlIHdhcyB1bnN0YWJsZSBmb3IgbWUgc28gcHJvdmlkaW5nIG15IG93biB2ZXJzaW9uIGhlcmVcbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHRvIHNlYXJjaFxuICogQHBhcmFtIHJlZ0V4cCAtIFRoZSBSZWdFeHAgb2JqZWN0IHRvIHVzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hBbGwodGV4dDogc3RyaW5nLCByZWdFeHA6IFJlZ0V4cCk6IHtbaW5kZXg6IG51bWJlcl06IHN0cmluZywgaW5kZXg6IG51bWJlciwgaW5wdXQ6IHN0cmluZ31bXSB7XG4gIC8vIE11c3QgYmUgZ2xvYmFsXG4gIGlmICghcmVnRXhwLmdsb2JhbCkge1xuICAgIHRocm93IEVycm9yKCdUeXBlRXJyb3I6IG1hdGNoQWxsIGNhbGxlZCB3aXRoIGEgbm9uLWdsb2JhbCBSZWdFeHAgYXJndW1lbnQnKTtcbiAgfVxuXG4gIC8vIEdldCBtYXRjaGVzXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBsZXQgbWF0Y2ggPSByZWdFeHAuZXhlYyh0ZXh0KTtcbiAgd2hpbGUgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgcmVzdWx0LnB1c2gobWF0Y2gpO1xuICAgIG1hdGNoID0gcmVnRXhwLmV4ZWModGV4dCk7XG4gIH1cblxuICAvLyBSZXNldCBpbnRlcm5hbCBpbmRleFxuICByZWdFeHAubGFzdEluZGV4ID0gMDtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFNvcnQgZWxlbWVudHMvbm9kZXMgYmFzZWQgb24gdGhlIG9yZGVyIG9mIHRoZWlyIGFwcGVhcmFuY2UgaW4gdGhlIGRvY3VtZW50XG4gKlxuICogQHBhcmFtIGFyciAtIFRoZSBhcnJheSB0byBzb3J0XG4gKiBAcGFyYW0gc29ydENhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIHVzZSB0byBzb3J0IHRoZSBlbGVtZW50c1xuICogQHBhcmFtIGdldEVsZW1lbnQgLSBBbiBvcHRpb25hbCBjYWxsYmFjayB0aGF0IHJldHVybnMgdGhlIGVsZW1lbnQgdG8gY29tcGFyZSBmcm9tIGVhY2ggYXJyIGVudHJ5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0RWxlbWVudHM8VD4oYXJyOiBUW10sIHNvcnRDYWxsYmFjazogKGE6IGFueSwgYjogYW55KSA9PiBudW1iZXIsIGdldEVsZW1lbnRDYWxsYmFjazogKGVudHJ5OiBUKSA9PiBhbnkpOiBUW10ge1xuICBjb25zdCByZXN1bHQgPSBbLi4uYXJyXTtcbiAgcmV0dXJuIHJlc3VsdC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcblxuICAgIGlmICh0eXBlb2YgZ2V0RWxlbWVudENhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhID0gZ2V0RWxlbWVudENhbGxiYWNrKGEpO1xuICAgICAgYiA9IGdldEVsZW1lbnRDYWxsYmFjayhiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydENhbGxiYWNrKGEsIGIpO1xuICB9KTtcbn1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGFuIGVsZW1lbnQgaXMgZWl0aGVyIGEgY29tcG9uZW50IGhvc3QgZWxlbWVudCBvciBwYXJ0IG9mIGEgY29tcG9uZW50J3Mgdmlldy90ZW1wbGF0ZVxuICAgKiBcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBpbnNwZWN0XG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gaXNBbmd1bGFyTWFuYWdlZEVsZW1lbnQoZWxlbWVudDogYW55KTogYm9vbGVhbiB7XG4gICAgLy8gQW5ndWxhciBnaXZlcyBjb21wb25lbnQgaG9zdCBhbmQgdmlldyBlbGVtZW50cyB0aGUgZm9sbG93aW5nIHByb3BlcnR5LCBzbyBjYW4gc2ltcGx5IGNoZWNrIGZvciB0aGF0XG4gICAgcmV0dXJuIGVsZW1lbnQ/Ll9fbmdDb250ZXh0X18gIT09IHVuZGVmaW5lZDtcbiAgfSJdfQ==