import { Component, html, LitElement, property } from '@rxdi/lit-html'; /** * @customElement r-let */ @Component({ selector: 'r-let', template(this: LetOperator) { return html` ${this.isObservable(this.data) ? html` { this.parentElement.parentNode.insertBefore( shadowRoot, this.parentElement.nextSibling ); return html`${this.normalizeArray(state).map(this.item)}`; }, }} > ` : this.normalizeArray(this.data).map(this.item)} `; }, }) export class LetOperator extends LitElement { @property({ type: Array }) public data = []; @property({ type: Object }) public item = (v) => html` ${v} `; OnUpdateFirst() { if (!this.isObservable(this.data)) { this.parentElement.parentNode.insertBefore( this.shadowRoot, this.parentElement.nextSibling ); } } // eslint-disable-next-line @typescript-eslint/no-explicit-any private normalizeArray(state: Record) { if (!state || typeof state === 'string') { return []; } if (typeof state === 'number') { return Array.from(Array(state), (v, i) => i); } /* https://javascript.info/map-set */ if (state instanceof Map || state instanceof Set) { return [...state.entries()]; } if (!Array.isArray(state)) { return Object.entries(state); } return state; } private isObservable(value) { return ( value && this.isFunction(value.lift) && this.isFunction(value.subscribe) ); } private isFunction(value) { return typeof value === 'function'; } }