UNPKG

@spartacus/core

Version:

Spartacus - the core framework

97 lines 11.2 kB
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&param2=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=