146 lines
2.7 KiB
JavaScript
Executable File
146 lines
2.7 KiB
JavaScript
Executable File
/**
|
|
* SSR Window 4.0.2
|
|
* Better handling for window object in SSR environment
|
|
* https://github.com/nolimits4web/ssr-window
|
|
*
|
|
* Copyright 2021, Vladimir Kharlampidi
|
|
*
|
|
* Licensed under MIT
|
|
*
|
|
* Released on: December 13, 2021
|
|
*/
|
|
/* eslint-disable no-param-reassign */
|
|
function isObject(obj) {
|
|
return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object;
|
|
}
|
|
function extend(target, src) {
|
|
if (target === void 0) {
|
|
target = {};
|
|
}
|
|
if (src === void 0) {
|
|
src = {};
|
|
}
|
|
Object.keys(src).forEach(key => {
|
|
if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {
|
|
extend(target[key], src[key]);
|
|
}
|
|
});
|
|
}
|
|
const ssrDocument = {
|
|
body: {},
|
|
addEventListener() {},
|
|
removeEventListener() {},
|
|
activeElement: {
|
|
blur() {},
|
|
nodeName: ''
|
|
},
|
|
querySelector() {
|
|
return null;
|
|
},
|
|
querySelectorAll() {
|
|
return [];
|
|
},
|
|
getElementById() {
|
|
return null;
|
|
},
|
|
createEvent() {
|
|
return {
|
|
initEvent() {}
|
|
};
|
|
},
|
|
createElement() {
|
|
return {
|
|
children: [],
|
|
childNodes: [],
|
|
style: {},
|
|
setAttribute() {},
|
|
getElementsByTagName() {
|
|
return [];
|
|
}
|
|
};
|
|
},
|
|
createElementNS() {
|
|
return {};
|
|
},
|
|
importNode() {
|
|
return null;
|
|
},
|
|
location: {
|
|
hash: '',
|
|
host: '',
|
|
hostname: '',
|
|
href: '',
|
|
origin: '',
|
|
pathname: '',
|
|
protocol: '',
|
|
search: ''
|
|
}
|
|
};
|
|
function getDocument() {
|
|
const doc = typeof document !== 'undefined' ? document : {};
|
|
extend(doc, ssrDocument);
|
|
return doc;
|
|
}
|
|
const ssrWindow = {
|
|
document: ssrDocument,
|
|
navigator: {
|
|
userAgent: ''
|
|
},
|
|
location: {
|
|
hash: '',
|
|
host: '',
|
|
hostname: '',
|
|
href: '',
|
|
origin: '',
|
|
pathname: '',
|
|
protocol: '',
|
|
search: ''
|
|
},
|
|
history: {
|
|
replaceState() {},
|
|
pushState() {},
|
|
go() {},
|
|
back() {}
|
|
},
|
|
CustomEvent: function CustomEvent() {
|
|
return this;
|
|
},
|
|
addEventListener() {},
|
|
removeEventListener() {},
|
|
getComputedStyle() {
|
|
return {
|
|
getPropertyValue() {
|
|
return '';
|
|
}
|
|
};
|
|
},
|
|
Image() {},
|
|
Date() {},
|
|
screen: {},
|
|
setTimeout() {},
|
|
clearTimeout() {},
|
|
matchMedia() {
|
|
return {};
|
|
},
|
|
requestAnimationFrame(callback) {
|
|
if (typeof setTimeout === 'undefined') {
|
|
callback();
|
|
return null;
|
|
}
|
|
return setTimeout(callback, 0);
|
|
},
|
|
cancelAnimationFrame(id) {
|
|
if (typeof setTimeout === 'undefined') {
|
|
return;
|
|
}
|
|
clearTimeout(id);
|
|
}
|
|
};
|
|
function getWindow() {
|
|
const win = typeof window !== 'undefined' ? window : {};
|
|
extend(win, ssrWindow);
|
|
return win;
|
|
}
|
|
|
|
export { getWindow as a, getDocument as g };
|