node-browser-environment
Version:
Simulates a global browser environment using jsdom
78 lines (61 loc) • 2.36 kB
JavaScript
;
var _jsdom = require('jsdom');
var _jsdom2 = _interopRequireDefault(_jsdom);
var _clone = require('clone');
var _clone2 = _interopRequireDefault(_clone);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Default jsdom config.
// These settings must override any custom settings to make sure we can iterate
// over the window object.
var defaultJsdomConfig = {
features: {
FetchExternalResources: false,
ProcessExternalResources: false
}
};
// Function to return a window object.
// Accepts a jsdom config object that will be merged with the default options.
// Config object must be cloned before passing through otherwise jsdom will add
// lots of properties to the original reference.
var createWindow = function createWindow(userJsdomConfig) {
var jsdomConfig = Object.assign({}, userJsdomConfig, defaultJsdomConfig);
return _jsdom2.default.jsdom('<html><body></body></html>', (0, _clone2.default)(jsdomConfig)).defaultView;
};
// IIFE executed on import to return an array of global node properties that
// conflict with global browser properties.
var protectedproperties = function () {
return Object.getOwnPropertyNames(createWindow()).filter(function (prop) {
return typeof global[prop] !== 'undefined';
});
}();
// Sets up global browser environment
module.exports = function () {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
// Extract options from args
var properties = args.filter(function (arg) {
return Array.isArray(arg);
})[0];
var userJsdomConfig = args.filter(function (arg) {
return !Array.isArray(arg);
})[0];
// Create window object
var window = createWindow(userJsdomConfig);
// Get all global browser properties
Object.getOwnPropertyNames(window)
// Remove protected properties
.filter(function (prop) {
return protectedproperties.indexOf(prop) === -1;
})
// If we're only applying specific required properties remove everything else
.filter(function (prop) {
return !(properties && properties.indexOf(prop) === -1);
})
// Copy what's left to node's global scope
.forEach(function (prop) {
return global[prop] = window[prop];
});
// Return reference to original window object
return window;
};