@spartacus/core
Version:
Spartacus - the core framework
97 lines • 11.2 kB
JavaScript
import { DOCUMENT, isPlatformServer } from '@angular/common';
import { Inject, Injectable, PLATFORM_ID } from '@angular/core';
import * as i0 from "@angular/core";
export var ScriptPlacement;
(function (ScriptPlacement) {
ScriptPlacement["HEAD"] = "head";
ScriptPlacement["BODY"] = "body";
})(ScriptPlacement || (ScriptPlacement = {}));
export class ScriptLoader {
constructor(document, platformId) {
this.document = document;
this.platformId = platformId;
}
/**
* Embeds a javascript from an external URL.
*
* @param embedOptions
* src: URL for the script to be loaded
* params: additional parameters to be attached to the given URL
* attributes: the attributes of HTML script tag (exclude src)
* callback: a function to be invoked after the script has been loaded
* errorCallback: function to be invoked after error during script loading
* placement: HTML body or head where script will be placed
*/
embedScript(embedOptions) {
const { src, params, attributes, callback, errorCallback, placement = ScriptPlacement.HEAD, } = embedOptions;
const isSSR = isPlatformServer(this.platformId);
if ((callback || errorCallback) && isSSR) {
return;
}
const source = params ? src + this.parseParams(params) : src;
if (!isSSR && this.hasScript(source)) {
return;
}
const script = this.document.createElement('script');
script.src = source;
script.async = true;
script.defer = true;
if (attributes) {
Object.keys(attributes).forEach((key) => {
// custom attributes
if (key.startsWith('data-')) {
script.setAttribute(key, attributes[key]);
}
else {
script[key] = attributes[key];
}
});
}
if (callback) {
script.addEventListener('load', callback);
}
if (errorCallback) {
script.addEventListener('error', errorCallback);
}
placement === ScriptPlacement.HEAD
? this.document.head.appendChild(script)
: this.document.body.appendChild(script);
}
/**
* Indicates if the script is already added to the DOM.
*/
hasScript(src) {
return !!this.document.querySelector(`script[src="${src}"]`);
}
/**
* Parses the given object with parameters to a string "param1=value1¶m2=value2"
* @param params object containing parameters
*/
parseParams(params) {
let result = '';
const keysArray = Object.keys(params);
if (keysArray.length > 0) {
result =
'?' +
keysArray
.map((key) => encodeURI(key) + '=' + encodeURI(params[key]))
.join('&');
}
return result;
}
}
ScriptLoader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ScriptLoader, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable });
ScriptLoader.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ScriptLoader, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ScriptLoader, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: Object, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0LWxvYWRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvdXRpbC9zY3JpcHQtbG9hZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFaEUsTUFBTSxDQUFOLElBQVksZUFHWDtBQUhELFdBQVksZUFBZTtJQUN6QixnQ0FBYSxDQUFBO0lBQ2IsZ0NBQWEsQ0FBQTtBQUNmLENBQUMsRUFIVyxlQUFlLEtBQWYsZUFBZSxRQUcxQjtBQUtELE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLFlBQzhCLFFBQWEsRUFDVixVQUFrQjtRQURyQixhQUFRLEdBQVIsUUFBUSxDQUFLO1FBQ1YsZUFBVSxHQUFWLFVBQVUsQ0FBUTtJQUNoRCxDQUFDO0lBRUo7Ozs7Ozs7Ozs7T0FVRztJQUNJLFdBQVcsQ0FBQyxZQU9sQjtRQUNDLE1BQU0sRUFDSixHQUFHLEVBQ0gsTUFBTSxFQUNOLFVBQVUsRUFDVixRQUFRLEVBQ1IsYUFBYSxFQUNiLFNBQVMsR0FBRyxlQUFlLENBQUMsSUFBSSxHQUNqQyxHQUFHLFlBQVksQ0FBQztRQUVqQixNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFFBQVEsSUFBSSxhQUFhLENBQUMsSUFBSSxLQUFLLEVBQUU7WUFDeEMsT0FBTztTQUNSO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzdELElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNwQyxPQUFPO1NBQ1I7UUFFRCxNQUFNLE1BQU0sR0FBc0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEUsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUM7UUFDcEIsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDcEIsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFFcEIsSUFBSSxVQUFVLEVBQUU7WUFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN0QyxvQkFBb0I7Z0JBQ3BCLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDM0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQzNDO3FCQUFNO29CQUNMLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQy9CO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztTQUMzQztRQUNELElBQUksYUFBYSxFQUFFO1lBQ2pCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDakQ7UUFFRCxTQUFTLEtBQUssZUFBZSxDQUFDLElBQUk7WUFDaEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDeEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDTyxTQUFTLENBQUMsR0FBWTtRQUM5QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFdBQVcsQ0FBQyxNQUFjO1FBQ2hDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDeEIsTUFBTTtnQkFDSixHQUFHO29CQUNILFNBQVM7eUJBQ04sR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt5QkFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7eUdBOUZVLFlBQVksa0JBRWIsUUFBUSxhQUNSLFdBQVc7NkdBSFYsWUFBWSxjQUZYLE1BQU07MkZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQUdJLE1BQU07MkJBQUMsUUFBUTs4QkFDMkIsTUFBTTswQkFBaEQsTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQsIGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgZW51bSBTY3JpcHRQbGFjZW1lbnQge1xuICBIRUFEID0gJ2hlYWQnLFxuICBCT0RZID0gJ2JvZHknLFxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2NyaXB0TG9hZGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJvdGVjdGVkIGRvY3VtZW50OiBhbnksXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJvdGVjdGVkIHBsYXRmb3JtSWQ6IE9iamVjdFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyBhIGphdmFzY3JpcHQgZnJvbSBhbiBleHRlcm5hbCBVUkwuXG4gICAqXG4gICAqIEBwYXJhbSBlbWJlZE9wdGlvbnNcbiAgICogc3JjOiBVUkwgZm9yIHRoZSBzY3JpcHQgdG8gYmUgbG9hZGVkXG4gICAqIHBhcmFtczogYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBnaXZlbiBVUkxcbiAgICogYXR0cmlidXRlczogdGhlIGF0dHJpYnV0ZXMgb2YgSFRNTCBzY3JpcHQgdGFnIChleGNsdWRlIHNyYylcbiAgICogY2FsbGJhY2s6IGEgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCBhZnRlciB0aGUgc2NyaXB0IGhhcyBiZWVuIGxvYWRlZFxuICAgKiBlcnJvckNhbGxiYWNrOiBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIGVycm9yIGR1cmluZyBzY3JpcHQgbG9hZGluZ1xuICAgKiBwbGFjZW1lbnQ6IEhUTUwgYm9keSBvciBoZWFkIHdoZXJlIHNjcmlwdCB3aWxsIGJlIHBsYWNlZFxuICAgKi9cbiAgcHVibGljIGVtYmVkU2NyaXB0KGVtYmVkT3B0aW9uczoge1xuICAgIHNyYzogc3RyaW5nO1xuICAgIHBhcmFtcz86IE9iamVjdDtcbiAgICBhdHRyaWJ1dGVzPzogT2JqZWN0O1xuICAgIGNhbGxiYWNrPzogRXZlbnRMaXN0ZW5lcjtcbiAgICBlcnJvckNhbGxiYWNrPzogRXZlbnRMaXN0ZW5lcjtcbiAgICBwbGFjZW1lbnQ/OiBTY3JpcHRQbGFjZW1lbnQ7XG4gIH0pOiB2b2lkIHtcbiAgICBjb25zdCB7XG4gICAgICBzcmMsXG4gICAgICBwYXJhbXMsXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBlcnJvckNhbGxiYWNrLFxuICAgICAgcGxhY2VtZW50ID0gU2NyaXB0UGxhY2VtZW50LkhFQUQsXG4gICAgfSA9IGVtYmVkT3B0aW9ucztcblxuICAgIGNvbnN0IGlzU1NSID0gaXNQbGF0Zm9ybVNlcnZlcih0aGlzLnBsYXRmb3JtSWQpO1xuICAgIGlmICgoY2FsbGJhY2sgfHwgZXJyb3JDYWxsYmFjaykgJiYgaXNTU1IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2UgPSBwYXJhbXMgPyBzcmMgKyB0aGlzLnBhcnNlUGFyYW1zKHBhcmFtcykgOiBzcmM7XG4gICAgaWYgKCFpc1NTUiAmJiB0aGlzLmhhc1NjcmlwdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NyaXB0OiBIVE1MU2NyaXB0RWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0LnNyYyA9IHNvdXJjZTtcbiAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xuICAgIHNjcmlwdC5kZWZlciA9IHRydWU7XG5cbiAgICBpZiAoYXR0cmlidXRlcykge1xuICAgICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIC8vIGN1c3RvbSBhdHRyaWJ1dGVzXG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnZGF0YS0nKSkge1xuICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoa2V5LCBhdHRyaWJ1dGVzW2tleV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjcmlwdFtrZXldID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgY2FsbGJhY2spO1xuICAgIH1cbiAgICBpZiAoZXJyb3JDYWxsYmFjaykge1xuICAgICAgc2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcGxhY2VtZW50ID09PSBTY3JpcHRQbGFjZW1lbnQuSEVBRFxuICAgICAgPyB0aGlzLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KVxuICAgICAgOiB0aGlzLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHNjcmlwdCBpcyBhbHJlYWR5IGFkZGVkIHRvIHRoZSBET00uXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFzU2NyaXB0KHNyYz86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihgc2NyaXB0W3NyYz1cIiR7c3JjfVwiXWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgZ2l2ZW4gb2JqZWN0IHdpdGggcGFyYW1ldGVycyB0byBhIHN0cmluZyBcInBhcmFtMT12YWx1ZTEmcGFyYW0yPXZhbHVlMlwiXG4gICAqIEBwYXJhbSBwYXJhbXMgb2JqZWN0IGNvbnRhaW5pbmcgcGFyYW1ldGVyc1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVBhcmFtcyhwYXJhbXM6IE9iamVjdCk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIGNvbnN0IGtleXNBcnJheSA9IE9iamVjdC5rZXlzKHBhcmFtcyk7XG4gICAgaWYgKGtleXNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICByZXN1bHQgPVxuICAgICAgICAnPycgK1xuICAgICAgICBrZXlzQXJyYXlcbiAgICAgICAgICAubWFwKChrZXkpID0+IGVuY29kZVVSSShrZXkpICsgJz0nICsgZW5jb2RlVVJJKHBhcmFtc1trZXldKSlcbiAgICAgICAgICAuam9pbignJicpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=