@spartacus/core
Version:
Spartacus - the core framework
109 lines • 12.6 kB
JavaScript
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
import { Inject, Injectable, Optional, PLATFORM_ID } from '@angular/core';
import { fromEvent, of } from 'rxjs';
import { debounceTime, distinctUntilChanged, startWith } from 'rxjs/operators';
import { SERVER_REQUEST_ORIGIN, SERVER_REQUEST_URL } from '../util/ssr.tokens';
import * as i0 from "@angular/core";
export class WindowRef {
constructor(
// https://github.com/angular/angular/issues/20351
document, platformId, serverUrl, serverOrigin) {
this.platformId = platformId;
this.serverUrl = serverUrl;
this.serverOrigin = serverOrigin;
this.document = document;
}
/**
* Returns true when invoked in browser context.
* Use this method to check if you can access `window` and other browser globals.
*/
isBrowser() {
return isPlatformBrowser(this.platformId);
}
/**
* Exposes global `window` object. In SSR when `window` is not available it returns `undefined`.
* To detect if you can safely use `nativeWindow` use `isBrowser` to check execution platform.
*/
get nativeWindow() {
// TODO(#11133): Consider throwing in SSR
return this.isBrowser() ? window : undefined;
}
/**
* Exposes global `sessionStorage` object. In SSR when `sessionStorage` is not available it returns `undefined`.
* To detect if you can safely use `sessionStorage` use `isBrowser` to check execution platform.
*/
get sessionStorage() {
return this.nativeWindow ? this.nativeWindow.sessionStorage : undefined;
}
/**
* Exposes global `localStorage` object. In SSR when `localStorage` is not available it returns `undefined`.
* To detect if you can safely use `localStorage` use `isBrowser` to check execution platform.
*/
get localStorage() {
return this.nativeWindow ? this.nativeWindow.localStorage : undefined;
}
/**
* Returns the window/document location, unless it's not available (i.e. SSR).
*
* When there's no access to the location object, we mimic the location partially, by resolving
* the request url (`SERVER_REQUEST_URL`) and origin (`SERVER_REQUEST_ORIGIN`) from the injector.
* These values are injected in the server implementation so that we can resolve some of the location
* values when we do server side rendering.
*/
get location() {
if (this.isBrowser()) {
return this.document.location;
}
else {
if (!this.serverUrl) {
throw new Error('Cannot resolve the href as the SERVER_REQUEST_URL is undefined');
}
if (!this.serverOrigin) {
throw new Error('Cannot resolve the origin as the SERVER_REQUEST_ORIGIN is undefined');
}
return {
href: this.serverUrl,
origin: this.serverOrigin,
};
}
}
/**
* Returns an observable for the window resize event and emits an event
* every 300ms in case of resizing. An event is simulated initially.
*
* If there's no window object available (i.e. in SSR), a null value is emitted.
*/
get resize$() {
if (!this.nativeWindow) {
return of(null);
}
else {
return fromEvent(this.nativeWindow, 'resize').pipe(debounceTime(300), startWith({ target: this.nativeWindow }), distinctUntilChanged());
}
}
}
WindowRef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: WindowRef, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }, { token: SERVER_REQUEST_URL, optional: true }, { token: SERVER_REQUEST_ORIGIN, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
WindowRef.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: WindowRef, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: WindowRef, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: Object, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [SERVER_REQUEST_URL]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [SERVER_REQUEST_ORIGIN]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93LXJlZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3dpbmRvdy93aW5kb3ctcmVmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxTQUFTLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBSy9FLE1BQU0sT0FBTyxTQUFTO0lBR3BCO0lBQ0Usa0RBQWtEO0lBQ2hDLFFBQWEsRUFDQSxVQUFrQixFQUNDLFNBQWtCLEVBQ2YsWUFBcUI7UUFGM0MsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNDLGNBQVMsR0FBVCxTQUFTLENBQVM7UUFDZixpQkFBWSxHQUFaLFlBQVksQ0FBUztRQUUxRSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQW9CLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVM7UUFDUCxPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxZQUFZO1FBQ2QseUNBQXlDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsSUFBSSxRQUFRO1FBQ1YsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDcEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztTQUMvQjthQUFNO1lBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ25CLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0VBQWdFLENBQ2pFLENBQUM7YUFDSDtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUN0QixNQUFNLElBQUksS0FBSyxDQUNiLHFFQUFxRSxDQUN0RSxDQUFDO2FBQ0g7WUFDRCxPQUFPO2dCQUNMLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDcEIsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZO2FBQzFCLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksT0FBTztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pCO2FBQU07WUFDTCxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDaEQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQ3hDLG9CQUFvQixFQUFFLENBQ3ZCLENBQUM7U0FDSDtJQUNILENBQUM7O3NHQTNGVSxTQUFTLGtCQUtWLFFBQVEsYUFDUixXQUFXLGFBQ0Msa0JBQWtCLDZCQUNsQixxQkFBcUI7MEdBUmhDLFNBQVMsY0FGUixNQUFNOzJGQUVQLFNBQVM7a0JBSHJCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFNSSxNQUFNOzJCQUFDLFFBQVE7OEJBQzJCLE1BQU07MEJBQWhELE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsa0JBQWtCOzswQkFDckMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFNFUlZFUl9SRVFVRVNUX09SSUdJTiwgU0VSVkVSX1JFUVVFU1RfVVJMIH0gZnJvbSAnLi4vdXRpbC9zc3IudG9rZW5zJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFdpbmRvd1JlZiB7XG4gIHJlYWRvbmx5IGRvY3VtZW50OiBEb2N1bWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8yMDM1MVxuICAgIEBJbmplY3QoRE9DVU1FTlQpIGRvY3VtZW50OiBhbnksXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJvdGVjdGVkIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNFUlZFUl9SRVFVRVNUX1VSTCkgcHJvdGVjdGVkIHNlcnZlclVybD86IHN0cmluZyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNFUlZFUl9SRVFVRVNUX09SSUdJTikgcHJvdGVjdGVkIHNlcnZlck9yaWdpbj86IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQgYXMgRG9jdW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gaW52b2tlZCBpbiBicm93c2VyIGNvbnRleHQuXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBjaGVjayBpZiB5b3UgY2FuIGFjY2VzcyBgd2luZG93YCBhbmQgb3RoZXIgYnJvd3NlciBnbG9iYWxzLlxuICAgKi9cbiAgaXNCcm93c2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZXMgZ2xvYmFsIGB3aW5kb3dgIG9iamVjdC4gSW4gU1NSIHdoZW4gYHdpbmRvd2AgaXMgbm90IGF2YWlsYWJsZSBpdCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICAgKiBUbyBkZXRlY3QgaWYgeW91IGNhbiBzYWZlbHkgdXNlIGBuYXRpdmVXaW5kb3dgIHVzZSBgaXNCcm93c2VyYCB0byBjaGVjayBleGVjdXRpb24gcGxhdGZvcm0uXG4gICAqL1xuICBnZXQgbmF0aXZlV2luZG93KCk6IFdpbmRvdyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gVE9ETygjMTExMzMpOiBDb25zaWRlciB0aHJvd2luZyBpbiBTU1JcbiAgICByZXR1cm4gdGhpcy5pc0Jyb3dzZXIoKSA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvc2VzIGdsb2JhbCBgc2Vzc2lvblN0b3JhZ2VgIG9iamVjdC4gSW4gU1NSIHdoZW4gYHNlc3Npb25TdG9yYWdlYCBpcyBub3QgYXZhaWxhYmxlIGl0IHJldHVybnMgYHVuZGVmaW5lZGAuXG4gICAqIFRvIGRldGVjdCBpZiB5b3UgY2FuIHNhZmVseSB1c2UgYHNlc3Npb25TdG9yYWdlYCB1c2UgYGlzQnJvd3NlcmAgdG8gY2hlY2sgZXhlY3V0aW9uIHBsYXRmb3JtLlxuICAgKi9cbiAgZ2V0IHNlc3Npb25TdG9yYWdlKCk6IFN0b3JhZ2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm5hdGl2ZVdpbmRvdyA/IHRoaXMubmF0aXZlV2luZG93LnNlc3Npb25TdG9yYWdlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZXMgZ2xvYmFsIGBsb2NhbFN0b3JhZ2VgIG9iamVjdC4gSW4gU1NSIHdoZW4gYGxvY2FsU3RvcmFnZWAgaXMgbm90IGF2YWlsYWJsZSBpdCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICAgKiBUbyBkZXRlY3QgaWYgeW91IGNhbiBzYWZlbHkgdXNlIGBsb2NhbFN0b3JhZ2VgIHVzZSBgaXNCcm93c2VyYCB0byBjaGVjayBleGVjdXRpb24gcGxhdGZvcm0uXG4gICAqL1xuICBnZXQgbG9jYWxTdG9yYWdlKCk6IFN0b3JhZ2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm5hdGl2ZVdpbmRvdyA/IHRoaXMubmF0aXZlV2luZG93LmxvY2FsU3RvcmFnZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB3aW5kb3cvZG9jdW1lbnQgbG9jYXRpb24sIHVubGVzcyBpdCdzIG5vdCBhdmFpbGFibGUgKGkuZS4gU1NSKS5cbiAgICpcbiAgICogV2hlbiB0aGVyZSdzIG5vIGFjY2VzcyB0byB0aGUgbG9jYXRpb24gb2JqZWN0LCB3ZSBtaW1pYyB0aGUgbG9jYXRpb24gcGFydGlhbGx5LCBieSByZXNvbHZpbmdcbiAgICogdGhlIHJlcXVlc3QgdXJsIChgU0VSVkVSX1JFUVVFU1RfVVJMYCkgYW5kIG9yaWdpbiAoYFNFUlZFUl9SRVFVRVNUX09SSUdJTmApIGZyb20gdGhlIGluamVjdG9yLlxuICAgKiBUaGVzZSB2YWx1ZXMgYXJlIGluamVjdGVkIGluIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gc28gdGhhdCB3ZSBjYW4gcmVzb2x2ZSBzb21lIG9mIHRoZSBsb2NhdGlvblxuICAgKiB2YWx1ZXMgd2hlbiB3ZSBkbyBzZXJ2ZXIgc2lkZSByZW5kZXJpbmcuXG4gICAqL1xuICBnZXQgbG9jYXRpb24oKTogUGFydGlhbDxMb2NhdGlvbj4ge1xuICAgIGlmICh0aGlzLmlzQnJvd3NlcigpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5sb2NhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLnNlcnZlclVybCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0Nhbm5vdCByZXNvbHZlIHRoZSBocmVmIGFzIHRoZSBTRVJWRVJfUkVRVUVTVF9VUkwgaXMgdW5kZWZpbmVkJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnNlcnZlck9yaWdpbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0Nhbm5vdCByZXNvbHZlIHRoZSBvcmlnaW4gYXMgdGhlIFNFUlZFUl9SRVFVRVNUX09SSUdJTiBpcyB1bmRlZmluZWQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBocmVmOiB0aGlzLnNlcnZlclVybCxcbiAgICAgICAgb3JpZ2luOiB0aGlzLnNlcnZlck9yaWdpbixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBmb3IgdGhlIHdpbmRvdyByZXNpemUgZXZlbnQgYW5kIGVtaXRzIGFuIGV2ZW50XG4gICAqIGV2ZXJ5IDMwMG1zIGluIGNhc2Ugb2YgcmVzaXppbmcuIEFuIGV2ZW50IGlzIHNpbXVsYXRlZCBpbml0aWFsbHkuXG4gICAqXG4gICAqIElmIHRoZXJlJ3Mgbm8gd2luZG93IG9iamVjdCBhdmFpbGFibGUgKGkuZS4gaW4gU1NSKSwgYSBudWxsIHZhbHVlIGlzIGVtaXR0ZWQuXG4gICAqL1xuICBnZXQgcmVzaXplJCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICghdGhpcy5uYXRpdmVXaW5kb3cpIHtcbiAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZyb21FdmVudCh0aGlzLm5hdGl2ZVdpbmRvdywgJ3Jlc2l6ZScpLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICBzdGFydFdpdGgoeyB0YXJnZXQ6IHRoaXMubmF0aXZlV2luZG93IH0pLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19