diff --git a/.gitignore b/.gitignore index 1ebb1a4f..eff12380 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ __coverage__ -dist node_modules \ No newline at end of file diff --git a/__tests__/server/__snapshots__/renderer.jsx.snap b/__tests__/server/__snapshots__/renderer.jsx.snap index bc0a17ec..9b704b4f 100644 --- a/__tests__/server/__snapshots__/renderer.jsx.snap +++ b/__tests__/server/__snapshots__/renderer.jsx.snap @@ -2,12 +2,15 @@ exports[`Base rendering of HTML template 1`] = ` " - + + + @@ -27,11 +30,13 @@ exports[`Base rendering of HTML template 1`] = ` @@ -40,12 +45,15 @@ exports[`Base rendering of HTML template 1`] = ` exports[`Config overriding for injection 1`] = ` " - + + + @@ -65,11 +73,13 @@ exports[`Config overriding for injection 1`] = ` @@ -78,12 +88,15 @@ exports[`Config overriding for injection 1`] = ` exports[`Hemlet integration works 1`] = ` " - + Test Page Title + + @@ -103,11 +116,13 @@ exports[`Hemlet integration works 1`] = ` @@ -116,12 +131,15 @@ exports[`Hemlet integration works 1`] = ` exports[`Injection of additional JS scripts 1`] = ` " - + + + @@ -141,11 +159,13 @@ exports[`Injection of additional JS scripts 1`] = ` @@ -154,16 +174,19 @@ exports[`Injection of additional JS scripts 1`] = ` exports[`Server-side rendering (SSR); injection of CSS chunks & Redux state 1`] = ` " - + + + - + @@ -193,12 +218,15 @@ exports[`Server-side rendering (SSR); injection of CSS chunks & Redux state 1`] exports[`Setting of response HTTP status the server-side rendering 1`] = ` "HTTP STATUS: 404 - + + + @@ -218,11 +246,13 @@ exports[`Setting of response HTTP status the server-side rendering 1`] = ` diff --git a/__tests__/shared/components/Modal.jsx b/__tests__/shared/components/Modal.jsx new file mode 100644 index 00000000..8039b6b7 --- /dev/null +++ b/__tests__/shared/components/Modal.jsx @@ -0,0 +1,49 @@ +import Modal, { BaseModal } from 'components/Modal'; +import React from 'react'; +import ReactDom from 'react-dom'; +import { + findInDomByClass, + renderDom, + simulate, + snapshot, +} from 'utils/jest'; + +beforeAll(() => { + /* Modal uses ReactJS portals to ensure proper rendering. react-test-renderer, + * used by utils/jest under the hood, does not support it properly, thus this + * simple mock for the createPortal(..) function. */ + ReactDom.createPortal = jest.fn(element => ( +
+ {element} +
+ )); +}); + +test('Snapshot match', () => { + snapshot(CONTENT); +}); + +test('onCancel', () => { + const onCancel = jest.fn(); + const dom = renderDom(( + + )); + const overlay = findInDomByClass(dom, 'overlay'); + simulate.click(overlay); + expect(onCancel).toHaveBeenCalled(); +}); + +test('onWheel', () => { + const dom = renderDom(( + + )); + const container = findInDomByClass(dom, 'container'); + const stopPropagation = jest.fn(); + simulate.wheel(container, { stopPropagation }); + expect(stopPropagation).toHaveBeenCalled(); +}); diff --git a/__tests__/shared/components/__snapshots__/Modal.jsx.snap b/__tests__/shared/components/__snapshots__/Modal.jsx.snap new file mode 100644 index 00000000..9cbf3aa4 --- /dev/null +++ b/__tests__/shared/components/__snapshots__/Modal.jsx.snap @@ -0,0 +1,19 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Snapshot match 1`] = ` +
+
+ CONTENT +
+
+`; diff --git a/config/webpack/app-base.js b/config/webpack/app-base.js index da8d8f15..5280bfdf 100644 --- a/config/webpack/app-base.js +++ b/config/webpack/app-base.js @@ -73,6 +73,10 @@ module.exports = function configFactory(ops) { /* Build timestamp. */ timestamp: now.utc().toISOString(), + + ...(o.crossOriginLoading ? { + crossOriginLoading: o.crossOriginLoading, + } : {}), }; fs.writeFileSync(buildInfoUrl, JSON.stringify(buildInfo)); } @@ -103,6 +107,9 @@ module.exports = function configFactory(ops) { filename: `[name]-${now.valueOf()}.js`, path: path.resolve(__dirname, o.context, 'build'), publicPath: `${o.publicPath}/`, + ...(o.crossOriginLoading ? { + crossOriginLoading: o.crossOriginLoading, + } : {}), }, plugins: [ new MiniCssExtractPlugin({ diff --git a/dist/dev/client/init.js b/dist/dev/client/init.js new file mode 100644 index 00000000..4ad48938 --- /dev/null +++ b/dist/dev/client/init.js @@ -0,0 +1,32 @@ +'use strict'; + +var _nodeForge = require('node-forge'); + +var _nodeForge2 = _interopRequireDefault(_nodeForge); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +window.TRU_BUILD_INFO = BUILD_INFO; /** + * Initialization of client-side environment. + */ + +/* global BUILD_INFO, document, window */ + +window.TRU_FRONT_END = true; + +/* Removes data injection script out of the document. */ +var block = document.querySelector('script[id="inj"]'); +document.getElementsByTagName('body')[0].removeChild(block); + +/* Decodes data injected at the server side. */ +var key = window.TRU_BUILD_INFO.key; + +var data = _nodeForge2.default.util.decode64(window.INJ); +var decipher = _nodeForge2.default.cipher.createDecipher('AES-CBC', key); +decipher.start({ iv: data.slice(0, 32) }); +decipher.update(_nodeForge2.default.util.createBuffer(data.slice(32))); +decipher.finish(); +data = JSON.parse(_nodeForge2.default.util.decodeUtf8(decipher.output.data)); + +window.CONFIG = data.CONFIG; +window.ISTATE = data.ISTATE; diff --git a/dist/dev/index.js b/dist/dev/index.js new file mode 100644 index 00000000..a950262a --- /dev/null +++ b/dist/dev/index.js @@ -0,0 +1,784 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("babel-runtime/core-js/object/assign"), require("babel-runtime/core-js/object/get-prototype-of"), require("babel-runtime/core-js/object/keys"), require("babel-runtime/core-js/promise"), require("babel-runtime/helpers/asyncToGenerator"), require("babel-runtime/helpers/classCallCheck"), require("babel-runtime/helpers/createClass"), require("babel-runtime/helpers/defineProperty"), require("babel-runtime/helpers/extends"), require("babel-runtime/helpers/inherits"), require("babel-runtime/helpers/possibleConstructorReturn"), require("babel-runtime/regenerator"), require("lodash"), require("moment"), require("prop-types"), require("react"), require("react-css-super-themr"), require("react-dom"), require("react-dom/server"), require("react-helmet"), require("react-hot-loader"), require("react-redux"), require("react-router-dom"), require("redux"), require("redux-actions"), require("redux-devtools"), require("redux-devtools-dock-monitor"), require("redux-devtools-log-monitor"), require("redux-promise"), require("shortid")); + else if(typeof define === 'function' && define.amd) + define(["babel-runtime/core-js/object/assign", "babel-runtime/core-js/object/get-prototype-of", "babel-runtime/core-js/object/keys", "babel-runtime/core-js/promise", "babel-runtime/helpers/asyncToGenerator", "babel-runtime/helpers/classCallCheck", "babel-runtime/helpers/createClass", "babel-runtime/helpers/defineProperty", "babel-runtime/helpers/extends", "babel-runtime/helpers/inherits", "babel-runtime/helpers/possibleConstructorReturn", "babel-runtime/regenerator", "lodash", "moment", "prop-types", "react", "react-css-super-themr", "react-dom", "react-dom/server", "react-helmet", "react-hot-loader", "react-redux", "react-router-dom", "redux", "redux-actions", "redux-devtools", "redux-devtools-dock-monitor", "redux-devtools-log-monitor", "redux-promise", "shortid"], factory); + else if(typeof exports === 'object') + exports["topcoder-react-utils"] = factory(require("babel-runtime/core-js/object/assign"), require("babel-runtime/core-js/object/get-prototype-of"), require("babel-runtime/core-js/object/keys"), require("babel-runtime/core-js/promise"), require("babel-runtime/helpers/asyncToGenerator"), require("babel-runtime/helpers/classCallCheck"), require("babel-runtime/helpers/createClass"), require("babel-runtime/helpers/defineProperty"), require("babel-runtime/helpers/extends"), require("babel-runtime/helpers/inherits"), require("babel-runtime/helpers/possibleConstructorReturn"), require("babel-runtime/regenerator"), require("lodash"), require("moment"), require("prop-types"), require("react"), require("react-css-super-themr"), require("react-dom"), require("react-dom/server"), require("react-helmet"), require("react-hot-loader"), require("react-redux"), require("react-router-dom"), require("redux"), require("redux-actions"), require("redux-devtools"), require("redux-devtools-dock-monitor"), require("redux-devtools-log-monitor"), require("redux-promise"), require("shortid")); + else + root["topcoder-react-utils"] = factory(root["babel-runtime/core-js/object/assign"], root["babel-runtime/core-js/object/get-prototype-of"], root["babel-runtime/core-js/object/keys"], root["babel-runtime/core-js/promise"], root["babel-runtime/helpers/asyncToGenerator"], root["babel-runtime/helpers/classCallCheck"], root["babel-runtime/helpers/createClass"], root["babel-runtime/helpers/defineProperty"], root["babel-runtime/helpers/extends"], root["babel-runtime/helpers/inherits"], root["babel-runtime/helpers/possibleConstructorReturn"], root["babel-runtime/regenerator"], root["lodash"], root["moment"], root["prop-types"], root["react"], root["react-css-super-themr"], root["react-dom"], root["react-dom/server"], root["react-helmet"], root["react-hot-loader"], root["react-redux"], root["react-router-dom"], root["redux"], root["redux-actions"], root["redux-devtools"], root["redux-devtools-dock-monitor"], root["redux-devtools-log-monitor"], root["redux-promise"], root["shortid"]); +})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_babel_runtime_core_js_object_assign__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_core_js_object_get_prototype_of__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_core_js_object_keys__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_core_js_promise__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_helpers_asyncToGenerator__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_helpers_classCallCheck__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_helpers_createClass__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_helpers_defineProperty__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_helpers_extends__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_helpers_inherits__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_helpers_possibleConstructorReturn__, __WEBPACK_EXTERNAL_MODULE_babel_runtime_regenerator__, __WEBPACK_EXTERNAL_MODULE_lodash__, __WEBPACK_EXTERNAL_MODULE_moment__, __WEBPACK_EXTERNAL_MODULE_prop_types__, __WEBPACK_EXTERNAL_MODULE_react__, __WEBPACK_EXTERNAL_MODULE_react_css_super_themr__, __WEBPACK_EXTERNAL_MODULE_react_dom__, __WEBPACK_EXTERNAL_MODULE_react_dom_server__, __WEBPACK_EXTERNAL_MODULE_react_helmet__, __WEBPACK_EXTERNAL_MODULE_react_hot_loader__, __WEBPACK_EXTERNAL_MODULE_react_redux__, __WEBPACK_EXTERNAL_MODULE_react_router_dom__, __WEBPACK_EXTERNAL_MODULE_redux__, __WEBPACK_EXTERNAL_MODULE_redux_actions__, __WEBPACK_EXTERNAL_MODULE_redux_devtools__, __WEBPACK_EXTERNAL_MODULE_redux_devtools_dock_monitor__, __WEBPACK_EXTERNAL_MODULE_redux_devtools_log_monitor__, __WEBPACK_EXTERNAL_MODULE_redux_promise__, __WEBPACK_EXTERNAL_MODULE_shortid__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/index.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./node_modules/webpack/buildin/global.js": +/*!***********************************!*\ + !*** (webpack)/buildin/global.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1, eval)(\"this\");\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n//# sourceURL=webpack://topcoder-react-utils/(webpack)/buildin/global.js?"); + +/***/ }), + +/***/ "./node_modules/webpack/buildin/module.js": +/*!***********************************!*\ + !*** (webpack)/buildin/module.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n\n\n//# sourceURL=webpack://topcoder-react-utils/(webpack)/buildin/module.js?"); + +/***/ }), + +/***/ "./src/client/index.jsx": +/*!******************************!*\ + !*** ./src/client/index.jsx ***! + \******************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _react = __webpack_require__(/*! react */ \"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = __webpack_require__(/*! react-dom */ \"react-dom\");\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _shortid = __webpack_require__(/*! shortid */ \"shortid\");\n\nvar _shortid2 = _interopRequireDefault(_shortid);\n\nvar _reactRedux = __webpack_require__(/*! react-redux */ \"react-redux\");\n\nvar _reactRouterDom = __webpack_require__(/*! react-router-dom */ \"react-router-dom\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n var enterModule = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").enterModule;\n\n enterModule && enterModule(module);\n})(); /**\n * Initialization of client-side code.\n */\n\n/* global document window */\n\n/**\n * Renders given application into DOM, providing it with Redux store, if given.\n * @param {Function} Application Root ReactJS component of the app.\n * @param {Object} store Optional. Redux store.\n */\nfunction render(Application, store) {\n var app = _react2.default.createElement(\n _reactRouterDom.BrowserRouter,\n null,\n _react2.default.createElement(Application, null)\n );\n if (store) {\n app = _react2.default.createElement(\n _reactRedux.Provider,\n { store: store },\n app\n );\n }\n _reactDom2.default.hydrate(app, document.getElementById('react-view'));\n}\n\n/**\n * Initializes the code at client side. It takes care about receiving the data\n * injected at the server-side, and also about setting up client side of hot\n * module reloading (HMR).\n * @param {String} applicationModulePath Optional.\n * @param {Function} getApplication\n * @param {Object} moduleHot\n * @param {Function} storeFactory Optional.\n */\n\nexports.default = function () {\n var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(_ref2) {\n var applicationModulePath = _ref2.applicationModulePath,\n getApplication = _ref2.getApplication,\n moduleHot = _ref2.moduleHot,\n storeFactory = _ref2.storeFactory;\n var store;\n return _regenerator2.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n store = void 0;\n\n if (!storeFactory) {\n _context.next = 5;\n break;\n }\n\n _context.next = 4;\n return storeFactory(window.ISTATE);\n\n case 4:\n store = _context.sent;\n\n case 5:\n render(getApplication(), store);\n\n if (moduleHot && applicationModulePath) {\n moduleHot.accept(applicationModulePath, function () {\n return render(getApplication(), store);\n });\n\n /* HMR of CSS code each time webpack hot middleware updates the code. */\n moduleHot.addStatusHandler(function (status) {\n if (status !== 'ready') return;\n var stamp = (0, _shortid2.default)();\n var links = document.querySelectorAll('link[rel=stylesheet][id=\"tru-style\"]');\n for (var i = 0; i < links.length; i += 1) {\n links[i].href = links[i].href.match(/[^?]*/) + '?v=' + stamp;\n }\n });\n }\n\n case 7:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function Launch(_x) {\n return _ref.apply(this, arguments);\n }\n\n return Launch;\n}();\n\n;\n\n(function () {\n var reactHotLoader = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").default;\n\n var leaveModule = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").leaveModule;\n\n if (!reactHotLoader) {\n return;\n }\n\n reactHotLoader.register(render, 'render', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/client/index.jsx');\n leaveModule(module);\n})();\n\n;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-utils/./src/client/index.jsx?"); + +/***/ }), + +/***/ "./src/index.js": +/*!**********************!*\ + !*** ./src/index.js ***! + \**********************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\n__webpack_require__(/*! ./styles/global.scss */ \"./src/styles/global.scss\");\n\nvar _actions = __webpack_require__(/*! ./shared/actions */ \"./src/shared/actions/index.js\");\n\nvar _actions2 = _interopRequireDefault(_actions);\n\nvar _AppChunk = __webpack_require__(/*! ./shared/containers/AppChunk */ \"./src/shared/containers/AppChunk/index.jsx\");\n\nvar _AppChunk2 = _interopRequireDefault(_AppChunk);\n\nvar _Avatar = __webpack_require__(/*! ./shared/components/Avatar */ \"./src/shared/components/Avatar.jsx\");\n\nvar _Avatar2 = _interopRequireDefault(_Avatar);\n\nvar _Button = __webpack_require__(/*! ./shared/components/Button */ \"./src/shared/components/Button.jsx\");\n\nvar _Button2 = _interopRequireDefault(_Button);\n\nvar _client = __webpack_require__(/*! ./client */ \"./src/client/index.jsx\");\n\nvar _client2 = _interopRequireDefault(_client);\n\nvar _DevTools = __webpack_require__(/*! ./shared/components/DevTools */ \"./src/shared/components/DevTools.jsx\");\n\nvar _DevTools2 = _interopRequireDefault(_DevTools);\n\nvar _Link = __webpack_require__(/*! ./shared/components/Link */ \"./src/shared/components/Link.jsx\");\n\nvar _Link2 = _interopRequireDefault(_Link);\n\nvar _MetaTags = __webpack_require__(/*! ./shared/components/MetaTags */ \"./src/shared/components/MetaTags.jsx\");\n\nvar _MetaTags2 = _interopRequireDefault(_MetaTags);\n\nvar _Modal = __webpack_require__(/*! ./shared/components/Modal */ \"./src/shared/components/Modal/index.jsx\");\n\nvar _Modal2 = _interopRequireDefault(_Modal);\n\nvar _NavLink = __webpack_require__(/*! ./shared/components/NavLink */ \"./src/shared/components/NavLink.jsx\");\n\nvar _NavLink2 = _interopRequireDefault(_NavLink);\n\nvar _reducers = __webpack_require__(/*! ./shared/reducers */ \"./src/shared/reducers/index.js\");\n\nvar _reducers2 = _interopRequireDefault(_reducers);\n\nvar _ScalableRect = __webpack_require__(/*! ./shared/components/ScalableRect */ \"./src/shared/components/ScalableRect/index.jsx\");\n\nvar _ScalableRect2 = _interopRequireDefault(_ScalableRect);\n\nvar _utils = __webpack_require__(/*! ./shared/utils */ \"./src/shared/utils/index.js\");\n\nvar utils = _interopRequireWildcard(_utils);\n\nvar _isomorphy = __webpack_require__(/*! ./shared/utils/isomorphy */ \"./src/shared/utils/isomorphy.js\");\n\nvar _webpack = __webpack_require__(/*! ./shared/utils/webpack */ \"./src/shared/utils/webpack/index.js\");\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n var enterModule = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").enterModule;\n\n enterModule && enterModule(module);\n})();\n\nvar serverUrl = (0, _isomorphy.isProdBuild)() ? 'prod' : 'dev';\nserverUrl = 'topcoder-react-utils/dist/' + serverUrl + '/server';\nvar server = utils.isomorphy.isServerSide() ? (0, _webpack.requireWeak)(serverUrl) : null;\n\nmodule.exports = (0, _extends3.default)({\n actions: _actions2.default,\n AppChunk: _AppChunk2.default,\n Avatar: _Avatar2.default,\n BaseModal: _Modal.BaseModal,\n Button: _Button2.default,\n client: _client2.default,\n DevTools: _DevTools2.default,\n Link: _Link2.default,\n NavLink: _NavLink2.default,\n MetaTags: _MetaTags2.default,\n Modal: _Modal2.default,\n ScalableRect: _ScalableRect2.default,\n reducers: _reducers2.default,\n server: server\n}, utils);\n;\n\n(function () {\n var reactHotLoader = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").default;\n\n var leaveModule = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").leaveModule;\n\n if (!reactHotLoader) {\n return;\n }\n\n reactHotLoader.register(serverUrl, 'serverUrl', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/index.js');\n reactHotLoader.register(server, 'server', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/index.js');\n leaveModule(module);\n})();\n\n;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-utils/./src/index.js?"); + +/***/ }), + +/***/ "./src/shared/actions/collection.js": +/*!******************************************!*\ + !*** ./src/shared/actions/collection.js ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _redux = __webpack_require__(/*! ../utils/redux */ \"./src/shared/utils/redux.js\");\n\nvar redux = _interopRequireWildcard(_redux);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n var enterModule = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").enterModule;\n\n enterModule && enterModule(module);\n})(); /**\n * @module \"actions.collection\"\n * @desc Actions for management of *Collection* segment of Redux store.\n */\n\n/**\n * @static\n * @desc Creates an action that adds items to the collection.\n * @param {Object} index The index of items to add. It is a JS object with\n * ID-to-item mapping. Each item will be added to the collection under the\n * specified index.\n * @return {Action}\n */\nfunction addItems(index) {\n return { index: index, timestamp: Date.now() };\n}\n\n/**\n * @static\n * @desc Creates an action that increments reference counters of the specified\n * items.\n * @param {String|String[]} ids Item ID, or an array of IDs.\n * @param {Number} factor=1 Optional. The increment value.\n * @return {Action}\n */\nfunction bookItems(ids) {\n var factor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n return { factor: factor, ids: _lodash2.default.isArray(ids) ? ids : [ids] };\n}\n\n/**\n * @static\n * @desc Creates an action that removes from the collection all items that\n * (i) are not used (i.e. their reference counters equal to zero); (ii) were\n * added to the collection before the specified `timestamp`.\n * @param {Number} timestamp=Number.MAX_VALUE The minimal timestamp value of\n * items that should be kept in the collection even if they are not currently\n * used.\n * @return {Action}\n */\nfunction clean() {\n var timestamp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Number.MAX_VALUE;\n\n return timestamp;\n}\n\n/**\n * @static\n * @desc Creates an action that decrements reference counters of the specified\n * collection items.\n * @param {String|String[]} ids Item ID, or an array of IDs.\n * @param {Number} factor=1 Optional. Decrement value.\n * @return {Action}\n */\nfunction freeItems(ids) {\n var factor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n return { factor: factor, ids: _lodash2.default.isArray(ids) ? ids : [ids] };\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of an async loading of the\n * specified item.\n * @param {String} operationId Operation UUID, to match with the corresponding\n * {@link module:actions.collection.loadItemDone} action.\n * @param {String} itemId Item ID.\n * @return {Action}\n */\nfunction loadItemInit(operationId, itemId) {\n return { itemId: itemId, operationId: operationId };\n}\n\n/**\n * @static\n * @desc Creates an action that finalizes an async loading of the specified\n * item.\n * @param {String} operationId Operation UUID, to match with the corresponding\n * {@link module:actions.collection.loadItemDone} action.\n * @param {String} itemId Item ID.\n * @param {Any} item The loaded item, to be added into the collection.\n * @return {Action}\n */\nfunction loadItemDone(operationId, itemId, item) {\n return {\n item: item,\n itemId: itemId,\n operationId: operationId,\n timestamp: Date.now()\n };\n}\n\nvar _default = redux.createActions({\n COLLECTION: {\n ADD_ITEMS: addItems,\n BOOK_ITEMS: bookItems,\n CLEAN: clean,\n FREE_ITEMS: freeItems,\n LOAD_ITEM_INIT: loadItemInit,\n LOAD_ITEM_DONE: loadItemDone\n }\n});\n\nexports.default = _default;\n;\n\n(function () {\n var reactHotLoader = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").default;\n\n var leaveModule = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").leaveModule;\n\n if (!reactHotLoader) {\n return;\n }\n\n reactHotLoader.register(addItems, 'addItems', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/actions/collection.js');\n reactHotLoader.register(bookItems, 'bookItems', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/actions/collection.js');\n reactHotLoader.register(clean, 'clean', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/actions/collection.js');\n reactHotLoader.register(freeItems, 'freeItems', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/actions/collection.js');\n reactHotLoader.register(loadItemInit, 'loadItemInit', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/actions/collection.js');\n reactHotLoader.register(loadItemDone, 'loadItemDone', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/actions/collection.js');\n reactHotLoader.register(_default, 'default', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/actions/collection.js');\n leaveModule(module);\n})();\n\n;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-utils/./src/shared/actions/collection.js?"); + +/***/ }), + +/***/ "./src/shared/actions/index.js": +/*!*************************************!*\ + !*** ./src/shared/actions/index.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nvar _collection = __webpack_require__(/*! ./collection */ \"./src/shared/actions/collection.js\");\n\nvar _collection2 = _interopRequireDefault(_collection);\n\nvar _item = __webpack_require__(/*! ./item */ \"./src/shared/actions/item.js\");\n\nvar _item2 = _interopRequireDefault(_item);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n var enterModule = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").enterModule;\n\n enterModule && enterModule(module);\n})();\n\nvar _default = (0, _extends3.default)({}, _collection2.default, _item2.default);\n\nexports.default = _default;\n;\n\n(function () {\n var reactHotLoader = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").default;\n\n var leaveModule = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").leaveModule;\n\n if (!reactHotLoader) {\n return;\n }\n\n reactHotLoader.register(_default, 'default', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/actions/index.js');\n leaveModule(module);\n})();\n\n;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-utils/./src/shared/actions/index.js?"); + +/***/ }), + +/***/ "./src/shared/actions/item.js": +/*!************************************!*\ + !*** ./src/shared/actions/item.js ***! + \************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _redux = __webpack_require__(/*! ../utils/redux */ \"./src/shared/utils/redux.js\");\n\nvar redux = _interopRequireWildcard(_redux);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n(function () {\n var enterModule = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").enterModule;\n\n enterModule && enterModule(module);\n})(); /**\n * @module \"actions.item\"\n * @desc Actions for management of item data in Redux store.\n */\n\n/**\n * @static\n * @desc Creates an action that drops item's data if (i) the value of item's\n * reference counter is not positive; (ii) item's timestamp is older than\n * `olderThan` value.\n * @param {Number} olderThan=Number.MAX_VALUE Optional. Timestamp [ms].\n * If provided, item's data will be dropped only if they were received / set\n * prior to this moment in time.\n * @return {Action}\n */\nfunction dropData() {\n var olderThan = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Number.MAX_VALUE;\n\n return olderThan;\n}\n\n/**\n * @static\n * @desc Creates an action that signals the beginning of async loading of\n * item's data.\n * @param {Number|String} loadingOperationId The unique identifier of the\n * loading operation. It will be written into item's segment of Redux store\n * with the following efffects:\n *\n * - We consider that item's data are being loaded if, and only if,\n * the item's `loadingOperationId` has a truly value;\n *\n * - `loadingOperationId` is used to match the corresponding\n * {@link module:actions.item.loadDataDone} operation.\n *\n * @return {Action}\n */\nfunction loadDataInit(loadingOperationId) {\n return loadingOperationId;\n}\n\n/**\n * @static\n * @desc Creates an action that handles the result of async loading of item's\n * data.\n * @param {Number|String} loadingOperationId The unique identifier of the\n * loading operation. If it does not match the value currently written for\n * the item in the Redux store (see {@link module:actions.item.loadDataInit}),\n * the action will be silently ignored.\n * @param {Any} data Any value to store as the item's data.\n * @return {Action}\n */\nfunction loadDataDone(loadingOperationId, data) {\n return { data: data, loadingOperationId: loadingOperationId, timestamp: Date.now() };\n}\n\n/**\n * @static\n * @desc Creates an action that stores given data into the item.\n * @param {Any} data Any value to store as the item's data.\n * @return {Action}\n */\nfunction setData(data) {\n return { data: data, timestamp: Date.now() };\n}\n\n/**\n * @static\n * @desc Creates an action that updates the item's reference counter.\n * @param {Number} shift The value to add to the item's reference counter.\n * Should be `1` or `-1` in majority of cases, although any other values\n * are permitted.\n * @return {Action}\n */\nfunction updateReferenceCounter(shift) {\n return shift;\n}\n\nvar _default = redux.createActions({\n ITEM: {\n DROP_DATA: dropData,\n LOAD_DATA_INIT: loadDataInit,\n LOAD_DATA_DONE: loadDataDone,\n SET_DATA: setData,\n UPDATE_REFERENCE_COUNTER: updateReferenceCounter\n }\n});\n\nexports.default = _default;\n;\n\n(function () {\n var reactHotLoader = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").default;\n\n var leaveModule = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").leaveModule;\n\n if (!reactHotLoader) {\n return;\n }\n\n reactHotLoader.register(dropData, 'dropData', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/actions/item.js');\n reactHotLoader.register(loadDataInit, 'loadDataInit', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/actions/item.js');\n reactHotLoader.register(loadDataDone, 'loadDataDone', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/actions/item.js');\n reactHotLoader.register(setData, 'setData', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/actions/item.js');\n reactHotLoader.register(updateReferenceCounter, 'updateReferenceCounter', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/actions/item.js');\n reactHotLoader.register(_default, 'default', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/actions/item.js');\n leaveModule(module);\n})();\n\n;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-utils/./src/shared/actions/item.js?"); + +/***/ }), + +/***/ "./src/shared/components/Avatar.jsx": +/*!******************************************!*\ + !*** ./src/shared/components/Avatar.jsx ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = Avatar;\n\nvar _propTypes = __webpack_require__(/*! prop-types */ \"prop-types\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _react = __webpack_require__(/*! react */ \"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n var enterModule = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").enterModule;\n\n enterModule && enterModule(module);\n})(); /**\n * The standard Avatar component.\n * To use it you will have to properly wrap it with react-css-super-themr,\n * the component provided here takes care about the code interface and logic\n * only.\n */\n\nfunction Avatar(_ref) {\n var DefaultAvatar = _ref.DefaultAvatar,\n theme = _ref.theme,\n url = _ref.url;\n\n return url ? _react2.default.createElement('img', { alt: 'Avatar', src: url, className: theme.avatar }) : _react2.default.createElement(DefaultAvatar, { className: theme.avatar });\n}\n\nAvatar.defaultProps = {\n url: null\n};\n\nAvatar.propTypes = {\n DefaultAvatar: _propTypes2.default.func.isRequired,\n theme: _propTypes2.default.shape({\n avatar: _propTypes2.default.string.isRequired\n }).isRequired,\n url: _propTypes2.default.string\n};\n;\n\n(function () {\n var reactHotLoader = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").default;\n\n var leaveModule = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").leaveModule;\n\n if (!reactHotLoader) {\n return;\n }\n\n reactHotLoader.register(Avatar, 'Avatar', '/home/jmgasper/Documents/Git/topcoder-react-utils/src/shared/components/Avatar.jsx');\n leaveModule(module);\n})();\n\n;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-utils/./src/shared/components/Avatar.jsx?"); + +/***/ }), + +/***/ "./src/shared/components/Button.jsx": +/*!******************************************!*\ + !*** ./src/shared/components/Button.jsx ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = Button;\n\nvar _propTypes = __webpack_require__(/*! prop-types */ \"prop-types\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _react = __webpack_require__(/*! react */ \"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _Link = __webpack_require__(/*! ./Link */ \"./src/shared/components/Link.jsx\");\n\nvar _Link2 = _interopRequireDefault(_Link);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n var enterModule = __webpack_require__(/*! react-hot-loader */ \"react-hot-loader\").enterModule;\n\n enterModule && enterModule(module);\n})(); /**\n * The Button component provide a standard button / button-like link:\n * - When disabled, it renders as
;\n * - When no \"to\" prop is passed in, it renders as