UNPKG

node-browser-environment

Version:

Simulates a global browser environment using jsdom

78 lines (61 loc) 2.36 kB
'use strict'; 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; };