UNPKG

ngx-source

Version:
115 lines (109 loc) 3.94 kB
import * as i0 from '@angular/core'; import { inject, Injectable } from '@angular/core'; import { DOCUMENT } from '@angular/common'; class Source { name; src; type; loaded; constructor(name, src, type, loaded) { this.name = name; this.src = src; this.type = type; this.loaded = loaded; } } var SourceType; (function (SourceType) { SourceType["SCRIPT"] = "SCRIPT"; SourceType["STYLE"] = "STYLE"; })(SourceType || (SourceType = {})); 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 }] }); /** * Generated bundle index. Do not edit. */ export { NgxSourceService, Source, SourceType }; //# sourceMappingURL=ngx-source.mjs.map