ngx-source
Version:
Angular resource loader
115 lines (109 loc) • 3.94 kB
JavaScript
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