UNPKG

ngx-source

Version:
89 lines 12.2 kB
import { inject, Injectable } from '@angular/core'; import { SourceType } from './ngx-source-type.model'; import { DOCUMENT } from '@angular/common'; import * as i0 from "@angular/core"; export class NgxSourceService { document = inject(DOCUMENT); sources = new Map(); addSources(...sources) { sources.forEach(source => this.addSource(source)); } addSource(source) { if (!this.sources.has(source.name)) { this.sources.set(source.name, new Set()); } const sourceSet = this.sources.get(source.name); const serialized = JSON.stringify(source); const alreadyExists = Array.from(sourceSet).some(s => JSON.stringify(s) === serialized); if (!alreadyExists) { sourceSet.add(source); } } loadBySourceNames(...sourceNames) { return Promise.all(sourceNames.flatMap(name => this.loadBySourceName(name))); } loadBySourceName(sourceName) { const sources = this.sources.get(sourceName); if (!sources || sources.size === 0) { return [ Promise.reject({ script: sourceName, loaded: false, status: 'Not found in source store', }), ]; } return Array.from(sources).map(source => this.loadSource(source)); } loadSources(sources) { this.addSources(...sources); return Promise.all(sources.map(source => this.loadSource(source))); } loadSource(source) { this.addSource(source); if (source.loaded || this.isSourceInDOM(source)) { source.loaded = true; return Promise.resolve({ script: source.name, loaded: true, status: 'Already loaded', }); } return new Promise((resolve, reject) => { let element; if (source.type === SourceType.STYLE) { element = this.document.createElement('link'); element.rel = 'stylesheet'; element.href = source.src; } else { element = this.document.createElement('script'); element.type = 'text/javascript'; element.src = source.src; } element.onload = () => { source.loaded = true; resolve({ script: source.name, loaded: true, status: 'Loaded', }); }; element.onerror = () => { reject({ script: source.name, loaded: false, status: 'Load failed', }); }; this.document.head.appendChild(element); }); } isSourceInDOM = (source) => !!this.document.querySelector(source.type === SourceType.STYLE ? `link[href="${source.src}"]` : `script[src="${source.src}"]`); static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgxSourceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgxSourceService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgxSourceService, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNvdXJjZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Jlc291cmNlL25neC1zb3VyY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUczQyxNQUFNLE9BQU8sZ0JBQWdCO0lBQ1YsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QixPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7SUFFcEQsVUFBVSxDQUFDLEdBQUcsT0FBa0I7UUFDckMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQWU7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFFLENBQUM7UUFDakQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUxQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFB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LE1BQU0sRUFBRSxJQUFJO29CQUNaLE1BQU0sRUFBRSxRQUFRO2lCQUNqQixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUM7WUFFRixPQUFPLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRTtnQkFDckIsTUFBTSxDQUFDO29CQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDbkIsTUFBTSxFQUFFLEtBQUs7b0JBQ2IsTUFBTSxFQUFFLGFBQWE7aUJBQ3RCLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQztZQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxhQUFhLEdBQUcsQ0FBQyxNQUFlLEVBQVcsRUFBRSxDQUNuRCxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQzt1R0E3RnRILGdCQUFnQjsyR0FBaEIsZ0JBQWdCOzsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTb3VyY2VUeXBlIH0gZnJvbSAnLi9uZ3gtc291cmNlLXR5cGUubW9kZWwnO1xuaW1wb3J0IHsgSVNvdXJjZSB9IGZyb20gJy4vbmd4LXNvdXJjZS5tb2RlbCc7XG5pbXBvcnQgeyBJU291cmNlTG9hZFJlc3VsdCB9IGZyb20gJy4vbmd4LXNvdXJjZS1sb2FkLXJlc3VsdC5tb2RlbCc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ3hTb3VyY2VTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc291cmNlcyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8SVNvdXJjZT4+KCk7XG5cbiAgcHVibGljIGFkZFNvdXJjZXMoLi4uc291cmNlczogSVNvdXJjZVtdKTogdm9pZCB7XG4gICAgc291cmNlcy5mb3JFYWNoKHNvdXJjZSA9PiB0aGlzLmFkZFNvdXJjZShzb3VyY2UpKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRTb3VyY2Uoc291cmNlOiBJU291cmNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNvdXJjZXMuaGFzKHNvdXJjZS5uYW1lKSkge1xuICAgICAgdGhpcy5zb3VyY2VzLnNldChzb3VyY2UubmFtZSwgbmV3IFNldCgpKTtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VTZXQgPSB0aGlzLnNvdXJjZXMuZ2V0KHNvdXJjZS5uYW1lKSE7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHNvdXJjZSk7XG5cbiAgICBjb25zdCBhbHJlYWR5RXhpc3RzID0gQXJyYXkuZnJvbShzb3VyY2VTZXQpLnNvbWUocyA9PiBKU09OLnN0cmluZ2lmeShzKSA9PT0gc2VyaWFsaXplZCk7XG4gICAgaWYgKCFhbHJlYWR5RXhpc3RzKSB7XG4gICAgICBzb3VyY2VTZXQuYWRkKHNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGxvYWRCeVNvdXJjZU5hbWVzKC4uLnNvdXJjZU5hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8SVNvdXJjZUxvYWRSZXN1bHRbXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChzb3VyY2VOYW1lcy5mbGF0TWFwKG5hbWUgPT4gdGhpcy5sb2FkQnlTb3VyY2VOYW1lKG5hbWUpKSk7XG4gIH1cblxuICBwdWJsaWMgbG9hZEJ5U291cmNlTmFtZShzb3VyY2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPElTb3VyY2VMb2FkUmVzdWx0PltdIHtcbiAgICBjb25zdCBzb3VyY2VzID0gdGhpcy5zb3VyY2VzLmdldChzb3VyY2VOYW1lKTtcbiAgICBpZiAoIXNvdXJjZXMgfHwgc291cmNlcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBQcm9taXNlLnJlamVjdCh7XG4gICAgICAgICAgc2NyaXB0OiBzb3VyY2VOYW1lLFxuICAgICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgICAgc3RhdHVzOiAnTm90IGZvdW5kIGluIHNvdXJjZSBzdG9yZScsXG4gICAgICAgIH0pLFxuICAgICAgXTtcbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShzb3VyY2VzKS5tYXAoc291cmNlID0+IHRoaXMubG9hZFNvdXJjZShzb3VyY2UpKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkU291cmNlcyhzb3VyY2VzOiBJU291cmNlW10pOiBQcm9taXNlPElTb3VyY2VMb2FkUmVzdWx0W10+IHtcbiAgICB0aGlzLmFkZFNvdXJjZXMoLi4uc291cmNlcyk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHNvdXJjZXMubWFwKHNvdXJjZSA9PiB0aGlzLmxvYWRTb3VyY2Uoc291cmNlKSkpO1xuICB9XG5cbiAgcHVibGljIGxvYWRTb3VyY2Uoc291cmNlOiBJU291cmNlKTogUHJvbWlzZTxJU291cmNlTG9hZFJlc3VsdD4ge1xuICAgIHRoaXMuYWRkU291cmNlKHNvdXJjZSk7XG5cbiAgICBpZiAoc291cmNlLmxvYWRlZCB8fCB0aGlzLmlzU291cmNlSW5ET00oc291cmNlKSkge1xuICAgICAgc291cmNlLmxvYWRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgc2NyaXB0OiBzb3VyY2UubmFtZSxcbiAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICBzdGF0dXM6ICdBbHJlYWR5IGxvYWRlZCcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8SVNvdXJjZUxvYWRSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBlbGVtZW50OiBIVE1MTGlua0VsZW1lbnQgfCBIVE1MU2NyaXB0RWxlbWVudDtcblxuICAgICAgaWYgKHNvdXJjZS50eXBlID09PSBTb3VyY2VUeXBlLlNUWUxFKSB7XG4gICAgICAgIGVsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgZWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIGVsZW1lbnQuaHJlZiA9IHNvdXJjZS5zcmM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgZWxlbWVudC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgIGVsZW1lbnQuc3JjID0gc291cmNlLnNyYztcbiAgICAgIH1cblxuICAgICAgZWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIHNvdXJjZS5sb2FkZWQgPSB0cnVlO1xuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICBzY3JpcHQ6IHNvdXJjZS5uYW1lLFxuICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICBzdGF0dXM6ICdMb2FkZWQnLFxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGVsZW1lbnQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgcmVqZWN0KHtcbiAgICAgICAgICBzY3JpcHQ6IHNvdXJjZS5uYW1lLFxuICAgICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgICAgc3RhdHVzOiAnTG9hZCBmYWlsZWQnLFxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNTb3VyY2VJbkRPTSA9IChzb3VyY2U6IElTb3VyY2UpOiBib29sZWFuID0+XG4gICAgISF0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc291cmNlLnR5cGUgPT09IFNvdXJjZVR5cGUuU1RZTEUgPyBgbGlua1tocmVmPVwiJHtzb3VyY2Uuc3JjfVwiXWAgOiBgc2NyaXB0W3NyYz1cIiR7c291cmNlLnNyY31cIl1gKTtcbn1cbiJdfQ==