├── .babelrc ├── .editorconfig ├── .gitignore ├── LICENSE ├── README.md ├── dist ├── app.js ├── index.html └── plain-report.txt ├── index.html ├── npm-shrinkwrap.json ├── package.json ├── src ├── components │ ├── BodyPage.js │ ├── CreateForm.js │ ├── DetailBody.js │ ├── Header.js │ ├── LoginForm.js │ ├── TopicList.js │ └── UserPage.js ├── containers │ ├── About.js │ ├── Create.js │ ├── Detail.js │ ├── Home.js │ ├── Login.js │ ├── Root.js │ ├── Router.js │ └── User.js ├── index.js ├── lib │ └── tool.js ├── static │ └── css │ │ ├── github-markdown.css │ │ └── global.css └── store │ ├── actions │ └── index.js │ ├── configureStore.js │ └── reducers │ ├── index.js │ ├── status.js │ └── user.js ├── webpack.config.js └── webpack.prod.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "es2015" 5 | ], 6 | "react" 7 | ], 8 | "plugins": [ 9 | "react-hot-loader/babel", 10 | "transform-class-properties" 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | indent_style = space 8 | indent_size = 2 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | 39 | #IDE 40 | .idea 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Wojciech Kwiatek 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # reactjs-cnodejs 2 | 本项目是基于 Cnodejs 的 api,采用 ReactJS 前端框架,借助 webpack 开发的单页面web应用,在线 [Demo](http://reactjs.luckybird.me) 3 | 4 | **功能简介** 5 | 6 | 1.全站 UI 基于 material-ui 7 | 8 | 2.开发模式支持热加载,以及ES6语法编程 9 | 10 | 3.采用 react-router 作为单页面的路由 11 | 12 | 4.借助 Redux 保存应用状态和网站数据 13 | 14 | 15 | 16 | **引用类库** 17 | 18 | > [material-ui](https://github.com/callemall/material-ui) 19 | 20 | > [react-hot-loader](https://github.com/gaearon/react-hot-loader) 21 | 22 | > [react-router](https://github.com/ReactTraining/react-router) 23 | 24 | > [redux](https://github.com/reactjs/redux) 25 | 26 | 27 | 28 | **安装方法** 29 | 30 | ``` bash 31 | # install dependencies 32 | npm install 33 | 34 | # serve with hot reload at localhost:8080 35 | npm run dev 36 | 37 | # build for production with minification 38 | npm run build 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Reactjs-Cnodejs 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /dist/plain-report.txt: -------------------------------------------------------------------------------- 1 | .15.4.2@react-dom: 508.77 KB (29.2%) 2 | .0.17.4@material-ui: 468.43 KB (26.9%) 3 | .15.4.2@react: 118.16 KB (6.79%) 4 | .4.6.0@lodash.merge: 56.82 KB (3.26%) 5 | .4.9.1@buffer: 47.47 KB (2.73%) 6 | .2.4.1@core-js: 42 KB (2.41%) 7 | .5.0.4@react-redux: 36.22 KB (2.08%) 8 | .4.6.1@history: 33.04 KB (1.90%) 9 | .3.0.2@inline-style-prefixer: 31.87 KB (1.83%) 10 | .0.8.12@fbjs: 30.46 KB (1.75%) 11 | .4.1.1@react-router: 29.01 KB (1.67%) 12 | .4.6.0@redux-persist: 20.92 KB (1.20%) 13 | .3.6.0@redux: 20.35 KB (1.17%) 14 | .1.6.1@bowser: 16.56 KB (0.952%) 15 | .4.1.1@lodash.throttle: 13 KB (0.747%) 16 | .2.0.3@whatwg-fetch: 12.38 KB (0.711%) 17 | .4.1.1@react-router-dom: 11.63 KB (0.668%) 18 | .0.16.1@style-loader: 11.25 KB (0.646%) 19 | .1.7.0@path-to-regexp: 10.56 KB (0.606%) 20 | .15.5.3@react-addons-create-fragment: 9.46 KB (0.544%) 21 | .0.4.5@react-event-listener: 8.5 KB (0.489%) 22 | .0.23.1@recompose: 8.14 KB (0.467%) 23 | .6.23.0@babel-runtime: 8.05 KB (0.463%) 24 | .2.0.1@react-tap-event-plugin: 7.29 KB (0.419%) 25 | .1.0.8@react-infinite-scroller: 7.27 KB (0.418%) 26 | .1.0.5@setimmediate: 6.32 KB (0.363%) 27 | .4.17.4@lodash-es: 5.74 KB (0.330%) 28 | .0.11.9@process: 5.17 KB (0.297%) 29 | .3.0.0-beta.6@react-hot-loader: 3.95 KB (0.227%) 30 | .1.2.0@base64-js: 3.4 KB (0.195%) 31 | .2.1.8@keycode: 2.7 KB (0.155%) 32 | .15.5.8@prop-types: 2.37 KB (0.136%) 33 | .0.27.3@css-loader: 2.14 KB (0.123%) 34 | .3.0.1@timeago.js: 2.13 KB (0.122%) 35 | .4.1.1@object-assign: 2.06 KB (0.118%) 36 | .1.1.8@ieee754: 2.01 KB (0.115%) 37 | .2.1.0@resolve-pathname: 1.82 KB (0.105%) 38 | .3.0.0@warning: 1.76 KB (0.101%) 39 | .2.2.2@invariant: 1.48 KB (0.0851%) 40 | .1.2.0@hoist-non-react-statics: 1.35 KB (0.0778%) 41 | .2.0.2@timers-browserify: 1.33 KB (0.0763%) 42 | .0.2.1@value-equal: 1.16 KB (0.0665%) 43 | .1.0.4@symbol-observable: 1.12 KB (0.0646%) 44 | .2.4.1@webpack: 1.09 KB (0.0625%) 45 | .5.0.1@json-stringify-safe: 907 B (0.0509%) 46 | .1.0.3@css-in-js-utils: 760 B (0.0426%) 47 | .2.2.0@redux-thunk: 529 B (0.0297%) 48 | .1.0.2@hyphenate-style-name: 339 B (0.0190%) 49 | .0.1.0@simple-assign: 281 B (0.0158%) 50 | .1.0.0@isarray: 132 B (0.00741%) 51 | .0.0.1@isarray: 120 B (0.00673%) 52 | .15.5.2@react-addons-transition-group: 59 B (0.00331%) 53 | : 120.9 KB (6.95%) 54 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Reactjs-Cnodejs 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /npm-shrinkwrap.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-hot-loader-minimal-boilerplate", 3 | "version": "1.0.0", 4 | "dependencies": { 5 | "accepts": { 6 | "version": "1.3.3", 7 | "from": "accepts@>=1.3.3 <1.4.0", 8 | "resolved": "http://r.tnpm.oa.com/accepts/download/accepts-1.3.3.tgz", 9 | "dev": true 10 | }, 11 | "acorn": { 12 | "version": "4.0.11", 13 | "from": "acorn@>=4.0.4 <5.0.0", 14 | "resolved": "http://r.tnpm.oa.com/acorn/download/acorn-4.0.11.tgz", 15 | "dev": true 16 | }, 17 | "acorn-dynamic-import": { 18 | "version": "2.0.2", 19 | "from": "acorn-dynamic-import@>=2.0.0 <3.0.0", 20 | "resolved": "http://r.tnpm.oa.com/acorn-dynamic-import/download/acorn-dynamic-import-2.0.2.tgz", 21 | "dev": true 22 | }, 23 | "ajv": { 24 | "version": "4.11.5", 25 | "from": "ajv@>=4.7.0 <5.0.0", 26 | "resolved": "http://r.tnpm.oa.com/ajv/download/ajv-4.11.5.tgz", 27 | "dev": true 28 | }, 29 | "ajv-keywords": { 30 | "version": "1.5.1", 31 | "from": "ajv-keywords@>=1.1.1 <2.0.0", 32 | "resolved": "http://r.tnpm.oa.com/ajv-keywords/download/ajv-keywords-1.5.1.tgz", 33 | "dev": true 34 | }, 35 | "align-text": { 36 | "version": "0.1.4", 37 | "from": "align-text@>=0.1.3 <0.2.0", 38 | "resolved": "http://r.tnpm.oa.com/align-text/download/align-text-0.1.4.tgz", 39 | "dev": true 40 | }, 41 | "amdefine": { 42 | "version": "1.0.1", 43 | "from": "amdefine@>=0.0.4", 44 | "resolved": "http://r.tnpm.oa.com/amdefine/download/amdefine-1.0.1.tgz", 45 | "dev": true 46 | }, 47 | "ansi-html": { 48 | "version": "0.0.7", 49 | "from": "ansi-html@0.0.7", 50 | "resolved": "http://r.tnpm.oa.com/ansi-html/download/ansi-html-0.0.7.tgz", 51 | "dev": true 52 | }, 53 | "ansi-regex": { 54 | "version": "2.1.1", 55 | "from": "ansi-regex@>=2.0.0 <3.0.0", 56 | "resolved": "http://r.tnpm.oa.com/ansi-regex/download/ansi-regex-2.1.1.tgz", 57 | "dev": true 58 | }, 59 | "ansi-styles": { 60 | "version": "2.2.1", 61 | "from": "ansi-styles@>=2.2.1 <3.0.0", 62 | "resolved": "http://r.tnpm.oa.com/ansi-styles/download/ansi-styles-2.2.1.tgz", 63 | "dev": true 64 | }, 65 | "anymatch": { 66 | "version": "1.3.0", 67 | "from": "anymatch@>=1.3.0 <2.0.0", 68 | "resolved": "http://r.tnpm.oa.com/anymatch/download/anymatch-1.3.0.tgz", 69 | "dev": true 70 | }, 71 | "arr-diff": { 72 | "version": "2.0.0", 73 | "from": "arr-diff@>=2.0.0 <3.0.0", 74 | "resolved": "http://r.tnpm.oa.com/arr-diff/download/arr-diff-2.0.0.tgz", 75 | "dev": true 76 | }, 77 | "arr-flatten": { 78 | "version": "1.0.1", 79 | "from": "arr-flatten@>=1.0.1 <2.0.0", 80 | "resolved": "http://r.tnpm.oa.com/arr-flatten/download/arr-flatten-1.0.1.tgz", 81 | "dev": true 82 | }, 83 | "array-flatten": { 84 | "version": "1.1.1", 85 | "from": "array-flatten@1.1.1", 86 | "resolved": "http://r.tnpm.oa.com/array-flatten/download/array-flatten-1.1.1.tgz", 87 | "dev": true 88 | }, 89 | "array-unique": { 90 | "version": "0.2.1", 91 | "from": "array-unique@>=0.2.1 <0.3.0", 92 | "resolved": "http://r.tnpm.oa.com/array-unique/download/array-unique-0.2.1.tgz", 93 | "dev": true 94 | }, 95 | "arrify": { 96 | "version": "1.0.1", 97 | "from": "arrify@>=1.0.0 <2.0.0", 98 | "resolved": "http://r.tnpm.oa.com/arrify/download/arrify-1.0.1.tgz", 99 | "dev": true 100 | }, 101 | "asap": { 102 | "version": "2.0.5", 103 | "from": "asap@>=2.0.3 <2.1.0", 104 | "resolved": "http://r.tnpm.oa.com/asap/download/asap-2.0.5.tgz" 105 | }, 106 | "asn1.js": { 107 | "version": "4.9.1", 108 | "from": "asn1.js@>=4.0.0 <5.0.0", 109 | "resolved": "http://r.tnpm.oa.com/asn1.js/download/asn1.js-4.9.1.tgz", 110 | "dev": true 111 | }, 112 | "assert": { 113 | "version": "1.4.1", 114 | "from": "assert@>=1.1.1 <2.0.0", 115 | "resolved": "http://r.tnpm.oa.com/assert/download/assert-1.4.1.tgz", 116 | "dev": true 117 | }, 118 | "async": { 119 | "version": "2.1.5", 120 | "from": "async@>=2.1.2 <3.0.0", 121 | "resolved": "http://r.tnpm.oa.com/async/download/async-2.1.5.tgz", 122 | "dev": true 123 | }, 124 | "async-each": { 125 | "version": "1.0.1", 126 | "from": "async-each@>=1.0.0 <2.0.0", 127 | "resolved": "http://r.tnpm.oa.com/async-each/download/async-each-1.0.1.tgz", 128 | "dev": true 129 | }, 130 | "babel-code-frame": { 131 | "version": "6.22.0", 132 | "from": "babel-code-frame@>=6.22.0 <7.0.0", 133 | "resolved": "http://r.tnpm.oa.com/babel-code-frame/download/babel-code-frame-6.22.0.tgz", 134 | "dev": true 135 | }, 136 | "babel-core": { 137 | "version": "6.24.0", 138 | "from": "babel-core@>=6.23.1 <7.0.0", 139 | "resolved": "http://r.tnpm.oa.com/babel-core/download/babel-core-6.24.0.tgz", 140 | "dev": true 141 | }, 142 | "babel-generator": { 143 | "version": "6.24.0", 144 | "from": "babel-generator@>=6.24.0 <7.0.0", 145 | "resolved": "http://r.tnpm.oa.com/babel-generator/download/babel-generator-6.24.0.tgz", 146 | "dev": true 147 | }, 148 | "babel-helper-builder-binary-assignment-operator-visitor": { 149 | "version": "6.22.0", 150 | "from": "babel-helper-builder-binary-assignment-operator-visitor@>=6.22.0 <7.0.0", 151 | "resolved": "http://r.tnpm.oa.com/babel-helper-builder-binary-assignment-operator-visitor/download/babel-helper-builder-binary-assignment-operator-visitor-6.22.0.tgz", 152 | "dev": true 153 | }, 154 | "babel-helper-builder-react-jsx": { 155 | "version": "6.23.0", 156 | "from": "babel-helper-builder-react-jsx@>=6.23.0 <7.0.0", 157 | "resolved": "http://r.tnpm.oa.com/babel-helper-builder-react-jsx/download/babel-helper-builder-react-jsx-6.23.0.tgz", 158 | "dev": true 159 | }, 160 | "babel-helper-call-delegate": { 161 | "version": "6.22.0", 162 | "from": "babel-helper-call-delegate@>=6.22.0 <7.0.0", 163 | "resolved": "http://r.tnpm.oa.com/babel-helper-call-delegate/download/babel-helper-call-delegate-6.22.0.tgz", 164 | "dev": true 165 | }, 166 | "babel-helper-define-map": { 167 | "version": "6.23.0", 168 | "from": "babel-helper-define-map@>=6.23.0 <7.0.0", 169 | "resolved": "http://r.tnpm.oa.com/babel-helper-define-map/download/babel-helper-define-map-6.23.0.tgz", 170 | "dev": true 171 | }, 172 | "babel-helper-explode-assignable-expression": { 173 | "version": "6.22.0", 174 | "from": "babel-helper-explode-assignable-expression@>=6.22.0 <7.0.0", 175 | "resolved": "http://r.tnpm.oa.com/babel-helper-explode-assignable-expression/download/babel-helper-explode-assignable-expression-6.22.0.tgz", 176 | "dev": true 177 | }, 178 | "babel-helper-function-name": { 179 | "version": "6.23.0", 180 | "from": "babel-helper-function-name@>=6.23.0 <7.0.0", 181 | "resolved": "http://r.tnpm.oa.com/babel-helper-function-name/download/babel-helper-function-name-6.23.0.tgz", 182 | "dev": true 183 | }, 184 | "babel-helper-get-function-arity": { 185 | "version": "6.22.0", 186 | "from": "babel-helper-get-function-arity@>=6.22.0 <7.0.0", 187 | "resolved": "http://r.tnpm.oa.com/babel-helper-get-function-arity/download/babel-helper-get-function-arity-6.22.0.tgz", 188 | "dev": true 189 | }, 190 | "babel-helper-hoist-variables": { 191 | "version": "6.22.0", 192 | "from": "babel-helper-hoist-variables@>=6.22.0 <7.0.0", 193 | "resolved": "http://r.tnpm.oa.com/babel-helper-hoist-variables/download/babel-helper-hoist-variables-6.22.0.tgz", 194 | "dev": true 195 | }, 196 | "babel-helper-optimise-call-expression": { 197 | "version": "6.23.0", 198 | "from": "babel-helper-optimise-call-expression@>=6.23.0 <7.0.0", 199 | "resolved": "http://r.tnpm.oa.com/babel-helper-optimise-call-expression/download/babel-helper-optimise-call-expression-6.23.0.tgz", 200 | "dev": true 201 | }, 202 | "babel-helper-regex": { 203 | "version": "6.22.0", 204 | "from": "babel-helper-regex@>=6.22.0 <7.0.0", 205 | "resolved": "http://r.tnpm.oa.com/babel-helper-regex/download/babel-helper-regex-6.22.0.tgz", 206 | "dev": true 207 | }, 208 | "babel-helper-remap-async-to-generator": { 209 | "version": "6.22.0", 210 | "from": "babel-helper-remap-async-to-generator@>=6.22.0 <7.0.0", 211 | "resolved": "http://r.tnpm.oa.com/babel-helper-remap-async-to-generator/download/babel-helper-remap-async-to-generator-6.22.0.tgz", 212 | "dev": true 213 | }, 214 | "babel-helper-replace-supers": { 215 | "version": "6.23.0", 216 | "from": "babel-helper-replace-supers@>=6.23.0 <7.0.0", 217 | "resolved": "http://r.tnpm.oa.com/babel-helper-replace-supers/download/babel-helper-replace-supers-6.23.0.tgz", 218 | "dev": true 219 | }, 220 | "babel-helpers": { 221 | "version": "6.23.0", 222 | "from": "babel-helpers@>=6.23.0 <7.0.0", 223 | "resolved": "http://r.tnpm.oa.com/babel-helpers/download/babel-helpers-6.23.0.tgz", 224 | "dev": true 225 | }, 226 | "babel-loader": { 227 | "version": "6.4.1", 228 | "from": "babel-loader@>=6.3.2 <7.0.0", 229 | "resolved": "http://r.tnpm.oa.com/babel-loader/download/babel-loader-6.4.1.tgz", 230 | "dev": true 231 | }, 232 | "babel-messages": { 233 | "version": "6.23.0", 234 | "from": "babel-messages@>=6.23.0 <7.0.0", 235 | "resolved": "http://r.tnpm.oa.com/babel-messages/download/babel-messages-6.23.0.tgz", 236 | "dev": true 237 | }, 238 | "babel-plugin-check-es2015-constants": { 239 | "version": "6.22.0", 240 | "from": "babel-plugin-check-es2015-constants@>=6.22.0 <7.0.0", 241 | "resolved": "http://r.tnpm.oa.com/babel-plugin-check-es2015-constants/download/babel-plugin-check-es2015-constants-6.22.0.tgz", 242 | "dev": true 243 | }, 244 | "babel-plugin-syntax-async-functions": { 245 | "version": "6.13.0", 246 | "from": "babel-plugin-syntax-async-functions@>=6.8.0 <7.0.0", 247 | "resolved": "http://r.tnpm.oa.com/babel-plugin-syntax-async-functions/download/babel-plugin-syntax-async-functions-6.13.0.tgz", 248 | "dev": true 249 | }, 250 | "babel-plugin-syntax-exponentiation-operator": { 251 | "version": "6.13.0", 252 | "from": "babel-plugin-syntax-exponentiation-operator@>=6.8.0 <7.0.0", 253 | "resolved": "http://r.tnpm.oa.com/babel-plugin-syntax-exponentiation-operator/download/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", 254 | "dev": true 255 | }, 256 | "babel-plugin-syntax-flow": { 257 | "version": "6.18.0", 258 | "from": "babel-plugin-syntax-flow@>=6.18.0 <7.0.0", 259 | "resolved": "http://r.tnpm.oa.com/babel-plugin-syntax-flow/download/babel-plugin-syntax-flow-6.18.0.tgz", 260 | "dev": true 261 | }, 262 | "babel-plugin-syntax-jsx": { 263 | "version": "6.18.0", 264 | "from": "babel-plugin-syntax-jsx@>=6.3.13 <7.0.0", 265 | "resolved": "http://r.tnpm.oa.com/babel-plugin-syntax-jsx/download/babel-plugin-syntax-jsx-6.18.0.tgz", 266 | "dev": true 267 | }, 268 | "babel-plugin-syntax-trailing-function-commas": { 269 | "version": "6.22.0", 270 | "from": "babel-plugin-syntax-trailing-function-commas@>=6.22.0 <7.0.0", 271 | "resolved": "http://r.tnpm.oa.com/babel-plugin-syntax-trailing-function-commas/download/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", 272 | "dev": true 273 | }, 274 | "babel-plugin-transform-async-to-generator": { 275 | "version": "6.22.0", 276 | "from": "babel-plugin-transform-async-to-generator@>=6.22.0 <7.0.0", 277 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-async-to-generator/download/babel-plugin-transform-async-to-generator-6.22.0.tgz", 278 | "dev": true 279 | }, 280 | "babel-plugin-transform-es2015-arrow-functions": { 281 | "version": "6.22.0", 282 | "from": "babel-plugin-transform-es2015-arrow-functions@>=6.22.0 <7.0.0", 283 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-arrow-functions/download/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", 284 | "dev": true 285 | }, 286 | "babel-plugin-transform-es2015-block-scoped-functions": { 287 | "version": "6.22.0", 288 | "from": "babel-plugin-transform-es2015-block-scoped-functions@>=6.22.0 <7.0.0", 289 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-block-scoped-functions/download/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", 290 | "dev": true 291 | }, 292 | "babel-plugin-transform-es2015-block-scoping": { 293 | "version": "6.23.0", 294 | "from": "babel-plugin-transform-es2015-block-scoping@>=6.22.0 <7.0.0", 295 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-block-scoping/download/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz", 296 | "dev": true 297 | }, 298 | "babel-plugin-transform-es2015-classes": { 299 | "version": "6.23.0", 300 | "from": "babel-plugin-transform-es2015-classes@>=6.22.0 <7.0.0", 301 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-classes/download/babel-plugin-transform-es2015-classes-6.23.0.tgz", 302 | "dev": true 303 | }, 304 | "babel-plugin-transform-es2015-computed-properties": { 305 | "version": "6.22.0", 306 | "from": "babel-plugin-transform-es2015-computed-properties@>=6.22.0 <7.0.0", 307 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-computed-properties/download/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz", 308 | "dev": true 309 | }, 310 | "babel-plugin-transform-es2015-destructuring": { 311 | "version": "6.23.0", 312 | "from": "babel-plugin-transform-es2015-destructuring@>=6.22.0 <7.0.0", 313 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-destructuring/download/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", 314 | "dev": true 315 | }, 316 | "babel-plugin-transform-es2015-duplicate-keys": { 317 | "version": "6.22.0", 318 | "from": "babel-plugin-transform-es2015-duplicate-keys@>=6.22.0 <7.0.0", 319 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-duplicate-keys/download/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz", 320 | "dev": true 321 | }, 322 | "babel-plugin-transform-es2015-for-of": { 323 | "version": "6.23.0", 324 | "from": "babel-plugin-transform-es2015-for-of@>=6.22.0 <7.0.0", 325 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-for-of/download/babel-plugin-transform-es2015-for-of-6.23.0.tgz", 326 | "dev": true 327 | }, 328 | "babel-plugin-transform-es2015-function-name": { 329 | "version": "6.22.0", 330 | "from": "babel-plugin-transform-es2015-function-name@>=6.22.0 <7.0.0", 331 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-function-name/download/babel-plugin-transform-es2015-function-name-6.22.0.tgz", 332 | "dev": true 333 | }, 334 | "babel-plugin-transform-es2015-literals": { 335 | "version": "6.22.0", 336 | "from": "babel-plugin-transform-es2015-literals@>=6.22.0 <7.0.0", 337 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-literals/download/babel-plugin-transform-es2015-literals-6.22.0.tgz", 338 | "dev": true 339 | }, 340 | "babel-plugin-transform-es2015-modules-amd": { 341 | "version": "6.24.0", 342 | "from": "babel-plugin-transform-es2015-modules-amd@>=6.24.0 <7.0.0", 343 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-modules-amd/download/babel-plugin-transform-es2015-modules-amd-6.24.0.tgz", 344 | "dev": true 345 | }, 346 | "babel-plugin-transform-es2015-modules-commonjs": { 347 | "version": "6.24.0", 348 | "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.24.0 <7.0.0", 349 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-modules-commonjs/download/babel-plugin-transform-es2015-modules-commonjs-6.24.0.tgz", 350 | "dev": true 351 | }, 352 | "babel-plugin-transform-es2015-modules-systemjs": { 353 | "version": "6.23.0", 354 | "from": "babel-plugin-transform-es2015-modules-systemjs@>=6.22.0 <7.0.0", 355 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-modules-systemjs/download/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz", 356 | "dev": true 357 | }, 358 | "babel-plugin-transform-es2015-modules-umd": { 359 | "version": "6.24.0", 360 | "from": "babel-plugin-transform-es2015-modules-umd@>=6.24.0 <7.0.0", 361 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-modules-umd/download/babel-plugin-transform-es2015-modules-umd-6.24.0.tgz", 362 | "dev": true 363 | }, 364 | "babel-plugin-transform-es2015-object-super": { 365 | "version": "6.22.0", 366 | "from": "babel-plugin-transform-es2015-object-super@>=6.22.0 <7.0.0", 367 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-object-super/download/babel-plugin-transform-es2015-object-super-6.22.0.tgz", 368 | "dev": true 369 | }, 370 | "babel-plugin-transform-es2015-parameters": { 371 | "version": "6.23.0", 372 | "from": "babel-plugin-transform-es2015-parameters@>=6.22.0 <7.0.0", 373 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-parameters/download/babel-plugin-transform-es2015-parameters-6.23.0.tgz", 374 | "dev": true 375 | }, 376 | "babel-plugin-transform-es2015-shorthand-properties": { 377 | "version": "6.22.0", 378 | "from": "babel-plugin-transform-es2015-shorthand-properties@>=6.22.0 <7.0.0", 379 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-shorthand-properties/download/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz", 380 | "dev": true 381 | }, 382 | "babel-plugin-transform-es2015-spread": { 383 | "version": "6.22.0", 384 | "from": "babel-plugin-transform-es2015-spread@>=6.22.0 <7.0.0", 385 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-spread/download/babel-plugin-transform-es2015-spread-6.22.0.tgz", 386 | "dev": true 387 | }, 388 | "babel-plugin-transform-es2015-sticky-regex": { 389 | "version": "6.22.0", 390 | "from": "babel-plugin-transform-es2015-sticky-regex@>=6.22.0 <7.0.0", 391 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-sticky-regex/download/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz", 392 | "dev": true 393 | }, 394 | "babel-plugin-transform-es2015-template-literals": { 395 | "version": "6.22.0", 396 | "from": "babel-plugin-transform-es2015-template-literals@>=6.22.0 <7.0.0", 397 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-template-literals/download/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", 398 | "dev": true 399 | }, 400 | "babel-plugin-transform-es2015-typeof-symbol": { 401 | "version": "6.23.0", 402 | "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.22.0 <7.0.0", 403 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-typeof-symbol/download/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", 404 | "dev": true 405 | }, 406 | "babel-plugin-transform-es2015-unicode-regex": { 407 | "version": "6.22.0", 408 | "from": "babel-plugin-transform-es2015-unicode-regex@>=6.22.0 <7.0.0", 409 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-es2015-unicode-regex/download/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz", 410 | "dev": true 411 | }, 412 | "babel-plugin-transform-exponentiation-operator": { 413 | "version": "6.22.0", 414 | "from": "babel-plugin-transform-exponentiation-operator@>=6.22.0 <7.0.0", 415 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-exponentiation-operator/download/babel-plugin-transform-exponentiation-operator-6.22.0.tgz", 416 | "dev": true 417 | }, 418 | "babel-plugin-transform-flow-strip-types": { 419 | "version": "6.22.0", 420 | "from": "babel-plugin-transform-flow-strip-types@>=6.22.0 <7.0.0", 421 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-flow-strip-types/download/babel-plugin-transform-flow-strip-types-6.22.0.tgz", 422 | "dev": true 423 | }, 424 | "babel-plugin-transform-react-display-name": { 425 | "version": "6.23.0", 426 | "from": "babel-plugin-transform-react-display-name@>=6.23.0 <7.0.0", 427 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-react-display-name/download/babel-plugin-transform-react-display-name-6.23.0.tgz", 428 | "dev": true 429 | }, 430 | "babel-plugin-transform-react-jsx": { 431 | "version": "6.23.0", 432 | "from": "babel-plugin-transform-react-jsx@>=6.23.0 <7.0.0", 433 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-react-jsx/download/babel-plugin-transform-react-jsx-6.23.0.tgz", 434 | "dev": true 435 | }, 436 | "babel-plugin-transform-react-jsx-self": { 437 | "version": "6.22.0", 438 | "from": "babel-plugin-transform-react-jsx-self@>=6.22.0 <7.0.0", 439 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-react-jsx-self/download/babel-plugin-transform-react-jsx-self-6.22.0.tgz", 440 | "dev": true 441 | }, 442 | "babel-plugin-transform-react-jsx-source": { 443 | "version": "6.22.0", 444 | "from": "babel-plugin-transform-react-jsx-source@>=6.22.0 <7.0.0", 445 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-react-jsx-source/download/babel-plugin-transform-react-jsx-source-6.22.0.tgz", 446 | "dev": true 447 | }, 448 | "babel-plugin-transform-regenerator": { 449 | "version": "6.22.0", 450 | "from": "babel-plugin-transform-regenerator@>=6.22.0 <7.0.0", 451 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-regenerator/download/babel-plugin-transform-regenerator-6.22.0.tgz", 452 | "dev": true 453 | }, 454 | "babel-plugin-transform-strict-mode": { 455 | "version": "6.22.0", 456 | "from": "babel-plugin-transform-strict-mode@>=6.22.0 <7.0.0", 457 | "resolved": "http://r.tnpm.oa.com/babel-plugin-transform-strict-mode/download/babel-plugin-transform-strict-mode-6.22.0.tgz", 458 | "dev": true 459 | }, 460 | "babel-polyfill": { 461 | "version": "6.23.0", 462 | "from": "babel-polyfill@>=6.23.0 <7.0.0", 463 | "resolved": "http://r.tnpm.oa.com/babel-polyfill/download/babel-polyfill-6.23.0.tgz", 464 | "dev": true, 465 | "dependencies": { 466 | "core-js": { 467 | "version": "2.4.1", 468 | "from": "core-js@>=2.4.0 <3.0.0", 469 | "resolved": "http://r.tnpm.oa.com/core-js/download/core-js-2.4.1.tgz", 470 | "dev": true 471 | } 472 | } 473 | }, 474 | "babel-preset-es2015": { 475 | "version": "6.24.0", 476 | "from": "babel-preset-es2015@>=6.24.0 <7.0.0", 477 | "resolved": "http://r.tnpm.oa.com/babel-preset-es2015/download/babel-preset-es2015-6.24.0.tgz", 478 | "dev": true 479 | }, 480 | "babel-preset-es2016": { 481 | "version": "6.22.0", 482 | "from": "babel-preset-es2016@>=6.22.0 <7.0.0", 483 | "resolved": "http://r.tnpm.oa.com/babel-preset-es2016/download/babel-preset-es2016-6.22.0.tgz", 484 | "dev": true 485 | }, 486 | "babel-preset-es2017": { 487 | "version": "6.22.0", 488 | "from": "babel-preset-es2017@>=6.22.0 <7.0.0", 489 | "resolved": "http://r.tnpm.oa.com/babel-preset-es2017/download/babel-preset-es2017-6.22.0.tgz", 490 | "dev": true 491 | }, 492 | "babel-preset-flow": { 493 | "version": "6.23.0", 494 | "from": "babel-preset-flow@>=6.23.0 <7.0.0", 495 | "resolved": "http://r.tnpm.oa.com/babel-preset-flow/download/babel-preset-flow-6.23.0.tgz", 496 | "dev": true 497 | }, 498 | "babel-preset-latest": { 499 | "version": "6.24.0", 500 | "from": "babel-preset-latest@>=6.22.0 <7.0.0", 501 | "resolved": "http://r.tnpm.oa.com/babel-preset-latest/download/babel-preset-latest-6.24.0.tgz", 502 | "dev": true 503 | }, 504 | "babel-preset-react": { 505 | "version": "6.23.0", 506 | "from": "babel-preset-react@>=6.23.0 <7.0.0", 507 | "resolved": "http://r.tnpm.oa.com/babel-preset-react/download/babel-preset-react-6.23.0.tgz", 508 | "dev": true 509 | }, 510 | "babel-register": { 511 | "version": "6.24.0", 512 | "from": "babel-register@>=6.24.0 <7.0.0", 513 | "resolved": "http://r.tnpm.oa.com/babel-register/download/babel-register-6.24.0.tgz", 514 | "dev": true, 515 | "dependencies": { 516 | "core-js": { 517 | "version": "2.4.1", 518 | "from": "core-js@>=2.4.0 <3.0.0", 519 | "resolved": "http://r.tnpm.oa.com/core-js/download/core-js-2.4.1.tgz", 520 | "dev": true 521 | } 522 | } 523 | }, 524 | "babel-runtime": { 525 | "version": "6.23.0", 526 | "from": "babel-runtime@>=6.22.0 <7.0.0", 527 | "resolved": "http://r.tnpm.oa.com/babel-runtime/download/babel-runtime-6.23.0.tgz", 528 | "dependencies": { 529 | "core-js": { 530 | "version": "2.4.1", 531 | "from": "core-js@>=2.4.0 <3.0.0", 532 | "resolved": "http://r.tnpm.oa.com/core-js/download/core-js-2.4.1.tgz" 533 | } 534 | } 535 | }, 536 | "babel-template": { 537 | "version": "6.23.0", 538 | "from": "babel-template@>=6.23.0 <7.0.0", 539 | "resolved": "http://r.tnpm.oa.com/babel-template/download/babel-template-6.23.0.tgz", 540 | "dev": true 541 | }, 542 | "babel-traverse": { 543 | "version": "6.23.1", 544 | "from": "babel-traverse@>=6.23.1 <7.0.0", 545 | "resolved": "http://r.tnpm.oa.com/babel-traverse/download/babel-traverse-6.23.1.tgz", 546 | "dev": true 547 | }, 548 | "babel-types": { 549 | "version": "6.23.0", 550 | "from": "babel-types@>=6.23.0 <7.0.0", 551 | "resolved": "http://r.tnpm.oa.com/babel-types/download/babel-types-6.23.0.tgz", 552 | "dev": true 553 | }, 554 | "babylon": { 555 | "version": "6.16.1", 556 | "from": "babylon@>=6.11.0 <7.0.0", 557 | "resolved": "http://r.tnpm.oa.com/babylon/download/babylon-6.16.1.tgz", 558 | "dev": true 559 | }, 560 | "balanced-match": { 561 | "version": "0.4.2", 562 | "from": "balanced-match@>=0.4.1 <0.5.0", 563 | "resolved": "http://r.tnpm.oa.com/balanced-match/download/balanced-match-0.4.2.tgz", 564 | "dev": true 565 | }, 566 | "base64-js": { 567 | "version": "1.2.0", 568 | "from": "base64-js@>=1.0.2 <2.0.0", 569 | "resolved": "http://r.tnpm.oa.com/base64-js/download/base64-js-1.2.0.tgz", 570 | "dev": true 571 | }, 572 | "batch": { 573 | "version": "0.5.3", 574 | "from": "batch@0.5.3", 575 | "resolved": "http://r.tnpm.oa.com/batch/download/batch-0.5.3.tgz", 576 | "dev": true 577 | }, 578 | "big.js": { 579 | "version": "3.1.3", 580 | "from": "big.js@>=3.1.3 <4.0.0", 581 | "resolved": "http://r.tnpm.oa.com/big.js/download/big.js-3.1.3.tgz", 582 | "dev": true 583 | }, 584 | "binary-extensions": { 585 | "version": "1.8.0", 586 | "from": "binary-extensions@>=1.0.0 <2.0.0", 587 | "resolved": "http://r.tnpm.oa.com/binary-extensions/download/binary-extensions-1.8.0.tgz", 588 | "dev": true 589 | }, 590 | "bn.js": { 591 | "version": "4.11.6", 592 | "from": "bn.js@>=4.1.1 <5.0.0", 593 | "resolved": "http://r.tnpm.oa.com/bn.js/download/bn.js-4.11.6.tgz", 594 | "dev": true 595 | }, 596 | "bowser": { 597 | "version": "1.6.0", 598 | "from": "bowser@>=1.0.0 <2.0.0", 599 | "resolved": "http://r.tnpm.oa.com/bowser/download/bowser-1.6.0.tgz" 600 | }, 601 | "brace-expansion": { 602 | "version": "1.1.6", 603 | "from": "brace-expansion@>=1.0.0 <2.0.0", 604 | "resolved": "http://r.tnpm.oa.com/brace-expansion/download/brace-expansion-1.1.6.tgz", 605 | "dev": true 606 | }, 607 | "braces": { 608 | "version": "1.8.5", 609 | "from": "braces@>=1.8.2 <2.0.0", 610 | "resolved": "http://r.tnpm.oa.com/braces/download/braces-1.8.5.tgz", 611 | "dev": true 612 | }, 613 | "brorand": { 614 | "version": "1.1.0", 615 | "from": "brorand@>=1.0.1 <2.0.0", 616 | "resolved": "http://r.tnpm.oa.com/brorand/download/brorand-1.1.0.tgz", 617 | "dev": true 618 | }, 619 | "browserify-aes": { 620 | "version": "1.0.6", 621 | "from": "browserify-aes@>=1.0.4 <2.0.0", 622 | "resolved": "http://r.tnpm.oa.com/browserify-aes/download/browserify-aes-1.0.6.tgz", 623 | "dev": true 624 | }, 625 | "browserify-cipher": { 626 | "version": "1.0.0", 627 | "from": "browserify-cipher@>=1.0.0 <2.0.0", 628 | "resolved": "http://r.tnpm.oa.com/browserify-cipher/download/browserify-cipher-1.0.0.tgz", 629 | "dev": true 630 | }, 631 | "browserify-des": { 632 | "version": "1.0.0", 633 | "from": "browserify-des@>=1.0.0 <2.0.0", 634 | "resolved": "http://r.tnpm.oa.com/browserify-des/download/browserify-des-1.0.0.tgz", 635 | "dev": true 636 | }, 637 | "browserify-rsa": { 638 | "version": "4.0.1", 639 | "from": "browserify-rsa@>=4.0.0 <5.0.0", 640 | "resolved": "http://r.tnpm.oa.com/browserify-rsa/download/browserify-rsa-4.0.1.tgz", 641 | "dev": true 642 | }, 643 | "browserify-sign": { 644 | "version": "4.0.0", 645 | "from": "browserify-sign@>=4.0.0 <5.0.0", 646 | "resolved": "http://r.tnpm.oa.com/browserify-sign/download/browserify-sign-4.0.0.tgz", 647 | "dev": true 648 | }, 649 | "browserify-zlib": { 650 | "version": "0.1.4", 651 | "from": "browserify-zlib@>=0.1.4 <0.2.0", 652 | "resolved": "http://r.tnpm.oa.com/browserify-zlib/download/browserify-zlib-0.1.4.tgz", 653 | "dev": true 654 | }, 655 | "buffer": { 656 | "version": "4.9.1", 657 | "from": "buffer@>=4.3.0 <5.0.0", 658 | "resolved": "http://r.tnpm.oa.com/buffer/download/buffer-4.9.1.tgz", 659 | "dev": true 660 | }, 661 | "buffer-shims": { 662 | "version": "1.0.0", 663 | "from": "buffer-shims@>=1.0.0 <2.0.0", 664 | "resolved": "http://r.tnpm.oa.com/buffer-shims/download/buffer-shims-1.0.0.tgz", 665 | "dev": true 666 | }, 667 | "buffer-xor": { 668 | "version": "1.0.3", 669 | "from": "buffer-xor@>=1.0.2 <2.0.0", 670 | "resolved": "http://r.tnpm.oa.com/buffer-xor/download/buffer-xor-1.0.3.tgz", 671 | "dev": true 672 | }, 673 | "builtin-modules": { 674 | "version": "1.1.1", 675 | "from": "builtin-modules@>=1.0.0 <2.0.0", 676 | "resolved": "http://r.tnpm.oa.com/builtin-modules/download/builtin-modules-1.1.1.tgz", 677 | "dev": true 678 | }, 679 | "builtin-status-codes": { 680 | "version": "3.0.0", 681 | "from": "builtin-status-codes@>=3.0.0 <4.0.0", 682 | "resolved": "http://r.tnpm.oa.com/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz", 683 | "dev": true 684 | }, 685 | "bytes": { 686 | "version": "2.3.0", 687 | "from": "bytes@2.3.0", 688 | "resolved": "http://r.tnpm.oa.com/bytes/download/bytes-2.3.0.tgz", 689 | "dev": true 690 | }, 691 | "camelcase": { 692 | "version": "1.2.1", 693 | "from": "camelcase@>=1.0.2 <2.0.0", 694 | "resolved": "http://r.tnpm.oa.com/camelcase/download/camelcase-1.2.1.tgz", 695 | "dev": true 696 | }, 697 | "center-align": { 698 | "version": "0.1.3", 699 | "from": "center-align@>=0.1.1 <0.2.0", 700 | "resolved": "http://r.tnpm.oa.com/center-align/download/center-align-0.1.3.tgz", 701 | "dev": true 702 | }, 703 | "chalk": { 704 | "version": "1.1.3", 705 | "from": "chalk@>=1.1.0 <2.0.0", 706 | "resolved": "http://r.tnpm.oa.com/chalk/download/chalk-1.1.3.tgz", 707 | "dev": true 708 | }, 709 | "change-emitter": { 710 | "version": "0.1.3", 711 | "from": "change-emitter@>=0.1.2 <0.2.0", 712 | "resolved": "http://r.tnpm.oa.com/change-emitter/download/change-emitter-0.1.3.tgz" 713 | }, 714 | "chokidar": { 715 | "version": "1.6.1", 716 | "from": "chokidar@>=1.4.3 <2.0.0", 717 | "resolved": "http://r.tnpm.oa.com/chokidar/download/chokidar-1.6.1.tgz", 718 | "dev": true 719 | }, 720 | "cipher-base": { 721 | "version": "1.0.3", 722 | "from": "cipher-base@>=1.0.0 <2.0.0", 723 | "resolved": "http://r.tnpm.oa.com/cipher-base/download/cipher-base-1.0.3.tgz", 724 | "dev": true 725 | }, 726 | "cliui": { 727 | "version": "2.1.0", 728 | "from": "cliui@>=2.1.0 <3.0.0", 729 | "resolved": "http://r.tnpm.oa.com/cliui/download/cliui-2.1.0.tgz", 730 | "dev": true 731 | }, 732 | "co": { 733 | "version": "4.6.0", 734 | "from": "co@>=4.6.0 <5.0.0", 735 | "resolved": "http://r.tnpm.oa.com/co/download/co-4.6.0.tgz", 736 | "dev": true 737 | }, 738 | "code-point-at": { 739 | "version": "1.1.0", 740 | "from": "code-point-at@>=1.0.0 <2.0.0", 741 | "resolved": "http://r.tnpm.oa.com/code-point-at/download/code-point-at-1.1.0.tgz", 742 | "dev": true 743 | }, 744 | "commondir": { 745 | "version": "1.0.1", 746 | "from": "commondir@>=1.0.1 <2.0.0", 747 | "resolved": "http://r.tnpm.oa.com/commondir/download/commondir-1.0.1.tgz", 748 | "dev": true 749 | }, 750 | "compressible": { 751 | "version": "2.0.9", 752 | "from": "compressible@>=2.0.8 <2.1.0", 753 | "resolved": "http://r.tnpm.oa.com/compressible/download/compressible-2.0.9.tgz", 754 | "dev": true 755 | }, 756 | "compression": { 757 | "version": "1.6.2", 758 | "from": "compression@>=1.5.2 <2.0.0", 759 | "resolved": "http://r.tnpm.oa.com/compression/download/compression-1.6.2.tgz", 760 | "dev": true, 761 | "dependencies": { 762 | "debug": { 763 | "version": "2.2.0", 764 | "from": "debug@>=2.2.0 <2.3.0", 765 | "resolved": "http://r.tnpm.oa.com/debug/download/debug-2.2.0.tgz", 766 | "dev": true 767 | }, 768 | "ms": { 769 | "version": "0.7.1", 770 | "from": "ms@0.7.1", 771 | "resolved": "http://r.tnpm.oa.com/ms/download/ms-0.7.1.tgz", 772 | "dev": true 773 | } 774 | } 775 | }, 776 | "concat-map": { 777 | "version": "0.0.1", 778 | "from": "concat-map@0.0.1", 779 | "resolved": "http://r.tnpm.oa.com/concat-map/download/concat-map-0.0.1.tgz", 780 | "dev": true 781 | }, 782 | "connect-history-api-fallback": { 783 | "version": "1.3.0", 784 | "from": "connect-history-api-fallback@>=1.3.0 <2.0.0", 785 | "resolved": "http://r.tnpm.oa.com/connect-history-api-fallback/download/connect-history-api-fallback-1.3.0.tgz", 786 | "dev": true 787 | }, 788 | "console-browserify": { 789 | "version": "1.1.0", 790 | "from": "console-browserify@>=1.1.0 <2.0.0", 791 | "resolved": "http://r.tnpm.oa.com/console-browserify/download/console-browserify-1.1.0.tgz", 792 | "dev": true 793 | }, 794 | "constants-browserify": { 795 | "version": "1.0.0", 796 | "from": "constants-browserify@>=1.0.0 <2.0.0", 797 | "resolved": "http://r.tnpm.oa.com/constants-browserify/download/constants-browserify-1.0.0.tgz", 798 | "dev": true 799 | }, 800 | "content-disposition": { 801 | "version": "0.5.2", 802 | "from": "content-disposition@0.5.2", 803 | "resolved": "http://r.tnpm.oa.com/content-disposition/download/content-disposition-0.5.2.tgz", 804 | "dev": true 805 | }, 806 | "content-type": { 807 | "version": "1.0.2", 808 | "from": "content-type@>=1.0.2 <1.1.0", 809 | "resolved": "http://r.tnpm.oa.com/content-type/download/content-type-1.0.2.tgz", 810 | "dev": true 811 | }, 812 | "convert-source-map": { 813 | "version": "1.4.0", 814 | "from": "convert-source-map@>=1.1.0 <2.0.0", 815 | "resolved": "http://r.tnpm.oa.com/convert-source-map/download/convert-source-map-1.4.0.tgz", 816 | "dev": true 817 | }, 818 | "cookie": { 819 | "version": "0.3.1", 820 | "from": "cookie@0.3.1", 821 | "resolved": "http://r.tnpm.oa.com/cookie/download/cookie-0.3.1.tgz", 822 | "dev": true 823 | }, 824 | "cookie-signature": { 825 | "version": "1.0.6", 826 | "from": "cookie-signature@1.0.6", 827 | "resolved": "http://r.tnpm.oa.com/cookie-signature/download/cookie-signature-1.0.6.tgz", 828 | "dev": true 829 | }, 830 | "core-js": { 831 | "version": "1.2.7", 832 | "from": "core-js@>=1.0.0 <2.0.0", 833 | "resolved": "http://r.tnpm.oa.com/core-js/download/core-js-1.2.7.tgz" 834 | }, 835 | "core-util-is": { 836 | "version": "1.0.2", 837 | "from": "core-util-is@>=1.0.0 <1.1.0", 838 | "resolved": "http://r.tnpm.oa.com/core-util-is/download/core-util-is-1.0.2.tgz", 839 | "dev": true 840 | }, 841 | "create-ecdh": { 842 | "version": "4.0.0", 843 | "from": "create-ecdh@>=4.0.0 <5.0.0", 844 | "resolved": "http://r.tnpm.oa.com/create-ecdh/download/create-ecdh-4.0.0.tgz", 845 | "dev": true 846 | }, 847 | "create-hash": { 848 | "version": "1.1.2", 849 | "from": "create-hash@>=1.1.0 <2.0.0", 850 | "resolved": "http://r.tnpm.oa.com/create-hash/download/create-hash-1.1.2.tgz", 851 | "dev": true 852 | }, 853 | "create-hmac": { 854 | "version": "1.1.4", 855 | "from": "create-hmac@>=1.1.0 <2.0.0", 856 | "resolved": "http://r.tnpm.oa.com/create-hmac/download/create-hmac-1.1.4.tgz", 857 | "dev": true 858 | }, 859 | "crypto-browserify": { 860 | "version": "3.11.0", 861 | "from": "crypto-browserify@>=3.11.0 <4.0.0", 862 | "resolved": "http://r.tnpm.oa.com/crypto-browserify/download/crypto-browserify-3.11.0.tgz", 863 | "dev": true 864 | }, 865 | "date-now": { 866 | "version": "0.1.4", 867 | "from": "date-now@>=0.1.4 <0.2.0", 868 | "resolved": "http://r.tnpm.oa.com/date-now/download/date-now-0.1.4.tgz", 869 | "dev": true 870 | }, 871 | "debug": { 872 | "version": "2.6.3", 873 | "from": "debug@>=2.1.1 <3.0.0", 874 | "resolved": "http://r.tnpm.oa.com/debug/download/debug-2.6.3.tgz", 875 | "dev": true 876 | }, 877 | "decamelize": { 878 | "version": "1.2.0", 879 | "from": "decamelize@>=1.0.0 <2.0.0", 880 | "resolved": "http://r.tnpm.oa.com/decamelize/download/decamelize-1.2.0.tgz", 881 | "dev": true 882 | }, 883 | "depd": { 884 | "version": "1.1.0", 885 | "from": "depd@>=1.1.0 <1.2.0", 886 | "resolved": "http://r.tnpm.oa.com/depd/download/depd-1.1.0.tgz", 887 | "dev": true 888 | }, 889 | "des.js": { 890 | "version": "1.0.0", 891 | "from": "des.js@>=1.0.0 <2.0.0", 892 | "resolved": "http://r.tnpm.oa.com/des.js/download/des.js-1.0.0.tgz", 893 | "dev": true 894 | }, 895 | "destroy": { 896 | "version": "1.0.4", 897 | "from": "destroy@>=1.0.4 <1.1.0", 898 | "resolved": "http://r.tnpm.oa.com/destroy/download/destroy-1.0.4.tgz", 899 | "dev": true 900 | }, 901 | "detect-indent": { 902 | "version": "4.0.0", 903 | "from": "detect-indent@>=4.0.0 <5.0.0", 904 | "resolved": "http://r.tnpm.oa.com/detect-indent/download/detect-indent-4.0.0.tgz", 905 | "dev": true 906 | }, 907 | "diffie-hellman": { 908 | "version": "5.0.2", 909 | "from": "diffie-hellman@>=5.0.0 <6.0.0", 910 | "resolved": "http://r.tnpm.oa.com/diffie-hellman/download/diffie-hellman-5.0.2.tgz", 911 | "dev": true 912 | }, 913 | "dom-walk": { 914 | "version": "0.1.1", 915 | "from": "dom-walk@>=0.1.0 <0.2.0", 916 | "resolved": "http://r.tnpm.oa.com/dom-walk/download/dom-walk-0.1.1.tgz", 917 | "dev": true 918 | }, 919 | "domain-browser": { 920 | "version": "1.1.7", 921 | "from": "domain-browser@>=1.1.1 <2.0.0", 922 | "resolved": "http://r.tnpm.oa.com/domain-browser/download/domain-browser-1.1.7.tgz", 923 | "dev": true 924 | }, 925 | "ee-first": { 926 | "version": "1.1.1", 927 | "from": "ee-first@1.1.1", 928 | "resolved": "http://r.tnpm.oa.com/ee-first/download/ee-first-1.1.1.tgz", 929 | "dev": true 930 | }, 931 | "elliptic": { 932 | "version": "6.4.0", 933 | "from": "elliptic@>=6.0.0 <7.0.0", 934 | "resolved": "http://r.tnpm.oa.com/elliptic/download/elliptic-6.4.0.tgz", 935 | "dev": true 936 | }, 937 | "emojis-list": { 938 | "version": "2.1.0", 939 | "from": "emojis-list@>=2.0.0 <3.0.0", 940 | "resolved": "http://r.tnpm.oa.com/emojis-list/download/emojis-list-2.1.0.tgz", 941 | "dev": true 942 | }, 943 | "encodeurl": { 944 | "version": "1.0.1", 945 | "from": "encodeurl@>=1.0.1 <1.1.0", 946 | "resolved": "http://r.tnpm.oa.com/encodeurl/download/encodeurl-1.0.1.tgz", 947 | "dev": true 948 | }, 949 | "encoding": { 950 | "version": "0.1.12", 951 | "from": "encoding@>=0.1.11 <0.2.0", 952 | "resolved": "http://r.tnpm.oa.com/encoding/download/encoding-0.1.12.tgz" 953 | }, 954 | "enhanced-resolve": { 955 | "version": "3.1.0", 956 | "from": "enhanced-resolve@>=3.0.0 <4.0.0", 957 | "resolved": "http://r.tnpm.oa.com/enhanced-resolve/download/enhanced-resolve-3.1.0.tgz", 958 | "dev": true 959 | }, 960 | "errno": { 961 | "version": "0.1.4", 962 | "from": "errno@>=0.1.3 <0.2.0", 963 | "resolved": "http://r.tnpm.oa.com/errno/download/errno-0.1.4.tgz", 964 | "dev": true 965 | }, 966 | "error-ex": { 967 | "version": "1.3.1", 968 | "from": "error-ex@>=1.2.0 <2.0.0", 969 | "resolved": "http://r.tnpm.oa.com/error-ex/download/error-ex-1.3.1.tgz", 970 | "dev": true 971 | }, 972 | "error-stack-parser": { 973 | "version": "1.3.6", 974 | "from": "error-stack-parser@>=1.3.6 <2.0.0", 975 | "resolved": "http://r.tnpm.oa.com/error-stack-parser/download/error-stack-parser-1.3.6.tgz", 976 | "dev": true 977 | }, 978 | "escape-html": { 979 | "version": "1.0.3", 980 | "from": "escape-html@>=1.0.3 <1.1.0", 981 | "resolved": "http://r.tnpm.oa.com/escape-html/download/escape-html-1.0.3.tgz", 982 | "dev": true 983 | }, 984 | "escape-string-regexp": { 985 | "version": "1.0.5", 986 | "from": "escape-string-regexp@>=1.0.2 <2.0.0", 987 | "resolved": "http://r.tnpm.oa.com/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", 988 | "dev": true 989 | }, 990 | "esutils": { 991 | "version": "2.0.2", 992 | "from": "esutils@>=2.0.2 <3.0.0", 993 | "resolved": "http://r.tnpm.oa.com/esutils/download/esutils-2.0.2.tgz", 994 | "dev": true 995 | }, 996 | "etag": { 997 | "version": "1.8.0", 998 | "from": "etag@>=1.8.0 <1.9.0", 999 | "resolved": "http://r.tnpm.oa.com/etag/download/etag-1.8.0.tgz", 1000 | "dev": true 1001 | }, 1002 | "eventemitter3": { 1003 | "version": "1.2.0", 1004 | "from": "eventemitter3@>=1.0.0 <2.0.0", 1005 | "resolved": "http://r.tnpm.oa.com/eventemitter3/download/eventemitter3-1.2.0.tgz", 1006 | "dev": true 1007 | }, 1008 | "events": { 1009 | "version": "1.1.1", 1010 | "from": "events@>=1.0.0 <2.0.0", 1011 | "resolved": "http://r.tnpm.oa.com/events/download/events-1.1.1.tgz", 1012 | "dev": true 1013 | }, 1014 | "eventsource": { 1015 | "version": "0.1.6", 1016 | "from": "eventsource@0.1.6", 1017 | "resolved": "http://r.tnpm.oa.com/eventsource/download/eventsource-0.1.6.tgz", 1018 | "dev": true 1019 | }, 1020 | "evp_bytestokey": { 1021 | "version": "1.0.0", 1022 | "from": "evp_bytestokey@>=1.0.0 <2.0.0", 1023 | "resolved": "http://r.tnpm.oa.com/evp_bytestokey/download/evp_bytestokey-1.0.0.tgz", 1024 | "dev": true 1025 | }, 1026 | "expand-brackets": { 1027 | "version": "0.1.5", 1028 | "from": "expand-brackets@>=0.1.4 <0.2.0", 1029 | "resolved": "http://r.tnpm.oa.com/expand-brackets/download/expand-brackets-0.1.5.tgz", 1030 | "dev": true 1031 | }, 1032 | "expand-range": { 1033 | "version": "1.8.2", 1034 | "from": "expand-range@>=1.8.1 <2.0.0", 1035 | "resolved": "http://r.tnpm.oa.com/expand-range/download/expand-range-1.8.2.tgz", 1036 | "dev": true 1037 | }, 1038 | "express": { 1039 | "version": "4.15.2", 1040 | "from": "express@>=4.13.3 <5.0.0", 1041 | "resolved": "http://r.tnpm.oa.com/express/download/express-4.15.2.tgz", 1042 | "dev": true, 1043 | "dependencies": { 1044 | "debug": { 1045 | "version": "2.6.1", 1046 | "from": "debug@2.6.1", 1047 | "resolved": "http://r.tnpm.oa.com/debug/download/debug-2.6.1.tgz", 1048 | "dev": true 1049 | } 1050 | } 1051 | }, 1052 | "extglob": { 1053 | "version": "0.3.2", 1054 | "from": "extglob@>=0.3.1 <0.4.0", 1055 | "resolved": "http://r.tnpm.oa.com/extglob/download/extglob-0.3.2.tgz", 1056 | "dev": true 1057 | }, 1058 | "faye-websocket": { 1059 | "version": "0.10.0", 1060 | "from": "faye-websocket@>=0.10.0 <0.11.0", 1061 | "resolved": "http://r.tnpm.oa.com/faye-websocket/download/faye-websocket-0.10.0.tgz", 1062 | "dev": true 1063 | }, 1064 | "fbjs": { 1065 | "version": "0.8.9", 1066 | "from": "fbjs@>=0.8.4 <0.9.0", 1067 | "resolved": "http://r.tnpm.oa.com/fbjs/download/fbjs-0.8.9.tgz" 1068 | }, 1069 | "filename-regex": { 1070 | "version": "2.0.0", 1071 | "from": "filename-regex@>=2.0.0 <3.0.0", 1072 | "resolved": "http://r.tnpm.oa.com/filename-regex/download/filename-regex-2.0.0.tgz", 1073 | "dev": true 1074 | }, 1075 | "fill-range": { 1076 | "version": "2.2.3", 1077 | "from": "fill-range@>=2.1.0 <3.0.0", 1078 | "resolved": "http://r.tnpm.oa.com/fill-range/download/fill-range-2.2.3.tgz", 1079 | "dev": true 1080 | }, 1081 | "finalhandler": { 1082 | "version": "1.0.0", 1083 | "from": "finalhandler@>=1.0.0 <1.1.0", 1084 | "resolved": "http://r.tnpm.oa.com/finalhandler/download/finalhandler-1.0.0.tgz", 1085 | "dev": true, 1086 | "dependencies": { 1087 | "debug": { 1088 | "version": "2.6.1", 1089 | "from": "debug@2.6.1", 1090 | "resolved": "http://r.tnpm.oa.com/debug/download/debug-2.6.1.tgz", 1091 | "dev": true 1092 | } 1093 | } 1094 | }, 1095 | "find-cache-dir": { 1096 | "version": "0.1.1", 1097 | "from": "find-cache-dir@>=0.1.1 <0.2.0", 1098 | "resolved": "http://r.tnpm.oa.com/find-cache-dir/download/find-cache-dir-0.1.1.tgz", 1099 | "dev": true 1100 | }, 1101 | "find-up": { 1102 | "version": "1.1.2", 1103 | "from": "find-up@>=1.0.0 <2.0.0", 1104 | "resolved": "http://r.tnpm.oa.com/find-up/download/find-up-1.1.2.tgz", 1105 | "dev": true 1106 | }, 1107 | "for-in": { 1108 | "version": "1.0.2", 1109 | "from": "for-in@>=1.0.1 <2.0.0", 1110 | "resolved": "http://r.tnpm.oa.com/for-in/download/for-in-1.0.2.tgz", 1111 | "dev": true 1112 | }, 1113 | "for-own": { 1114 | "version": "0.1.5", 1115 | "from": "for-own@>=0.1.4 <0.2.0", 1116 | "resolved": "http://r.tnpm.oa.com/for-own/download/for-own-0.1.5.tgz", 1117 | "dev": true 1118 | }, 1119 | "forwarded": { 1120 | "version": "0.1.0", 1121 | "from": "forwarded@>=0.1.0 <0.2.0", 1122 | "resolved": "http://r.tnpm.oa.com/forwarded/download/forwarded-0.1.0.tgz", 1123 | "dev": true 1124 | }, 1125 | "fresh": { 1126 | "version": "0.5.0", 1127 | "from": "fresh@0.5.0", 1128 | "resolved": "http://r.tnpm.oa.com/fresh/download/fresh-0.5.0.tgz", 1129 | "dev": true 1130 | }, 1131 | "get-caller-file": { 1132 | "version": "1.0.2", 1133 | "from": "get-caller-file@>=1.0.1 <2.0.0", 1134 | "resolved": "http://r.tnpm.oa.com/get-caller-file/download/get-caller-file-1.0.2.tgz", 1135 | "dev": true 1136 | }, 1137 | "glob-base": { 1138 | "version": "0.3.0", 1139 | "from": "glob-base@>=0.3.0 <0.4.0", 1140 | "resolved": "http://r.tnpm.oa.com/glob-base/download/glob-base-0.3.0.tgz", 1141 | "dev": true 1142 | }, 1143 | "glob-parent": { 1144 | "version": "2.0.0", 1145 | "from": "glob-parent@>=2.0.0 <3.0.0", 1146 | "resolved": "http://r.tnpm.oa.com/glob-parent/download/glob-parent-2.0.0.tgz", 1147 | "dev": true 1148 | }, 1149 | "global": { 1150 | "version": "4.3.1", 1151 | "from": "global@>=4.3.0 <5.0.0", 1152 | "resolved": "http://r.tnpm.oa.com/global/download/global-4.3.1.tgz", 1153 | "dev": true 1154 | }, 1155 | "globals": { 1156 | "version": "9.16.0", 1157 | "from": "globals@>=9.0.0 <10.0.0", 1158 | "resolved": "http://r.tnpm.oa.com/globals/download/globals-9.16.0.tgz", 1159 | "dev": true 1160 | }, 1161 | "graceful-fs": { 1162 | "version": "4.1.11", 1163 | "from": "graceful-fs@>=4.1.2 <5.0.0", 1164 | "resolved": "http://r.tnpm.oa.com/graceful-fs/download/graceful-fs-4.1.11.tgz", 1165 | "dev": true 1166 | }, 1167 | "handle-thing": { 1168 | "version": "1.2.5", 1169 | "from": "handle-thing@>=1.2.4 <2.0.0", 1170 | "resolved": "http://r.tnpm.oa.com/handle-thing/download/handle-thing-1.2.5.tgz", 1171 | "dev": true 1172 | }, 1173 | "has-ansi": { 1174 | "version": "2.0.0", 1175 | "from": "has-ansi@>=2.0.0 <3.0.0", 1176 | "resolved": "http://r.tnpm.oa.com/has-ansi/download/has-ansi-2.0.0.tgz", 1177 | "dev": true 1178 | }, 1179 | "has-flag": { 1180 | "version": "1.0.0", 1181 | "from": "has-flag@>=1.0.0 <2.0.0", 1182 | "resolved": "http://r.tnpm.oa.com/has-flag/download/has-flag-1.0.0.tgz", 1183 | "dev": true 1184 | }, 1185 | "hash.js": { 1186 | "version": "1.0.3", 1187 | "from": "hash.js@>=1.0.0 <2.0.0", 1188 | "resolved": "http://r.tnpm.oa.com/hash.js/download/hash.js-1.0.3.tgz", 1189 | "dev": true 1190 | }, 1191 | "history": { 1192 | "version": "4.6.1", 1193 | "from": "history@>=4.6.0 <5.0.0", 1194 | "resolved": "http://r.tnpm.oa.com/history/download/history-4.6.1.tgz" 1195 | }, 1196 | "hmac-drbg": { 1197 | "version": "1.0.0", 1198 | "from": "hmac-drbg@>=1.0.0 <2.0.0", 1199 | "resolved": "http://r.tnpm.oa.com/hmac-drbg/download/hmac-drbg-1.0.0.tgz", 1200 | "dev": true 1201 | }, 1202 | "hoist-non-react-statics": { 1203 | "version": "1.2.0", 1204 | "from": "hoist-non-react-statics@>=1.0.0 <2.0.0", 1205 | "resolved": "http://r.tnpm.oa.com/hoist-non-react-statics/download/hoist-non-react-statics-1.2.0.tgz" 1206 | }, 1207 | "home-or-tmp": { 1208 | "version": "2.0.0", 1209 | "from": "home-or-tmp@>=2.0.0 <3.0.0", 1210 | "resolved": "http://r.tnpm.oa.com/home-or-tmp/download/home-or-tmp-2.0.0.tgz", 1211 | "dev": true 1212 | }, 1213 | "hosted-git-info": { 1214 | "version": "2.2.0", 1215 | "from": "hosted-git-info@>=2.1.4 <3.0.0", 1216 | "resolved": "http://r.tnpm.oa.com/hosted-git-info/download/hosted-git-info-2.2.0.tgz", 1217 | "dev": true 1218 | }, 1219 | "hpack.js": { 1220 | "version": "2.1.6", 1221 | "from": "hpack.js@>=2.1.6 <3.0.0", 1222 | "resolved": "http://r.tnpm.oa.com/hpack.js/download/hpack.js-2.1.6.tgz", 1223 | "dev": true 1224 | }, 1225 | "html-entities": { 1226 | "version": "1.2.0", 1227 | "from": "html-entities@>=1.2.0 <2.0.0", 1228 | "resolved": "http://r.tnpm.oa.com/html-entities/download/html-entities-1.2.0.tgz", 1229 | "dev": true 1230 | }, 1231 | "http-deceiver": { 1232 | "version": "1.2.7", 1233 | "from": "http-deceiver@>=1.2.4 <2.0.0", 1234 | "resolved": "http://r.tnpm.oa.com/http-deceiver/download/http-deceiver-1.2.7.tgz", 1235 | "dev": true 1236 | }, 1237 | "http-errors": { 1238 | "version": "1.6.1", 1239 | "from": "http-errors@>=1.6.1 <1.7.0", 1240 | "resolved": "http://r.tnpm.oa.com/http-errors/download/http-errors-1.6.1.tgz", 1241 | "dev": true 1242 | }, 1243 | "http-proxy": { 1244 | "version": "1.16.2", 1245 | "from": "http-proxy@>=1.16.2 <2.0.0", 1246 | "resolved": "http://r.tnpm.oa.com/http-proxy/download/http-proxy-1.16.2.tgz", 1247 | "dev": true 1248 | }, 1249 | "http-proxy-middleware": { 1250 | "version": "0.17.4", 1251 | "from": "http-proxy-middleware@>=0.17.4 <0.18.0", 1252 | "resolved": "http://r.tnpm.oa.com/http-proxy-middleware/download/http-proxy-middleware-0.17.4.tgz", 1253 | "dev": true, 1254 | "dependencies": { 1255 | "is-extglob": { 1256 | "version": "2.1.1", 1257 | "from": "is-extglob@>=2.1.0 <3.0.0", 1258 | "resolved": "http://r.tnpm.oa.com/is-extglob/download/is-extglob-2.1.1.tgz", 1259 | "dev": true 1260 | }, 1261 | "is-glob": { 1262 | "version": "3.1.0", 1263 | "from": "is-glob@>=3.1.0 <4.0.0", 1264 | "resolved": "http://r.tnpm.oa.com/is-glob/download/is-glob-3.1.0.tgz", 1265 | "dev": true 1266 | } 1267 | } 1268 | }, 1269 | "https-browserify": { 1270 | "version": "0.0.1", 1271 | "from": "https-browserify@0.0.1", 1272 | "resolved": "http://r.tnpm.oa.com/https-browserify/download/https-browserify-0.0.1.tgz", 1273 | "dev": true 1274 | }, 1275 | "hyphenate-style-name": { 1276 | "version": "1.0.2", 1277 | "from": "hyphenate-style-name@>=1.0.1 <2.0.0", 1278 | "resolved": "http://r.tnpm.oa.com/hyphenate-style-name/download/hyphenate-style-name-1.0.2.tgz" 1279 | }, 1280 | "iconv-lite": { 1281 | "version": "0.4.15", 1282 | "from": "iconv-lite@>=0.4.13 <0.5.0", 1283 | "resolved": "http://r.tnpm.oa.com/iconv-lite/download/iconv-lite-0.4.15.tgz" 1284 | }, 1285 | "ieee754": { 1286 | "version": "1.1.8", 1287 | "from": "ieee754@>=1.1.4 <2.0.0", 1288 | "resolved": "http://r.tnpm.oa.com/ieee754/download/ieee754-1.1.8.tgz", 1289 | "dev": true 1290 | }, 1291 | "indexof": { 1292 | "version": "0.0.1", 1293 | "from": "indexof@0.0.1", 1294 | "resolved": "http://r.tnpm.oa.com/indexof/download/indexof-0.0.1.tgz", 1295 | "dev": true 1296 | }, 1297 | "inherits": { 1298 | "version": "2.0.3", 1299 | "from": "inherits@>=2.0.1 <2.1.0", 1300 | "resolved": "http://r.tnpm.oa.com/inherits/download/inherits-2.0.3.tgz", 1301 | "dev": true 1302 | }, 1303 | "inline-style-prefixer": { 1304 | "version": "2.0.5", 1305 | "from": "inline-style-prefixer@>=2.0.1 <3.0.0", 1306 | "resolved": "http://r.tnpm.oa.com/inline-style-prefixer/download/inline-style-prefixer-2.0.5.tgz" 1307 | }, 1308 | "interpret": { 1309 | "version": "1.0.1", 1310 | "from": "interpret@>=1.0.0 <2.0.0", 1311 | "resolved": "http://r.tnpm.oa.com/interpret/download/interpret-1.0.1.tgz", 1312 | "dev": true 1313 | }, 1314 | "invariant": { 1315 | "version": "2.2.2", 1316 | "from": "invariant@>=2.2.0 <3.0.0", 1317 | "resolved": "http://r.tnpm.oa.com/invariant/download/invariant-2.2.2.tgz" 1318 | }, 1319 | "invert-kv": { 1320 | "version": "1.0.0", 1321 | "from": "invert-kv@>=1.0.0 <2.0.0", 1322 | "resolved": "http://r.tnpm.oa.com/invert-kv/download/invert-kv-1.0.0.tgz", 1323 | "dev": true 1324 | }, 1325 | "ipaddr.js": { 1326 | "version": "1.2.0", 1327 | "from": "ipaddr.js@1.2.0", 1328 | "resolved": "http://r.tnpm.oa.com/ipaddr.js/download/ipaddr.js-1.2.0.tgz", 1329 | "dev": true 1330 | }, 1331 | "is-arrayish": { 1332 | "version": "0.2.1", 1333 | "from": "is-arrayish@>=0.2.1 <0.3.0", 1334 | "resolved": "http://r.tnpm.oa.com/is-arrayish/download/is-arrayish-0.2.1.tgz", 1335 | "dev": true 1336 | }, 1337 | "is-binary-path": { 1338 | "version": "1.0.1", 1339 | "from": "is-binary-path@>=1.0.0 <2.0.0", 1340 | "resolved": "http://r.tnpm.oa.com/is-binary-path/download/is-binary-path-1.0.1.tgz", 1341 | "dev": true 1342 | }, 1343 | "is-buffer": { 1344 | "version": "1.1.5", 1345 | "from": "is-buffer@>=1.0.2 <2.0.0", 1346 | "resolved": "http://r.tnpm.oa.com/is-buffer/download/is-buffer-1.1.5.tgz", 1347 | "dev": true 1348 | }, 1349 | "is-builtin-module": { 1350 | "version": "1.0.0", 1351 | "from": "is-builtin-module@>=1.0.0 <2.0.0", 1352 | "resolved": "http://r.tnpm.oa.com/is-builtin-module/download/is-builtin-module-1.0.0.tgz", 1353 | "dev": true 1354 | }, 1355 | "is-dotfile": { 1356 | "version": "1.0.2", 1357 | "from": "is-dotfile@>=1.0.0 <2.0.0", 1358 | "resolved": "http://r.tnpm.oa.com/is-dotfile/download/is-dotfile-1.0.2.tgz", 1359 | "dev": true 1360 | }, 1361 | "is-equal-shallow": { 1362 | "version": "0.1.3", 1363 | "from": "is-equal-shallow@>=0.1.3 <0.2.0", 1364 | "resolved": "http://r.tnpm.oa.com/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz", 1365 | "dev": true 1366 | }, 1367 | "is-extendable": { 1368 | "version": "0.1.1", 1369 | "from": "is-extendable@>=0.1.1 <0.2.0", 1370 | "resolved": "http://r.tnpm.oa.com/is-extendable/download/is-extendable-0.1.1.tgz", 1371 | "dev": true 1372 | }, 1373 | "is-extglob": { 1374 | "version": "1.0.0", 1375 | "from": "is-extglob@>=1.0.0 <2.0.0", 1376 | "resolved": "http://r.tnpm.oa.com/is-extglob/download/is-extglob-1.0.0.tgz", 1377 | "dev": true 1378 | }, 1379 | "is-finite": { 1380 | "version": "1.0.2", 1381 | "from": "is-finite@>=1.0.0 <2.0.0", 1382 | "resolved": "http://r.tnpm.oa.com/is-finite/download/is-finite-1.0.2.tgz", 1383 | "dev": true 1384 | }, 1385 | "is-fullwidth-code-point": { 1386 | "version": "1.0.0", 1387 | "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", 1388 | "resolved": "http://r.tnpm.oa.com/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", 1389 | "dev": true 1390 | }, 1391 | "is-glob": { 1392 | "version": "2.0.1", 1393 | "from": "is-glob@>=2.0.0 <3.0.0", 1394 | "resolved": "http://r.tnpm.oa.com/is-glob/download/is-glob-2.0.1.tgz", 1395 | "dev": true 1396 | }, 1397 | "is-number": { 1398 | "version": "2.1.0", 1399 | "from": "is-number@>=2.1.0 <3.0.0", 1400 | "resolved": "http://r.tnpm.oa.com/is-number/download/is-number-2.1.0.tgz", 1401 | "dev": true 1402 | }, 1403 | "is-posix-bracket": { 1404 | "version": "0.1.1", 1405 | "from": "is-posix-bracket@>=0.1.0 <0.2.0", 1406 | "resolved": "http://r.tnpm.oa.com/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz", 1407 | "dev": true 1408 | }, 1409 | "is-primitive": { 1410 | "version": "2.0.0", 1411 | "from": "is-primitive@>=2.0.0 <3.0.0", 1412 | "resolved": "http://r.tnpm.oa.com/is-primitive/download/is-primitive-2.0.0.tgz", 1413 | "dev": true 1414 | }, 1415 | "is-stream": { 1416 | "version": "1.1.0", 1417 | "from": "is-stream@>=1.0.1 <2.0.0", 1418 | "resolved": "http://r.tnpm.oa.com/is-stream/download/is-stream-1.1.0.tgz" 1419 | }, 1420 | "is-utf8": { 1421 | "version": "0.2.1", 1422 | "from": "is-utf8@>=0.2.0 <0.3.0", 1423 | "resolved": "http://r.tnpm.oa.com/is-utf8/download/is-utf8-0.2.1.tgz", 1424 | "dev": true 1425 | }, 1426 | "isarray": { 1427 | "version": "1.0.0", 1428 | "from": "isarray@>=1.0.0 <1.1.0", 1429 | "resolved": "http://r.tnpm.oa.com/isarray/download/isarray-1.0.0.tgz", 1430 | "dev": true 1431 | }, 1432 | "isobject": { 1433 | "version": "2.1.0", 1434 | "from": "isobject@>=2.0.0 <3.0.0", 1435 | "resolved": "http://r.tnpm.oa.com/isobject/download/isobject-2.1.0.tgz", 1436 | "dev": true 1437 | }, 1438 | "isomorphic-fetch": { 1439 | "version": "2.2.1", 1440 | "from": "isomorphic-fetch@>=2.1.1 <3.0.0", 1441 | "resolved": "http://r.tnpm.oa.com/isomorphic-fetch/download/isomorphic-fetch-2.2.1.tgz" 1442 | }, 1443 | "js-tokens": { 1444 | "version": "3.0.1", 1445 | "from": "js-tokens@>=3.0.0 <4.0.0", 1446 | "resolved": "http://r.tnpm.oa.com/js-tokens/download/js-tokens-3.0.1.tgz" 1447 | }, 1448 | "jsesc": { 1449 | "version": "1.3.0", 1450 | "from": "jsesc@>=1.3.0 <2.0.0", 1451 | "resolved": "http://r.tnpm.oa.com/jsesc/download/jsesc-1.3.0.tgz", 1452 | "dev": true 1453 | }, 1454 | "json-loader": { 1455 | "version": "0.5.4", 1456 | "from": "json-loader@>=0.5.4 <0.6.0", 1457 | "resolved": "http://r.tnpm.oa.com/json-loader/download/json-loader-0.5.4.tgz", 1458 | "dev": true 1459 | }, 1460 | "json-stable-stringify": { 1461 | "version": "1.0.1", 1462 | "from": "json-stable-stringify@>=1.0.1 <2.0.0", 1463 | "resolved": "http://r.tnpm.oa.com/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz", 1464 | "dev": true 1465 | }, 1466 | "json3": { 1467 | "version": "3.3.2", 1468 | "from": "json3@>=3.3.2 <4.0.0", 1469 | "resolved": "http://r.tnpm.oa.com/json3/download/json3-3.3.2.tgz", 1470 | "dev": true 1471 | }, 1472 | "json5": { 1473 | "version": "0.5.1", 1474 | "from": "json5@>=0.5.0 <0.6.0", 1475 | "resolved": "http://r.tnpm.oa.com/json5/download/json5-0.5.1.tgz", 1476 | "dev": true 1477 | }, 1478 | "jsonify": { 1479 | "version": "0.0.0", 1480 | "from": "jsonify@>=0.0.0 <0.1.0", 1481 | "resolved": "http://r.tnpm.oa.com/jsonify/download/jsonify-0.0.0.tgz", 1482 | "dev": true 1483 | }, 1484 | "keycode": { 1485 | "version": "2.1.8", 1486 | "from": "keycode@>=2.1.1 <3.0.0", 1487 | "resolved": "http://r.tnpm.oa.com/keycode/download/keycode-2.1.8.tgz" 1488 | }, 1489 | "kind-of": { 1490 | "version": "3.1.0", 1491 | "from": "kind-of@>=3.0.2 <4.0.0", 1492 | "resolved": "http://r.tnpm.oa.com/kind-of/download/kind-of-3.1.0.tgz", 1493 | "dev": true 1494 | }, 1495 | "lazy-cache": { 1496 | "version": "1.0.4", 1497 | "from": "lazy-cache@>=1.0.3 <2.0.0", 1498 | "resolved": "http://r.tnpm.oa.com/lazy-cache/download/lazy-cache-1.0.4.tgz", 1499 | "dev": true 1500 | }, 1501 | "lcid": { 1502 | "version": "1.0.0", 1503 | "from": "lcid@>=1.0.0 <2.0.0", 1504 | "resolved": "http://r.tnpm.oa.com/lcid/download/lcid-1.0.0.tgz", 1505 | "dev": true 1506 | }, 1507 | "load-json-file": { 1508 | "version": "1.1.0", 1509 | "from": "load-json-file@>=1.0.0 <2.0.0", 1510 | "resolved": "http://r.tnpm.oa.com/load-json-file/download/load-json-file-1.1.0.tgz", 1511 | "dev": true 1512 | }, 1513 | "loader-runner": { 1514 | "version": "2.3.0", 1515 | "from": "loader-runner@>=2.3.0 <3.0.0", 1516 | "resolved": "http://r.tnpm.oa.com/loader-runner/download/loader-runner-2.3.0.tgz", 1517 | "dev": true 1518 | }, 1519 | "loader-utils": { 1520 | "version": "0.2.17", 1521 | "from": "loader-utils@>=0.2.16 <0.3.0", 1522 | "resolved": "http://r.tnpm.oa.com/loader-utils/download/loader-utils-0.2.17.tgz", 1523 | "dev": true 1524 | }, 1525 | "lodash": { 1526 | "version": "4.17.4", 1527 | "from": "lodash@>=4.2.0 <5.0.0", 1528 | "resolved": "http://r.tnpm.oa.com/lodash/download/lodash-4.17.4.tgz", 1529 | "dev": true 1530 | }, 1531 | "lodash.merge": { 1532 | "version": "4.6.0", 1533 | "from": "lodash.merge@>=4.6.0 <5.0.0", 1534 | "resolved": "http://r.tnpm.oa.com/lodash.merge/download/lodash.merge-4.6.0.tgz" 1535 | }, 1536 | "lodash.throttle": { 1537 | "version": "4.1.1", 1538 | "from": "lodash.throttle@>=4.1.1 <5.0.0", 1539 | "resolved": "http://r.tnpm.oa.com/lodash.throttle/download/lodash.throttle-4.1.1.tgz" 1540 | }, 1541 | "longest": { 1542 | "version": "1.0.1", 1543 | "from": "longest@>=1.0.1 <2.0.0", 1544 | "resolved": "http://r.tnpm.oa.com/longest/download/longest-1.0.1.tgz", 1545 | "dev": true 1546 | }, 1547 | "loose-envify": { 1548 | "version": "1.3.1", 1549 | "from": "loose-envify@>=1.1.0 <2.0.0", 1550 | "resolved": "http://r.tnpm.oa.com/loose-envify/download/loose-envify-1.3.1.tgz" 1551 | }, 1552 | "material-ui": { 1553 | "version": "0.17.1", 1554 | "from": "material-ui@latest", 1555 | "resolved": "http://r.tnpm.oa.com/material-ui/download/material-ui-0.17.1.tgz" 1556 | }, 1557 | "media-typer": { 1558 | "version": "0.3.0", 1559 | "from": "media-typer@0.3.0", 1560 | "resolved": "http://r.tnpm.oa.com/media-typer/download/media-typer-0.3.0.tgz", 1561 | "dev": true 1562 | }, 1563 | "memory-fs": { 1564 | "version": "0.4.1", 1565 | "from": "memory-fs@>=0.4.1 <0.5.0", 1566 | "resolved": "http://r.tnpm.oa.com/memory-fs/download/memory-fs-0.4.1.tgz", 1567 | "dev": true 1568 | }, 1569 | "merge-descriptors": { 1570 | "version": "1.0.1", 1571 | "from": "merge-descriptors@1.0.1", 1572 | "resolved": "http://r.tnpm.oa.com/merge-descriptors/download/merge-descriptors-1.0.1.tgz", 1573 | "dev": true 1574 | }, 1575 | "methods": { 1576 | "version": "1.1.2", 1577 | "from": "methods@>=1.1.2 <1.2.0", 1578 | "resolved": "http://r.tnpm.oa.com/methods/download/methods-1.1.2.tgz", 1579 | "dev": true 1580 | }, 1581 | "micromatch": { 1582 | "version": "2.3.11", 1583 | "from": "micromatch@>=2.1.5 <3.0.0", 1584 | "resolved": "http://r.tnpm.oa.com/micromatch/download/micromatch-2.3.11.tgz", 1585 | "dev": true 1586 | }, 1587 | "miller-rabin": { 1588 | "version": "4.0.0", 1589 | "from": "miller-rabin@>=4.0.0 <5.0.0", 1590 | "resolved": "http://r.tnpm.oa.com/miller-rabin/download/miller-rabin-4.0.0.tgz", 1591 | "dev": true 1592 | }, 1593 | "mime": { 1594 | "version": "1.3.4", 1595 | "from": "mime@1.3.4", 1596 | "resolved": "http://r.tnpm.oa.com/mime/download/mime-1.3.4.tgz", 1597 | "dev": true 1598 | }, 1599 | "mime-db": { 1600 | "version": "1.26.0", 1601 | "from": "mime-db@>=1.26.0 <1.27.0", 1602 | "resolved": "http://r.tnpm.oa.com/mime-db/download/mime-db-1.26.0.tgz", 1603 | "dev": true 1604 | }, 1605 | "mime-types": { 1606 | "version": "2.1.14", 1607 | "from": "mime-types@>=2.1.11 <2.2.0", 1608 | "resolved": "http://r.tnpm.oa.com/mime-types/download/mime-types-2.1.14.tgz", 1609 | "dev": true 1610 | }, 1611 | "min-document": { 1612 | "version": "2.19.0", 1613 | "from": "min-document@>=2.19.0 <3.0.0", 1614 | "resolved": "http://r.tnpm.oa.com/min-document/download/min-document-2.19.0.tgz", 1615 | "dev": true 1616 | }, 1617 | "minimalistic-assert": { 1618 | "version": "1.0.0", 1619 | "from": "minimalistic-assert@>=1.0.0 <2.0.0", 1620 | "resolved": "http://r.tnpm.oa.com/minimalistic-assert/download/minimalistic-assert-1.0.0.tgz", 1621 | "dev": true 1622 | }, 1623 | "minimalistic-crypto-utils": { 1624 | "version": "1.0.1", 1625 | "from": "minimalistic-crypto-utils@>=1.0.0 <2.0.0", 1626 | "resolved": "http://r.tnpm.oa.com/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz", 1627 | "dev": true 1628 | }, 1629 | "minimatch": { 1630 | "version": "3.0.3", 1631 | "from": "minimatch@>=3.0.2 <4.0.0", 1632 | "resolved": "http://r.tnpm.oa.com/minimatch/download/minimatch-3.0.3.tgz", 1633 | "dev": true 1634 | }, 1635 | "minimist": { 1636 | "version": "0.0.8", 1637 | "from": "minimist@0.0.8", 1638 | "resolved": "http://r.tnpm.oa.com/minimist/download/minimist-0.0.8.tgz", 1639 | "dev": true 1640 | }, 1641 | "mkdirp": { 1642 | "version": "0.5.1", 1643 | "from": "mkdirp@>=0.5.1 <0.6.0", 1644 | "resolved": "http://r.tnpm.oa.com/mkdirp/download/mkdirp-0.5.1.tgz", 1645 | "dev": true 1646 | }, 1647 | "ms": { 1648 | "version": "0.7.2", 1649 | "from": "ms@0.7.2", 1650 | "resolved": "http://r.tnpm.oa.com/ms/download/ms-0.7.2.tgz", 1651 | "dev": true 1652 | }, 1653 | "negotiator": { 1654 | "version": "0.6.1", 1655 | "from": "negotiator@0.6.1", 1656 | "resolved": "http://r.tnpm.oa.com/negotiator/download/negotiator-0.6.1.tgz", 1657 | "dev": true 1658 | }, 1659 | "node-fetch": { 1660 | "version": "1.6.3", 1661 | "from": "node-fetch@>=1.0.1 <2.0.0", 1662 | "resolved": "http://r.tnpm.oa.com/node-fetch/download/node-fetch-1.6.3.tgz" 1663 | }, 1664 | "node-libs-browser": { 1665 | "version": "2.0.0", 1666 | "from": "node-libs-browser@>=2.0.0 <3.0.0", 1667 | "resolved": "http://r.tnpm.oa.com/node-libs-browser/download/node-libs-browser-2.0.0.tgz", 1668 | "dev": true, 1669 | "dependencies": { 1670 | "process": { 1671 | "version": "0.11.9", 1672 | "from": "process@>=0.11.0 <0.12.0", 1673 | "resolved": "http://r.tnpm.oa.com/process/download/process-0.11.9.tgz", 1674 | "dev": true 1675 | } 1676 | } 1677 | }, 1678 | "normalize-package-data": { 1679 | "version": "2.3.6", 1680 | "from": "normalize-package-data@>=2.3.2 <3.0.0", 1681 | "resolved": "http://r.tnpm.oa.com/normalize-package-data/download/normalize-package-data-2.3.6.tgz", 1682 | "dev": true 1683 | }, 1684 | "normalize-path": { 1685 | "version": "2.0.1", 1686 | "from": "normalize-path@>=2.0.1 <3.0.0", 1687 | "resolved": "http://r.tnpm.oa.com/normalize-path/download/normalize-path-2.0.1.tgz", 1688 | "dev": true 1689 | }, 1690 | "number-is-nan": { 1691 | "version": "1.0.1", 1692 | "from": "number-is-nan@>=1.0.0 <2.0.0", 1693 | "resolved": "http://r.tnpm.oa.com/number-is-nan/download/number-is-nan-1.0.1.tgz", 1694 | "dev": true 1695 | }, 1696 | "object-assign": { 1697 | "version": "4.1.1", 1698 | "from": "object-assign@>=4.1.0 <5.0.0", 1699 | "resolved": "http://r.tnpm.oa.com/object-assign/download/object-assign-4.1.1.tgz" 1700 | }, 1701 | "object.omit": { 1702 | "version": "2.0.1", 1703 | "from": "object.omit@>=2.0.0 <3.0.0", 1704 | "resolved": "http://r.tnpm.oa.com/object.omit/download/object.omit-2.0.1.tgz", 1705 | "dev": true 1706 | }, 1707 | "obuf": { 1708 | "version": "1.1.1", 1709 | "from": "obuf@>=1.1.0 <2.0.0", 1710 | "resolved": "http://r.tnpm.oa.com/obuf/download/obuf-1.1.1.tgz", 1711 | "dev": true 1712 | }, 1713 | "on-finished": { 1714 | "version": "2.3.0", 1715 | "from": "on-finished@>=2.3.0 <2.4.0", 1716 | "resolved": "http://r.tnpm.oa.com/on-finished/download/on-finished-2.3.0.tgz", 1717 | "dev": true 1718 | }, 1719 | "on-headers": { 1720 | "version": "1.0.1", 1721 | "from": "on-headers@>=1.0.1 <1.1.0", 1722 | "resolved": "http://r.tnpm.oa.com/on-headers/download/on-headers-1.0.1.tgz", 1723 | "dev": true 1724 | }, 1725 | "opn": { 1726 | "version": "4.0.2", 1727 | "from": "opn@4.0.2", 1728 | "resolved": "http://r.tnpm.oa.com/opn/download/opn-4.0.2.tgz", 1729 | "dev": true 1730 | }, 1731 | "original": { 1732 | "version": "1.0.0", 1733 | "from": "original@>=0.0.5", 1734 | "resolved": "http://r.tnpm.oa.com/original/download/original-1.0.0.tgz", 1735 | "dev": true, 1736 | "dependencies": { 1737 | "url-parse": { 1738 | "version": "1.0.5", 1739 | "from": "url-parse@>=1.0.0 <1.1.0", 1740 | "resolved": "http://r.tnpm.oa.com/url-parse/download/url-parse-1.0.5.tgz", 1741 | "dev": true 1742 | } 1743 | } 1744 | }, 1745 | "os-browserify": { 1746 | "version": "0.2.1", 1747 | "from": "os-browserify@>=0.2.0 <0.3.0", 1748 | "resolved": "http://r.tnpm.oa.com/os-browserify/download/os-browserify-0.2.1.tgz", 1749 | "dev": true 1750 | }, 1751 | "os-homedir": { 1752 | "version": "1.0.2", 1753 | "from": "os-homedir@>=1.0.0 <2.0.0", 1754 | "resolved": "http://r.tnpm.oa.com/os-homedir/download/os-homedir-1.0.2.tgz", 1755 | "dev": true 1756 | }, 1757 | "os-locale": { 1758 | "version": "1.4.0", 1759 | "from": "os-locale@>=1.4.0 <2.0.0", 1760 | "resolved": "http://r.tnpm.oa.com/os-locale/download/os-locale-1.4.0.tgz", 1761 | "dev": true 1762 | }, 1763 | "os-tmpdir": { 1764 | "version": "1.0.2", 1765 | "from": "os-tmpdir@>=1.0.1 <2.0.0", 1766 | "resolved": "http://r.tnpm.oa.com/os-tmpdir/download/os-tmpdir-1.0.2.tgz", 1767 | "dev": true 1768 | }, 1769 | "pako": { 1770 | "version": "0.2.9", 1771 | "from": "pako@>=0.2.0 <0.3.0", 1772 | "resolved": "http://r.tnpm.oa.com/pako/download/pako-0.2.9.tgz", 1773 | "dev": true 1774 | }, 1775 | "parse-asn1": { 1776 | "version": "5.1.0", 1777 | "from": "parse-asn1@>=5.0.0 <6.0.0", 1778 | "resolved": "http://r.tnpm.oa.com/parse-asn1/download/parse-asn1-5.1.0.tgz", 1779 | "dev": true 1780 | }, 1781 | "parse-glob": { 1782 | "version": "3.0.4", 1783 | "from": "parse-glob@>=3.0.4 <4.0.0", 1784 | "resolved": "http://r.tnpm.oa.com/parse-glob/download/parse-glob-3.0.4.tgz", 1785 | "dev": true 1786 | }, 1787 | "parse-json": { 1788 | "version": "2.2.0", 1789 | "from": "parse-json@>=2.2.0 <3.0.0", 1790 | "resolved": "http://r.tnpm.oa.com/parse-json/download/parse-json-2.2.0.tgz", 1791 | "dev": true 1792 | }, 1793 | "parseurl": { 1794 | "version": "1.3.1", 1795 | "from": "parseurl@>=1.3.1 <1.4.0", 1796 | "resolved": "http://r.tnpm.oa.com/parseurl/download/parseurl-1.3.1.tgz", 1797 | "dev": true 1798 | }, 1799 | "path-browserify": { 1800 | "version": "0.0.0", 1801 | "from": "path-browserify@0.0.0", 1802 | "resolved": "http://r.tnpm.oa.com/path-browserify/download/path-browserify-0.0.0.tgz", 1803 | "dev": true 1804 | }, 1805 | "path-exists": { 1806 | "version": "2.1.0", 1807 | "from": "path-exists@>=2.0.0 <3.0.0", 1808 | "resolved": "http://r.tnpm.oa.com/path-exists/download/path-exists-2.1.0.tgz", 1809 | "dev": true 1810 | }, 1811 | "path-is-absolute": { 1812 | "version": "1.0.1", 1813 | "from": "path-is-absolute@>=1.0.0 <2.0.0", 1814 | "resolved": "http://r.tnpm.oa.com/path-is-absolute/download/path-is-absolute-1.0.1.tgz", 1815 | "dev": true 1816 | }, 1817 | "path-to-regexp": { 1818 | "version": "0.1.7", 1819 | "from": "path-to-regexp@0.1.7", 1820 | "resolved": "http://r.tnpm.oa.com/path-to-regexp/download/path-to-regexp-0.1.7.tgz", 1821 | "dev": true 1822 | }, 1823 | "path-type": { 1824 | "version": "1.1.0", 1825 | "from": "path-type@>=1.0.0 <2.0.0", 1826 | "resolved": "http://r.tnpm.oa.com/path-type/download/path-type-1.1.0.tgz", 1827 | "dev": true 1828 | }, 1829 | "pbkdf2": { 1830 | "version": "3.0.9", 1831 | "from": "pbkdf2@>=3.0.3 <4.0.0", 1832 | "resolved": "http://r.tnpm.oa.com/pbkdf2/download/pbkdf2-3.0.9.tgz", 1833 | "dev": true 1834 | }, 1835 | "pify": { 1836 | "version": "2.3.0", 1837 | "from": "pify@>=2.0.0 <3.0.0", 1838 | "resolved": "http://r.tnpm.oa.com/pify/download/pify-2.3.0.tgz", 1839 | "dev": true 1840 | }, 1841 | "pinkie": { 1842 | "version": "2.0.4", 1843 | "from": "pinkie@>=2.0.0 <3.0.0", 1844 | "resolved": "http://r.tnpm.oa.com/pinkie/download/pinkie-2.0.4.tgz", 1845 | "dev": true 1846 | }, 1847 | "pinkie-promise": { 1848 | "version": "2.0.1", 1849 | "from": "pinkie-promise@>=2.0.0 <3.0.0", 1850 | "resolved": "http://r.tnpm.oa.com/pinkie-promise/download/pinkie-promise-2.0.1.tgz", 1851 | "dev": true 1852 | }, 1853 | "pkg-dir": { 1854 | "version": "1.0.0", 1855 | "from": "pkg-dir@>=1.0.0 <2.0.0", 1856 | "resolved": "http://r.tnpm.oa.com/pkg-dir/download/pkg-dir-1.0.0.tgz", 1857 | "dev": true 1858 | }, 1859 | "portfinder": { 1860 | "version": "1.0.13", 1861 | "from": "portfinder@>=1.0.9 <2.0.0", 1862 | "resolved": "http://r.tnpm.oa.com/portfinder/download/portfinder-1.0.13.tgz", 1863 | "dev": true, 1864 | "dependencies": { 1865 | "async": { 1866 | "version": "1.5.2", 1867 | "from": "async@>=1.5.2 <2.0.0", 1868 | "resolved": "http://r.tnpm.oa.com/async/download/async-1.5.2.tgz", 1869 | "dev": true 1870 | } 1871 | } 1872 | }, 1873 | "preserve": { 1874 | "version": "0.2.0", 1875 | "from": "preserve@>=0.2.0 <0.3.0", 1876 | "resolved": "http://r.tnpm.oa.com/preserve/download/preserve-0.2.0.tgz", 1877 | "dev": true 1878 | }, 1879 | "private": { 1880 | "version": "0.1.7", 1881 | "from": "private@>=0.1.6 <0.2.0", 1882 | "resolved": "http://r.tnpm.oa.com/private/download/private-0.1.7.tgz", 1883 | "dev": true 1884 | }, 1885 | "process": { 1886 | "version": "0.5.2", 1887 | "from": "process@>=0.5.1 <0.6.0", 1888 | "resolved": "http://r.tnpm.oa.com/process/download/process-0.5.2.tgz", 1889 | "dev": true 1890 | }, 1891 | "process-nextick-args": { 1892 | "version": "1.0.7", 1893 | "from": "process-nextick-args@>=1.0.6 <1.1.0", 1894 | "resolved": "http://r.tnpm.oa.com/process-nextick-args/download/process-nextick-args-1.0.7.tgz", 1895 | "dev": true 1896 | }, 1897 | "promise": { 1898 | "version": "7.1.1", 1899 | "from": "promise@>=7.1.1 <8.0.0", 1900 | "resolved": "http://r.tnpm.oa.com/promise/download/promise-7.1.1.tgz" 1901 | }, 1902 | "proxy-addr": { 1903 | "version": "1.1.3", 1904 | "from": "proxy-addr@>=1.1.3 <1.2.0", 1905 | "resolved": "http://r.tnpm.oa.com/proxy-addr/download/proxy-addr-1.1.3.tgz", 1906 | "dev": true 1907 | }, 1908 | "prr": { 1909 | "version": "0.0.0", 1910 | "from": "prr@>=0.0.0 <0.1.0", 1911 | "resolved": "http://r.tnpm.oa.com/prr/download/prr-0.0.0.tgz", 1912 | "dev": true 1913 | }, 1914 | "public-encrypt": { 1915 | "version": "4.0.0", 1916 | "from": "public-encrypt@>=4.0.0 <5.0.0", 1917 | "resolved": "http://r.tnpm.oa.com/public-encrypt/download/public-encrypt-4.0.0.tgz", 1918 | "dev": true 1919 | }, 1920 | "punycode": { 1921 | "version": "1.4.1", 1922 | "from": "punycode@>=1.2.4 <2.0.0", 1923 | "resolved": "http://r.tnpm.oa.com/punycode/download/punycode-1.4.1.tgz", 1924 | "dev": true 1925 | }, 1926 | "qs": { 1927 | "version": "6.4.0", 1928 | "from": "qs@6.4.0", 1929 | "resolved": "http://r.tnpm.oa.com/qs/download/qs-6.4.0.tgz", 1930 | "dev": true 1931 | }, 1932 | "querystring": { 1933 | "version": "0.2.0", 1934 | "from": "querystring@0.2.0", 1935 | "resolved": "http://r.tnpm.oa.com/querystring/download/querystring-0.2.0.tgz", 1936 | "dev": true 1937 | }, 1938 | "querystring-es3": { 1939 | "version": "0.2.1", 1940 | "from": "querystring-es3@>=0.2.0 <0.3.0", 1941 | "resolved": "http://r.tnpm.oa.com/querystring-es3/download/querystring-es3-0.2.1.tgz", 1942 | "dev": true 1943 | }, 1944 | "querystringify": { 1945 | "version": "0.0.4", 1946 | "from": "querystringify@>=0.0.0 <0.1.0", 1947 | "resolved": "http://r.tnpm.oa.com/querystringify/download/querystringify-0.0.4.tgz", 1948 | "dev": true 1949 | }, 1950 | "randomatic": { 1951 | "version": "1.1.6", 1952 | "from": "randomatic@>=1.1.3 <2.0.0", 1953 | "resolved": "http://r.tnpm.oa.com/randomatic/download/randomatic-1.1.6.tgz", 1954 | "dev": true 1955 | }, 1956 | "randombytes": { 1957 | "version": "2.0.3", 1958 | "from": "randombytes@>=2.0.0 <3.0.0", 1959 | "resolved": "http://r.tnpm.oa.com/randombytes/download/randombytes-2.0.3.tgz", 1960 | "dev": true 1961 | }, 1962 | "range-parser": { 1963 | "version": "1.2.0", 1964 | "from": "range-parser@>=1.2.0 <1.3.0", 1965 | "resolved": "http://r.tnpm.oa.com/range-parser/download/range-parser-1.2.0.tgz", 1966 | "dev": true 1967 | }, 1968 | "react": { 1969 | "version": "15.4.2", 1970 | "from": "react@>=15.4.2 <16.0.0", 1971 | "resolved": "http://r.tnpm.oa.com/react/download/react-15.4.2.tgz" 1972 | }, 1973 | "react-addons-create-fragment": { 1974 | "version": "15.4.2", 1975 | "from": "react-addons-create-fragment@>=15.0.0 <16.0.0", 1976 | "resolved": "http://r.tnpm.oa.com/react-addons-create-fragment/download/react-addons-create-fragment-15.4.2.tgz" 1977 | }, 1978 | "react-addons-shallow-compare": { 1979 | "version": "15.4.2", 1980 | "from": "react-addons-shallow-compare@>=15.4.2 <16.0.0", 1981 | "resolved": "http://r.tnpm.oa.com/react-addons-shallow-compare/download/react-addons-shallow-compare-15.4.2.tgz" 1982 | }, 1983 | "react-addons-transition-group": { 1984 | "version": "15.4.2", 1985 | "from": "react-addons-transition-group@>=15.0.0 <16.0.0", 1986 | "resolved": "http://r.tnpm.oa.com/react-addons-transition-group/download/react-addons-transition-group-15.4.2.tgz" 1987 | }, 1988 | "react-deep-force-update": { 1989 | "version": "2.0.1", 1990 | "from": "react-deep-force-update@>=2.0.1 <3.0.0", 1991 | "resolved": "http://r.tnpm.oa.com/react-deep-force-update/download/react-deep-force-update-2.0.1.tgz", 1992 | "dev": true 1993 | }, 1994 | "react-dom": { 1995 | "version": "15.4.2", 1996 | "from": "react-dom@>=15.4.2 <16.0.0", 1997 | "resolved": "http://r.tnpm.oa.com/react-dom/download/react-dom-15.4.2.tgz" 1998 | }, 1999 | "react-event-listener": { 2000 | "version": "0.4.3", 2001 | "from": "react-event-listener@>=0.4.0 <0.5.0", 2002 | "resolved": "http://r.tnpm.oa.com/react-event-listener/download/react-event-listener-0.4.3.tgz" 2003 | }, 2004 | "react-hot-loader": { 2005 | "version": "3.0.0-beta.6", 2006 | "from": "react-hot-loader@>=3.0.0-beta.6 <4.0.0", 2007 | "resolved": "http://r.tnpm.oa.com/react-hot-loader/download/react-hot-loader-3.0.0-beta.6.tgz", 2008 | "dev": true, 2009 | "dependencies": { 2010 | "source-map": { 2011 | "version": "0.4.4", 2012 | "from": "source-map@>=0.4.4 <0.5.0", 2013 | "resolved": "http://r.tnpm.oa.com/source-map/download/source-map-0.4.4.tgz", 2014 | "dev": true 2015 | } 2016 | } 2017 | }, 2018 | "react-proxy": { 2019 | "version": "3.0.0-alpha.1", 2020 | "from": "react-proxy@>=3.0.0-alpha.0 <4.0.0", 2021 | "resolved": "http://r.tnpm.oa.com/react-proxy/download/react-proxy-3.0.0-alpha.1.tgz", 2022 | "dev": true 2023 | }, 2024 | "react-router": { 2025 | "version": "4.0.0", 2026 | "from": "react-router@latest", 2027 | "resolved": "http://r.tnpm.oa.com/react-router/download/react-router-4.0.0.tgz", 2028 | "dependencies": { 2029 | "isarray": { 2030 | "version": "0.0.1", 2031 | "from": "isarray@0.0.1", 2032 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" 2033 | }, 2034 | "path-to-regexp": { 2035 | "version": "1.7.0", 2036 | "from": "path-to-regexp@>=1.5.3 <2.0.0", 2037 | "resolved": "http://r.tnpm.oa.com/path-to-regexp/download/path-to-regexp-1.7.0.tgz" 2038 | } 2039 | } 2040 | }, 2041 | "react-tap-event-plugin": { 2042 | "version": "2.0.1", 2043 | "from": "react-tap-event-plugin@latest", 2044 | "resolved": "http://r.tnpm.oa.com/react-tap-event-plugin/download/react-tap-event-plugin-2.0.1.tgz" 2045 | }, 2046 | "read-pkg": { 2047 | "version": "1.1.0", 2048 | "from": "read-pkg@>=1.0.0 <2.0.0", 2049 | "resolved": "http://r.tnpm.oa.com/read-pkg/download/read-pkg-1.1.0.tgz", 2050 | "dev": true 2051 | }, 2052 | "read-pkg-up": { 2053 | "version": "1.0.1", 2054 | "from": "read-pkg-up@>=1.0.1 <2.0.0", 2055 | "resolved": "http://r.tnpm.oa.com/read-pkg-up/download/read-pkg-up-1.0.1.tgz", 2056 | "dev": true 2057 | }, 2058 | "readable-stream": { 2059 | "version": "2.2.6", 2060 | "from": "readable-stream@>=2.0.1 <3.0.0", 2061 | "resolved": "http://r.tnpm.oa.com/readable-stream/download/readable-stream-2.2.6.tgz", 2062 | "dev": true 2063 | }, 2064 | "readdirp": { 2065 | "version": "2.1.0", 2066 | "from": "readdirp@>=2.0.0 <3.0.0", 2067 | "resolved": "http://r.tnpm.oa.com/readdirp/download/readdirp-2.1.0.tgz", 2068 | "dev": true 2069 | }, 2070 | "recompose": { 2071 | "version": "0.22.0", 2072 | "from": "recompose@>=0.22.0 <0.23.0", 2073 | "resolved": "http://r.tnpm.oa.com/recompose/download/recompose-0.22.0.tgz" 2074 | }, 2075 | "redbox-react": { 2076 | "version": "1.3.4", 2077 | "from": "redbox-react@>=1.2.5 <2.0.0", 2078 | "resolved": "http://r.tnpm.oa.com/redbox-react/download/redbox-react-1.3.4.tgz", 2079 | "dev": true 2080 | }, 2081 | "regenerate": { 2082 | "version": "1.3.2", 2083 | "from": "regenerate@>=1.2.1 <2.0.0", 2084 | "resolved": "http://r.tnpm.oa.com/regenerate/download/regenerate-1.3.2.tgz", 2085 | "dev": true 2086 | }, 2087 | "regenerator-runtime": { 2088 | "version": "0.10.3", 2089 | "from": "regenerator-runtime@>=0.10.0 <0.11.0", 2090 | "resolved": "http://r.tnpm.oa.com/regenerator-runtime/download/regenerator-runtime-0.10.3.tgz" 2091 | }, 2092 | "regenerator-transform": { 2093 | "version": "0.9.8", 2094 | "from": "regenerator-transform@0.9.8", 2095 | "resolved": "http://r.tnpm.oa.com/regenerator-transform/download/regenerator-transform-0.9.8.tgz", 2096 | "dev": true 2097 | }, 2098 | "regex-cache": { 2099 | "version": "0.4.3", 2100 | "from": "regex-cache@>=0.4.2 <0.5.0", 2101 | "resolved": "http://r.tnpm.oa.com/regex-cache/download/regex-cache-0.4.3.tgz", 2102 | "dev": true 2103 | }, 2104 | "regexpu-core": { 2105 | "version": "2.0.0", 2106 | "from": "regexpu-core@>=2.0.0 <3.0.0", 2107 | "resolved": "http://r.tnpm.oa.com/regexpu-core/download/regexpu-core-2.0.0.tgz", 2108 | "dev": true 2109 | }, 2110 | "regjsgen": { 2111 | "version": "0.2.0", 2112 | "from": "regjsgen@>=0.2.0 <0.3.0", 2113 | "resolved": "http://r.tnpm.oa.com/regjsgen/download/regjsgen-0.2.0.tgz", 2114 | "dev": true 2115 | }, 2116 | "regjsparser": { 2117 | "version": "0.1.5", 2118 | "from": "regjsparser@>=0.1.4 <0.2.0", 2119 | "resolved": "http://r.tnpm.oa.com/regjsparser/download/regjsparser-0.1.5.tgz", 2120 | "dev": true, 2121 | "dependencies": { 2122 | "jsesc": { 2123 | "version": "0.5.0", 2124 | "from": "jsesc@>=0.5.0 <0.6.0", 2125 | "resolved": "http://r.tnpm.oa.com/jsesc/download/jsesc-0.5.0.tgz", 2126 | "dev": true 2127 | } 2128 | } 2129 | }, 2130 | "repeat-element": { 2131 | "version": "1.1.2", 2132 | "from": "repeat-element@>=1.1.2 <2.0.0", 2133 | "resolved": "http://r.tnpm.oa.com/repeat-element/download/repeat-element-1.1.2.tgz", 2134 | "dev": true 2135 | }, 2136 | "repeat-string": { 2137 | "version": "1.6.1", 2138 | "from": "repeat-string@>=1.5.2 <2.0.0", 2139 | "resolved": "http://r.tnpm.oa.com/repeat-string/download/repeat-string-1.6.1.tgz", 2140 | "dev": true 2141 | }, 2142 | "repeating": { 2143 | "version": "2.0.1", 2144 | "from": "repeating@>=2.0.0 <3.0.0", 2145 | "resolved": "http://r.tnpm.oa.com/repeating/download/repeating-2.0.1.tgz", 2146 | "dev": true 2147 | }, 2148 | "require-directory": { 2149 | "version": "2.1.1", 2150 | "from": "require-directory@>=2.1.1 <3.0.0", 2151 | "resolved": "http://r.tnpm.oa.com/require-directory/download/require-directory-2.1.1.tgz", 2152 | "dev": true 2153 | }, 2154 | "require-main-filename": { 2155 | "version": "1.0.1", 2156 | "from": "require-main-filename@>=1.0.1 <2.0.0", 2157 | "resolved": "http://r.tnpm.oa.com/require-main-filename/download/require-main-filename-1.0.1.tgz", 2158 | "dev": true 2159 | }, 2160 | "requires-port": { 2161 | "version": "1.0.0", 2162 | "from": "requires-port@>=1.0.0 <2.0.0", 2163 | "resolved": "http://r.tnpm.oa.com/requires-port/download/requires-port-1.0.0.tgz", 2164 | "dev": true 2165 | }, 2166 | "resolve-pathname": { 2167 | "version": "2.0.2", 2168 | "from": "resolve-pathname@>=2.0.0 <3.0.0", 2169 | "resolved": "http://r.tnpm.oa.com/resolve-pathname/download/resolve-pathname-2.0.2.tgz" 2170 | }, 2171 | "right-align": { 2172 | "version": "0.1.3", 2173 | "from": "right-align@>=0.1.1 <0.2.0", 2174 | "resolved": "http://r.tnpm.oa.com/right-align/download/right-align-0.1.3.tgz", 2175 | "dev": true 2176 | }, 2177 | "ripemd160": { 2178 | "version": "1.0.1", 2179 | "from": "ripemd160@>=1.0.0 <2.0.0", 2180 | "resolved": "http://r.tnpm.oa.com/ripemd160/download/ripemd160-1.0.1.tgz", 2181 | "dev": true 2182 | }, 2183 | "select-hose": { 2184 | "version": "2.0.0", 2185 | "from": "select-hose@>=2.0.0 <3.0.0", 2186 | "resolved": "http://r.tnpm.oa.com/select-hose/download/select-hose-2.0.0.tgz", 2187 | "dev": true 2188 | }, 2189 | "semver": { 2190 | "version": "5.3.0", 2191 | "from": "semver@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0||>=4.0.0 <5.0.0||>=5.0.0 <6.0.0", 2192 | "resolved": "http://r.tnpm.oa.com/semver/download/semver-5.3.0.tgz", 2193 | "dev": true 2194 | }, 2195 | "send": { 2196 | "version": "0.15.1", 2197 | "from": "send@0.15.1", 2198 | "resolved": "http://r.tnpm.oa.com/send/download/send-0.15.1.tgz", 2199 | "dev": true, 2200 | "dependencies": { 2201 | "debug": { 2202 | "version": "2.6.1", 2203 | "from": "debug@2.6.1", 2204 | "resolved": "http://r.tnpm.oa.com/debug/download/debug-2.6.1.tgz", 2205 | "dev": true 2206 | } 2207 | } 2208 | }, 2209 | "serve-index": { 2210 | "version": "1.8.0", 2211 | "from": "serve-index@>=1.7.2 <2.0.0", 2212 | "resolved": "http://r.tnpm.oa.com/serve-index/download/serve-index-1.8.0.tgz", 2213 | "dev": true, 2214 | "dependencies": { 2215 | "debug": { 2216 | "version": "2.2.0", 2217 | "from": "debug@>=2.2.0 <2.3.0", 2218 | "resolved": "http://r.tnpm.oa.com/debug/download/debug-2.2.0.tgz", 2219 | "dev": true 2220 | }, 2221 | "http-errors": { 2222 | "version": "1.5.1", 2223 | "from": "http-errors@>=1.5.0 <1.6.0", 2224 | "resolved": "http://r.tnpm.oa.com/http-errors/download/http-errors-1.5.1.tgz", 2225 | "dev": true 2226 | }, 2227 | "ms": { 2228 | "version": "0.7.1", 2229 | "from": "ms@0.7.1", 2230 | "resolved": "http://r.tnpm.oa.com/ms/download/ms-0.7.1.tgz", 2231 | "dev": true 2232 | }, 2233 | "setprototypeof": { 2234 | "version": "1.0.2", 2235 | "from": "setprototypeof@1.0.2", 2236 | "resolved": "http://r.tnpm.oa.com/setprototypeof/download/setprototypeof-1.0.2.tgz", 2237 | "dev": true 2238 | } 2239 | } 2240 | }, 2241 | "serve-static": { 2242 | "version": "1.12.1", 2243 | "from": "serve-static@1.12.1", 2244 | "resolved": "http://r.tnpm.oa.com/serve-static/download/serve-static-1.12.1.tgz", 2245 | "dev": true 2246 | }, 2247 | "set-blocking": { 2248 | "version": "2.0.0", 2249 | "from": "set-blocking@>=2.0.0 <3.0.0", 2250 | "resolved": "http://r.tnpm.oa.com/set-blocking/download/set-blocking-2.0.0.tgz", 2251 | "dev": true 2252 | }, 2253 | "set-immediate-shim": { 2254 | "version": "1.0.1", 2255 | "from": "set-immediate-shim@>=1.0.1 <2.0.0", 2256 | "resolved": "http://r.tnpm.oa.com/set-immediate-shim/download/set-immediate-shim-1.0.1.tgz", 2257 | "dev": true 2258 | }, 2259 | "setimmediate": { 2260 | "version": "1.0.5", 2261 | "from": "setimmediate@>=1.0.5 <2.0.0", 2262 | "resolved": "http://r.tnpm.oa.com/setimmediate/download/setimmediate-1.0.5.tgz" 2263 | }, 2264 | "setprototypeof": { 2265 | "version": "1.0.3", 2266 | "from": "setprototypeof@1.0.3", 2267 | "resolved": "http://r.tnpm.oa.com/setprototypeof/download/setprototypeof-1.0.3.tgz", 2268 | "dev": true 2269 | }, 2270 | "sha.js": { 2271 | "version": "2.4.8", 2272 | "from": "sha.js@>=2.3.6 <3.0.0", 2273 | "resolved": "http://r.tnpm.oa.com/sha.js/download/sha.js-2.4.8.tgz", 2274 | "dev": true 2275 | }, 2276 | "simple-assign": { 2277 | "version": "0.1.0", 2278 | "from": "simple-assign@>=0.1.0 <0.2.0", 2279 | "resolved": "http://r.tnpm.oa.com/simple-assign/download/simple-assign-0.1.0.tgz" 2280 | }, 2281 | "slash": { 2282 | "version": "1.0.0", 2283 | "from": "slash@>=1.0.0 <2.0.0", 2284 | "resolved": "http://r.tnpm.oa.com/slash/download/slash-1.0.0.tgz", 2285 | "dev": true 2286 | }, 2287 | "sockjs": { 2288 | "version": "0.3.18", 2289 | "from": "sockjs@0.3.18", 2290 | "resolved": "http://r.tnpm.oa.com/sockjs/download/sockjs-0.3.18.tgz", 2291 | "dev": true 2292 | }, 2293 | "sockjs-client": { 2294 | "version": "1.1.2", 2295 | "from": "sockjs-client@1.1.2", 2296 | "resolved": "http://r.tnpm.oa.com/sockjs-client/download/sockjs-client-1.1.2.tgz", 2297 | "dev": true, 2298 | "dependencies": { 2299 | "faye-websocket": { 2300 | "version": "0.11.1", 2301 | "from": "faye-websocket@>=0.11.0 <0.12.0", 2302 | "resolved": "http://r.tnpm.oa.com/faye-websocket/download/faye-websocket-0.11.1.tgz", 2303 | "dev": true 2304 | } 2305 | } 2306 | }, 2307 | "source-list-map": { 2308 | "version": "0.1.8", 2309 | "from": "source-list-map@>=0.1.7 <0.2.0", 2310 | "resolved": "http://r.tnpm.oa.com/source-list-map/download/source-list-map-0.1.8.tgz", 2311 | "dev": true 2312 | }, 2313 | "source-map": { 2314 | "version": "0.5.6", 2315 | "from": "source-map@>=0.5.0 <0.6.0", 2316 | "resolved": "http://r.tnpm.oa.com/source-map/download/source-map-0.5.6.tgz", 2317 | "dev": true 2318 | }, 2319 | "source-map-support": { 2320 | "version": "0.4.13", 2321 | "from": "source-map-support@>=0.4.2 <0.5.0", 2322 | "resolved": "http://r.tnpm.oa.com/source-map-support/download/source-map-support-0.4.13.tgz", 2323 | "dev": true 2324 | }, 2325 | "spdx-correct": { 2326 | "version": "1.0.2", 2327 | "from": "spdx-correct@>=1.0.0 <1.1.0", 2328 | "resolved": "http://r.tnpm.oa.com/spdx-correct/download/spdx-correct-1.0.2.tgz", 2329 | "dev": true 2330 | }, 2331 | "spdx-expression-parse": { 2332 | "version": "1.0.4", 2333 | "from": "spdx-expression-parse@>=1.0.0 <1.1.0", 2334 | "resolved": "http://r.tnpm.oa.com/spdx-expression-parse/download/spdx-expression-parse-1.0.4.tgz", 2335 | "dev": true 2336 | }, 2337 | "spdx-license-ids": { 2338 | "version": "1.2.2", 2339 | "from": "spdx-license-ids@>=1.0.2 <2.0.0", 2340 | "resolved": "http://r.tnpm.oa.com/spdx-license-ids/download/spdx-license-ids-1.2.2.tgz", 2341 | "dev": true 2342 | }, 2343 | "spdy": { 2344 | "version": "3.4.4", 2345 | "from": "spdy@>=3.4.1 <4.0.0", 2346 | "resolved": "http://r.tnpm.oa.com/spdy/download/spdy-3.4.4.tgz", 2347 | "dev": true 2348 | }, 2349 | "spdy-transport": { 2350 | "version": "2.0.18", 2351 | "from": "spdy-transport@>=2.0.15 <3.0.0", 2352 | "resolved": "http://r.tnpm.oa.com/spdy-transport/download/spdy-transport-2.0.18.tgz", 2353 | "dev": true 2354 | }, 2355 | "stackframe": { 2356 | "version": "0.3.1", 2357 | "from": "stackframe@>=0.3.1 <0.4.0", 2358 | "resolved": "http://r.tnpm.oa.com/stackframe/download/stackframe-0.3.1.tgz", 2359 | "dev": true 2360 | }, 2361 | "statuses": { 2362 | "version": "1.3.1", 2363 | "from": "statuses@>=1.3.1 <1.4.0", 2364 | "resolved": "http://r.tnpm.oa.com/statuses/download/statuses-1.3.1.tgz", 2365 | "dev": true 2366 | }, 2367 | "stream-browserify": { 2368 | "version": "2.0.1", 2369 | "from": "stream-browserify@>=2.0.1 <3.0.0", 2370 | "resolved": "http://r.tnpm.oa.com/stream-browserify/download/stream-browserify-2.0.1.tgz", 2371 | "dev": true 2372 | }, 2373 | "stream-http": { 2374 | "version": "2.6.3", 2375 | "from": "stream-http@>=2.3.1 <3.0.0", 2376 | "resolved": "http://r.tnpm.oa.com/stream-http/download/stream-http-2.6.3.tgz", 2377 | "dev": true 2378 | }, 2379 | "string_decoder": { 2380 | "version": "0.10.31", 2381 | "from": "string_decoder@>=0.10.0 <0.11.0", 2382 | "resolved": "http://r.tnpm.oa.com/string_decoder/download/string_decoder-0.10.31.tgz", 2383 | "dev": true 2384 | }, 2385 | "string-width": { 2386 | "version": "1.0.2", 2387 | "from": "string-width@>=1.0.2 <2.0.0", 2388 | "resolved": "http://r.tnpm.oa.com/string-width/download/string-width-1.0.2.tgz", 2389 | "dev": true 2390 | }, 2391 | "strip-ansi": { 2392 | "version": "3.0.1", 2393 | "from": "strip-ansi@>=3.0.0 <4.0.0", 2394 | "resolved": "http://r.tnpm.oa.com/strip-ansi/download/strip-ansi-3.0.1.tgz", 2395 | "dev": true 2396 | }, 2397 | "strip-bom": { 2398 | "version": "2.0.0", 2399 | "from": "strip-bom@>=2.0.0 <3.0.0", 2400 | "resolved": "http://r.tnpm.oa.com/strip-bom/download/strip-bom-2.0.0.tgz", 2401 | "dev": true 2402 | }, 2403 | "supports-color": { 2404 | "version": "2.0.0", 2405 | "from": "supports-color@>=2.0.0 <3.0.0", 2406 | "resolved": "http://r.tnpm.oa.com/supports-color/download/supports-color-2.0.0.tgz", 2407 | "dev": true 2408 | }, 2409 | "symbol-observable": { 2410 | "version": "1.0.4", 2411 | "from": "symbol-observable@>=1.0.4 <2.0.0", 2412 | "resolved": "http://r.tnpm.oa.com/symbol-observable/download/symbol-observable-1.0.4.tgz" 2413 | }, 2414 | "tapable": { 2415 | "version": "0.2.6", 2416 | "from": "tapable@>=0.2.5 <0.3.0", 2417 | "resolved": "http://r.tnpm.oa.com/tapable/download/tapable-0.2.6.tgz", 2418 | "dev": true 2419 | }, 2420 | "timers-browserify": { 2421 | "version": "2.0.2", 2422 | "from": "timers-browserify@>=2.0.2 <3.0.0", 2423 | "resolved": "http://r.tnpm.oa.com/timers-browserify/download/timers-browserify-2.0.2.tgz", 2424 | "dev": true 2425 | }, 2426 | "to-arraybuffer": { 2427 | "version": "1.0.1", 2428 | "from": "to-arraybuffer@>=1.0.0 <2.0.0", 2429 | "resolved": "http://r.tnpm.oa.com/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz", 2430 | "dev": true 2431 | }, 2432 | "to-fast-properties": { 2433 | "version": "1.0.2", 2434 | "from": "to-fast-properties@>=1.0.1 <2.0.0", 2435 | "resolved": "http://r.tnpm.oa.com/to-fast-properties/download/to-fast-properties-1.0.2.tgz", 2436 | "dev": true 2437 | }, 2438 | "trim-right": { 2439 | "version": "1.0.1", 2440 | "from": "trim-right@>=1.0.1 <2.0.0", 2441 | "resolved": "http://r.tnpm.oa.com/trim-right/download/trim-right-1.0.1.tgz", 2442 | "dev": true 2443 | }, 2444 | "tty-browserify": { 2445 | "version": "0.0.0", 2446 | "from": "tty-browserify@0.0.0", 2447 | "resolved": "http://r.tnpm.oa.com/tty-browserify/download/tty-browserify-0.0.0.tgz", 2448 | "dev": true 2449 | }, 2450 | "type-is": { 2451 | "version": "1.6.14", 2452 | "from": "type-is@>=1.6.14 <1.7.0", 2453 | "resolved": "http://r.tnpm.oa.com/type-is/download/type-is-1.6.14.tgz", 2454 | "dev": true 2455 | }, 2456 | "ua-parser-js": { 2457 | "version": "0.7.12", 2458 | "from": "ua-parser-js@>=0.7.9 <0.8.0", 2459 | "resolved": "http://r.tnpm.oa.com/ua-parser-js/download/ua-parser-js-0.7.12.tgz" 2460 | }, 2461 | "uglify-js": { 2462 | "version": "2.8.13", 2463 | "from": "uglify-js@>=2.7.5 <3.0.0", 2464 | "resolved": "http://r.tnpm.oa.com/uglify-js/download/uglify-js-2.8.13.tgz", 2465 | "dev": true, 2466 | "dependencies": { 2467 | "yargs": { 2468 | "version": "3.10.0", 2469 | "from": "yargs@>=3.10.0 <3.11.0", 2470 | "resolved": "http://r.tnpm.oa.com/yargs/download/yargs-3.10.0.tgz", 2471 | "dev": true 2472 | } 2473 | } 2474 | }, 2475 | "uglify-to-browserify": { 2476 | "version": "1.0.2", 2477 | "from": "uglify-to-browserify@>=1.0.0 <1.1.0", 2478 | "resolved": "http://r.tnpm.oa.com/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz", 2479 | "dev": true 2480 | }, 2481 | "unpipe": { 2482 | "version": "1.0.0", 2483 | "from": "unpipe@>=1.0.0 <1.1.0", 2484 | "resolved": "http://r.tnpm.oa.com/unpipe/download/unpipe-1.0.0.tgz", 2485 | "dev": true 2486 | }, 2487 | "url": { 2488 | "version": "0.11.0", 2489 | "from": "url@>=0.11.0 <0.12.0", 2490 | "resolved": "http://r.tnpm.oa.com/url/download/url-0.11.0.tgz", 2491 | "dev": true, 2492 | "dependencies": { 2493 | "punycode": { 2494 | "version": "1.3.2", 2495 | "from": "punycode@1.3.2", 2496 | "resolved": "http://r.tnpm.oa.com/punycode/download/punycode-1.3.2.tgz", 2497 | "dev": true 2498 | } 2499 | } 2500 | }, 2501 | "url-parse": { 2502 | "version": "1.1.8", 2503 | "from": "url-parse@>=1.1.1 <2.0.0", 2504 | "resolved": "http://r.tnpm.oa.com/url-parse/download/url-parse-1.1.8.tgz", 2505 | "dev": true 2506 | }, 2507 | "util": { 2508 | "version": "0.10.3", 2509 | "from": "util@>=0.10.3 <0.11.0", 2510 | "resolved": "http://r.tnpm.oa.com/util/download/util-0.10.3.tgz", 2511 | "dev": true, 2512 | "dependencies": { 2513 | "inherits": { 2514 | "version": "2.0.1", 2515 | "from": "inherits@2.0.1", 2516 | "resolved": "http://r.tnpm.oa.com/inherits/download/inherits-2.0.1.tgz", 2517 | "dev": true 2518 | } 2519 | } 2520 | }, 2521 | "util-deprecate": { 2522 | "version": "1.0.2", 2523 | "from": "util-deprecate@>=1.0.1 <1.1.0", 2524 | "resolved": "http://r.tnpm.oa.com/util-deprecate/download/util-deprecate-1.0.2.tgz", 2525 | "dev": true 2526 | }, 2527 | "utils-merge": { 2528 | "version": "1.0.0", 2529 | "from": "utils-merge@1.0.0", 2530 | "resolved": "http://r.tnpm.oa.com/utils-merge/download/utils-merge-1.0.0.tgz", 2531 | "dev": true 2532 | }, 2533 | "uuid": { 2534 | "version": "2.0.3", 2535 | "from": "uuid@>=2.0.2 <3.0.0", 2536 | "resolved": "http://r.tnpm.oa.com/uuid/download/uuid-2.0.3.tgz", 2537 | "dev": true 2538 | }, 2539 | "validate-npm-package-license": { 2540 | "version": "3.0.1", 2541 | "from": "validate-npm-package-license@>=3.0.1 <4.0.0", 2542 | "resolved": "http://r.tnpm.oa.com/validate-npm-package-license/download/validate-npm-package-license-3.0.1.tgz", 2543 | "dev": true 2544 | }, 2545 | "value-equal": { 2546 | "version": "0.2.0", 2547 | "from": "value-equal@>=0.2.0 <0.3.0", 2548 | "resolved": "http://r.tnpm.oa.com/value-equal/download/value-equal-0.2.0.tgz" 2549 | }, 2550 | "vary": { 2551 | "version": "1.1.0", 2552 | "from": "vary@>=1.1.0 <1.2.0", 2553 | "resolved": "http://r.tnpm.oa.com/vary/download/vary-1.1.0.tgz", 2554 | "dev": true 2555 | }, 2556 | "vm-browserify": { 2557 | "version": "0.0.4", 2558 | "from": "vm-browserify@0.0.4", 2559 | "resolved": "http://r.tnpm.oa.com/vm-browserify/download/vm-browserify-0.0.4.tgz", 2560 | "dev": true 2561 | }, 2562 | "warning": { 2563 | "version": "3.0.0", 2564 | "from": "warning@>=3.0.0 <4.0.0", 2565 | "resolved": "http://r.tnpm.oa.com/warning/download/warning-3.0.0.tgz" 2566 | }, 2567 | "watchpack": { 2568 | "version": "1.3.1", 2569 | "from": "watchpack@>=1.2.0 <2.0.0", 2570 | "resolved": "http://r.tnpm.oa.com/watchpack/download/watchpack-1.3.1.tgz", 2571 | "dev": true 2572 | }, 2573 | "wbuf": { 2574 | "version": "1.7.2", 2575 | "from": "wbuf@>=1.4.0 <2.0.0", 2576 | "resolved": "http://r.tnpm.oa.com/wbuf/download/wbuf-1.7.2.tgz", 2577 | "dev": true 2578 | }, 2579 | "webpack": { 2580 | "version": "2.2.1", 2581 | "from": "webpack@>=2.2.1 <3.0.0", 2582 | "resolved": "http://r.tnpm.oa.com/webpack/download/webpack-2.2.1.tgz", 2583 | "dev": true, 2584 | "dependencies": { 2585 | "supports-color": { 2586 | "version": "3.2.3", 2587 | "from": "supports-color@>=3.1.0 <4.0.0", 2588 | "resolved": "http://r.tnpm.oa.com/supports-color/download/supports-color-3.2.3.tgz", 2589 | "dev": true 2590 | } 2591 | } 2592 | }, 2593 | "webpack-dev-middleware": { 2594 | "version": "1.10.1", 2595 | "from": "webpack-dev-middleware@>=1.9.0 <2.0.0", 2596 | "resolved": "http://r.tnpm.oa.com/webpack-dev-middleware/download/webpack-dev-middleware-1.10.1.tgz", 2597 | "dev": true 2598 | }, 2599 | "webpack-dev-server": { 2600 | "version": "2.4.2", 2601 | "from": "webpack-dev-server@>=2.4.1 <3.0.0", 2602 | "resolved": "http://r.tnpm.oa.com/webpack-dev-server/download/webpack-dev-server-2.4.2.tgz", 2603 | "dev": true, 2604 | "dependencies": { 2605 | "supports-color": { 2606 | "version": "3.2.3", 2607 | "from": "supports-color@>=3.1.1 <4.0.0", 2608 | "resolved": "http://r.tnpm.oa.com/supports-color/download/supports-color-3.2.3.tgz", 2609 | "dev": true 2610 | } 2611 | } 2612 | }, 2613 | "webpack-sources": { 2614 | "version": "0.1.5", 2615 | "from": "webpack-sources@>=0.1.4 <0.2.0", 2616 | "resolved": "http://r.tnpm.oa.com/webpack-sources/download/webpack-sources-0.1.5.tgz", 2617 | "dev": true 2618 | }, 2619 | "websocket-driver": { 2620 | "version": "0.6.5", 2621 | "from": "websocket-driver@>=0.5.1", 2622 | "resolved": "http://r.tnpm.oa.com/websocket-driver/download/websocket-driver-0.6.5.tgz", 2623 | "dev": true 2624 | }, 2625 | "websocket-extensions": { 2626 | "version": "0.1.1", 2627 | "from": "websocket-extensions@>=0.1.1", 2628 | "resolved": "http://r.tnpm.oa.com/websocket-extensions/download/websocket-extensions-0.1.1.tgz", 2629 | "dev": true 2630 | }, 2631 | "whatwg-fetch": { 2632 | "version": "2.0.3", 2633 | "from": "whatwg-fetch@>=0.10.0", 2634 | "resolved": "http://r.tnpm.oa.com/whatwg-fetch/download/whatwg-fetch-2.0.3.tgz" 2635 | }, 2636 | "which-module": { 2637 | "version": "1.0.0", 2638 | "from": "which-module@>=1.0.0 <2.0.0", 2639 | "resolved": "http://r.tnpm.oa.com/which-module/download/which-module-1.0.0.tgz", 2640 | "dev": true 2641 | }, 2642 | "window-size": { 2643 | "version": "0.1.0", 2644 | "from": "window-size@0.1.0", 2645 | "resolved": "http://r.tnpm.oa.com/window-size/download/window-size-0.1.0.tgz", 2646 | "dev": true 2647 | }, 2648 | "wordwrap": { 2649 | "version": "0.0.2", 2650 | "from": "wordwrap@0.0.2", 2651 | "resolved": "http://r.tnpm.oa.com/wordwrap/download/wordwrap-0.0.2.tgz", 2652 | "dev": true 2653 | }, 2654 | "wrap-ansi": { 2655 | "version": "2.1.0", 2656 | "from": "wrap-ansi@>=2.0.0 <3.0.0", 2657 | "resolved": "http://r.tnpm.oa.com/wrap-ansi/download/wrap-ansi-2.1.0.tgz", 2658 | "dev": true 2659 | }, 2660 | "xtend": { 2661 | "version": "4.0.1", 2662 | "from": "xtend@>=4.0.0 <5.0.0", 2663 | "resolved": "http://r.tnpm.oa.com/xtend/download/xtend-4.0.1.tgz", 2664 | "dev": true 2665 | }, 2666 | "y18n": { 2667 | "version": "3.2.1", 2668 | "from": "y18n@>=3.2.1 <4.0.0", 2669 | "resolved": "http://r.tnpm.oa.com/y18n/download/y18n-3.2.1.tgz", 2670 | "dev": true 2671 | }, 2672 | "yargs": { 2673 | "version": "6.6.0", 2674 | "from": "yargs@>=6.0.0 <7.0.0", 2675 | "resolved": "http://r.tnpm.oa.com/yargs/download/yargs-6.6.0.tgz", 2676 | "dev": true, 2677 | "dependencies": { 2678 | "camelcase": { 2679 | "version": "3.0.0", 2680 | "from": "camelcase@>=3.0.0 <4.0.0", 2681 | "resolved": "http://r.tnpm.oa.com/camelcase/download/camelcase-3.0.0.tgz", 2682 | "dev": true 2683 | }, 2684 | "cliui": { 2685 | "version": "3.2.0", 2686 | "from": "cliui@>=3.2.0 <4.0.0", 2687 | "resolved": "http://r.tnpm.oa.com/cliui/download/cliui-3.2.0.tgz", 2688 | "dev": true 2689 | } 2690 | } 2691 | }, 2692 | "yargs-parser": { 2693 | "version": "4.2.1", 2694 | "from": "yargs-parser@>=4.2.0 <5.0.0", 2695 | "resolved": "http://r.tnpm.oa.com/yargs-parser/download/yargs-parser-4.2.1.tgz", 2696 | "dev": true, 2697 | "dependencies": { 2698 | "camelcase": { 2699 | "version": "3.0.0", 2700 | "from": "camelcase@>=3.0.0 <4.0.0", 2701 | "resolved": "http://r.tnpm.oa.com/camelcase/download/camelcase-3.0.0.tgz", 2702 | "dev": true 2703 | } 2704 | } 2705 | } 2706 | } 2707 | } 2708 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-hot-loader-minimal-boilerplate", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "./node_modules/.bin/webpack-dev-server --hot --history-api-fallback", 8 | "build": "./node_modules/.bin/webpack --progress --profile --colors --config webpack.prod.js " 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/wkwiatek/react-hot-loader-minimal-boilerplate.git" 13 | }, 14 | "keywords": [], 15 | "author": "", 16 | "license": "ISC", 17 | "bugs": { 18 | "url": "https://github.com/wkwiatek/react-hot-loader-minimal-boilerplate/issues" 19 | }, 20 | "homepage": "https://github.com/wkwiatek/react-hot-loader-minimal-boilerplate#readme", 21 | "dependencies": { 22 | "material-ui": "^0.17.1", 23 | "react": "15.4.2", 24 | "react-dom": "15.4.2", 25 | "react-infinite-scroller": "^1.0.7", 26 | "react-redux": "^5.0.3", 27 | "react-router": "^4.0.0", 28 | "react-router-dom": "^4.0.0", 29 | "react-tap-event-plugin": "^2.0.1", 30 | "redux": "^3.6.0", 31 | "redux-logger": "^3.0.1", 32 | "redux-persist": "^4.6.0", 33 | "redux-thunk": "^2.2.0", 34 | "timeago.js": "^3.0.1", 35 | "url-loader": "^0.5.8", 36 | "whatwg-fetch": "^2.0.3" 37 | }, 38 | "devDependencies": { 39 | "babel-core": "^6.23.1", 40 | "babel-loader": "^6.3.2", 41 | "babel-plugin-transform-class-properties": "^6.23.0", 42 | "babel-polyfill": "^6.23.0", 43 | "babel-preset-es2015": "^6.24.0", 44 | "babel-preset-latest": "^6.22.0", 45 | "babel-preset-react": "^6.23.0", 46 | "css-loader": "^0.27.3", 47 | "file-loader": "^0.10.1", 48 | "html-webpack-plugin": "^2.28.0", 49 | "react-hot-loader": "^3.0.0-beta.6", 50 | "style-loader": "^0.16.0", 51 | "webpack": "^2.2.1", 52 | "webpack-bundle-size-analyzer": "^2.6.0", 53 | "webpack-dev-server": "^2.4.1" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/components/BodyPage.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; 4 | 5 | import RefreshIndicator from 'material-ui/RefreshIndicator'; 6 | 7 | import TopicList from './TopicList' 8 | 9 | 10 | import InfiniteScroll from 'react-infinite-scroller' 11 | 12 | 13 | 14 | export default class BodyPage extends React.Component { 15 | constructor(props) { 16 | super(props); 17 | } 18 | 19 | 20 | showTopic = (page,tab) => { 21 | this.props.showTopic(tab) 22 | 23 | } 24 | 25 | componentDidMount(){ 26 | this.showTopic() 27 | } 28 | 29 | 30 | shouldComponentUpdate(nextProps){ 31 | let shouldUpdate = true 32 | let topic = this.props.status.topic 33 | if(topic && topic.hasOwnProperty('search')){ 34 | let search = topic.search 35 | let tab = nextProps.match.params.tab 36 | if(search && search.hasOwnProperty('tab')){ 37 | let oldTab = search.tab 38 | if(tab && oldTab != tab){ 39 | this.showTopic(0,tab) 40 | shouldUpdate = false 41 | window.scrollTo(0, 0) 42 | } 43 | } 44 | }else{ 45 | this.showTopic() 46 | shouldUpdate = false 47 | window.scrollTo(0, 0) 48 | } 49 | return shouldUpdate 50 | } 51 | 52 | render(){ 53 | 54 | let done = this.props.status.done 55 | 56 | let topic = this.props.status.topic 57 | 58 | let topicData = [] 59 | if(topic && topic.hasOwnProperty('data')){ 60 | topicData = topic.data 61 | } 62 | 63 | let loadStatus = 'loading' 64 | if(done){ 65 | loadStatus = 'hide' 66 | } 67 | 68 | const style = { 69 | container: { 70 | position: 'relative', 71 | textAlign: 'center', 72 | marginBottom:30 73 | }, 74 | refresh: { 75 | display: 'inline-block', 76 | position: 'relative', 77 | }, 78 | displayNone: { 79 | display: 'none' 80 | }, 81 | displayBlock: { 82 | display: 'block' 83 | } 84 | }; 85 | 86 | 87 | return ( 88 | 89 | 90 |
91 | 98 | 105 |
106 | }> 107 | 108 | 109 | 110 | 111 | 112 |
113 | ) 114 | } 115 | 116 | } 117 | 118 | -------------------------------------------------------------------------------- /src/components/CreateForm.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; 3 | 4 | 5 | import RefreshIndicator from 'material-ui/RefreshIndicator'; 6 | import Divider from 'material-ui/Divider'; 7 | import Menu from 'material-ui/Menu'; 8 | import MenuItem from 'material-ui/MenuItem'; 9 | 10 | import TextField from 'material-ui/TextField'; 11 | import RaisedButton from 'material-ui/RaisedButton'; 12 | import IconButton from 'material-ui/IconButton'; 13 | import ContentReply from 'material-ui/svg-icons/content/reply'; 14 | 15 | 16 | import SelectField from 'material-ui/SelectField'; 17 | 18 | import { 19 | Redirect 20 | } from 'react-router-dom' 21 | 22 | 23 | export default class CreateForm extends React.Component { 24 | constructor(props) { 25 | super(props); 26 | this.state = { 27 | errorText:'', 28 | tab:'', 29 | title:'', 30 | content:'' 31 | } 32 | 33 | 34 | } 35 | 36 | componentWillMount(){ 37 | this.props.clearCreate() 38 | } 39 | 40 | 41 | handleChangeTab = (event, index, value) => { 42 | this.setState({tab: value}); 43 | } 44 | 45 | handleChangeTitle = (event) => { 46 | this.setState({title:event.target.value}); 47 | } 48 | 49 | handleChangeContent = (event) => { 50 | this.setState({content: event.target.value}); 51 | } 52 | 53 | 54 | login = () => { 55 | let user = this.props.user 56 | if(!user || Object.keys(user).length <=0){ 57 | let uri = this.props.location.pathname 58 | this.props.history.push('/login',{fromUri:uri}) 59 | return false 60 | }else{ 61 | return true 62 | } 63 | } 64 | 65 | componentWillMount(){ 66 | this.login() 67 | } 68 | 69 | 70 | createTopic = () => { 71 | 72 | if(!this.login()){ 73 | return false 74 | } 75 | 76 | let topic = { 77 | tab:this.state.tab, 78 | title:this.state.title, 79 | content:this.state.content 80 | } 81 | 82 | this.props.createTopic(topic) 83 | } 84 | 85 | shouldComponentUpdate(nextProps){ 86 | let shouldUpdate = true 87 | let create = nextProps.status.create 88 | if(create){ 89 | shouldUpdate = false 90 | this.props.history.push('/') 91 | } 92 | return shouldUpdate 93 | } 94 | 95 | 96 | render(){ 97 | 98 | const status = this.props.status 99 | const errorText = status.error 100 | let loadStatus = 'hide' 101 | let done = status.done 102 | let doing = status.doing 103 | if(doing){ 104 | loadStatus = 'loading' 105 | } 106 | 107 | 108 | const style = { 109 | container: { 110 | position: 'relative', 111 | textAlign: 'center', 112 | marginBottom:30 113 | }, 114 | refresh: { 115 | display: 'inline-block', 116 | position: 'relative', 117 | }, 118 | displayNone: { 119 | display: 'none' 120 | }, 121 | displayBlock: { 122 | display: 'block' 123 | }, 124 | container: { 125 | position: 'relative', 126 | textAlign: 'center' 127 | } 128 | }; 129 | 130 | return ( 131 | 132 |
133 |
134 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 152 | 153 | 164 |
165 | 166 |
167 |
168 |
169 | 176 |
177 |
178 |
179 | ) 180 | } 181 | 182 | } 183 | 184 | -------------------------------------------------------------------------------- /src/components/DetailBody.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; 3 | 4 | import Header from '../components/Header' 5 | import TopicList from '../components/TopicList' 6 | 7 | import RefreshIndicator from 'material-ui/RefreshIndicator'; 8 | import Divider from 'material-ui/Divider'; 9 | import Menu from 'material-ui/Menu'; 10 | import MenuItem from 'material-ui/MenuItem'; 11 | import TextField from 'material-ui/TextField'; 12 | import RaisedButton from 'material-ui/RaisedButton'; 13 | import IconButton from 'material-ui/IconButton'; 14 | import ContentReply from 'material-ui/svg-icons/content/reply'; 15 | 16 | 17 | import Avatar from 'material-ui/Avatar'; 18 | import List from 'material-ui/List'; 19 | import ListItem from 'material-ui/List/ListItem'; 20 | import {blue300} from 'material-ui/styles/colors'; 21 | 22 | import tool from '../lib/tool' 23 | 24 | 25 | export default class DetailBody extends React.Component { 26 | constructor(props) { 27 | super(props); 28 | this.state = { 29 | errorText:'', 30 | replyContent:'', 31 | replyAction:false 32 | } 33 | } 34 | 35 | handleChange = (event) => { 36 | this.setState({replyContent: event.target.value}); 37 | } 38 | 39 | componentWillMount() { 40 | this.setState({replyAction:false}) 41 | let id = this.props.match.params.id 42 | this.props.showTopicDetail(id) 43 | } 44 | componentDidMount(){ 45 | this.goToTop() 46 | } 47 | 48 | goToTop(){ 49 | window.requestAnimationFrame(function() { 50 | window.scrollTo(0,0) 51 | }); 52 | } 53 | goToBottom(){ 54 | window.requestAnimationFrame(function() { 55 | const windowHeight = "innerHeight" in window ? window.innerHeight : document.documentElement.offsetHeight; 56 | const body = document.body; 57 | const html = document.documentElement; 58 | const docHeight = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight); 59 | window.scrollTo(0,docHeight+windowHeight) 60 | }); 61 | 62 | } 63 | 64 | 65 | createMarkup(html) { 66 | return {__html: html}; 67 | } 68 | 69 | clickReply = () => { 70 | if(!this.login()){ 71 | return false 72 | } 73 | this.goToBottom() 74 | 75 | } 76 | 77 | login = () => { 78 | let user = this.props.user 79 | if(!user || Object.keys(user).length <=0){ 80 | let uri = this.props.location.pathname 81 | this.props.history.push('/login',{fromUri:uri}) 82 | return false 83 | }else{ 84 | return true 85 | } 86 | 87 | } 88 | 89 | replyTopic = () => { 90 | 91 | if(!this.login()){ 92 | return false 93 | } 94 | 95 | let replyContent = this.state.replyContent 96 | 97 | this.setState({replyAction:true}); 98 | 99 | this.props.replyTopic(replyContent) 100 | 101 | 102 | 103 | } 104 | 105 | shouldComponentUpdate(nextProps,nextState){ 106 | return true 107 | } 108 | 109 | componentWillReceiveProps(nextProps){ 110 | let done = nextProps.status.done 111 | let error = nextProps.status.error 112 | 113 | if(done){ 114 | if(error){ 115 | this.setState({replyAction:false}) 116 | }else{ 117 | this.setState({replyContent:''}) 118 | } 119 | 120 | } 121 | 122 | 123 | 124 | } 125 | 126 | componentDidUpdate(){ 127 | let replyAction = this.state.replyAction 128 | if(replyAction){ 129 | this.goToBottom() 130 | } 131 | } 132 | 133 | 134 | render(){ 135 | 136 | const status = this.props.status 137 | const errorText = status.error 138 | let replyAction = this.state.replyAction 139 | let loadStatus = 'loading' 140 | let done = status.done 141 | let doing = status.doing 142 | if(done){ 143 | loadStatus = 'hide' 144 | } 145 | 146 | let hideTopic = true 147 | if(done){ 148 | hideTopic = false 149 | } 150 | 151 | if(replyAction){ 152 | hideTopic = false 153 | } 154 | 155 | let topicData = [] 156 | let replyNumber = 0 157 | let detail = {} 158 | let replies = [] 159 | if(status.detail){ 160 | detail = status.detail 161 | topicData = [detail] 162 | replies = detail.replies 163 | replyNumber = replies.length 164 | } 165 | 166 | 167 | const style = { 168 | container: { 169 | position: 'relative', 170 | textAlign: 'center', 171 | marginBottom:30 172 | }, 173 | refresh: { 174 | display: 'inline-block', 175 | position: 'relative', 176 | }, 177 | displayNone: { 178 | display: 'none' 179 | }, 180 | displayBlock: { 181 | display: 'block' 182 | }, 183 | container: { 184 | position: 'relative', 185 | textAlign: 'center' 186 | }, 187 | replyNumber:{ 188 | color:blue300 189 | }, 190 | 'secondaryText':{ 191 | marginRight:10 192 | }, 193 | avatar:{ 194 | left:6, 195 | top:21 196 | }, 197 | ListItemText:{ 198 | marginLeft:-10, 199 | } 200 | }; 201 | 202 | return ( 203 | 204 |
205 |
206 | 207 | 208 |
209 | 210 | 211 | 212 | 评论 {replyNumber}
} /> 213 | 214 | 215 | 216 | 217 | {replies.map((item,key) => 218 |
219 | } 221 | primaryText={ 222 |
223 | } 224 | secondaryText={ 225 |
226 | {item.author.loginname} 227 | {tool.getLastTime(item.create_at)} 228 | 229 |
230 | } 231 | rightIconButton={ 232 | 233 | 234 | 235 | } 236 | /> 237 | 238 |
239 | ) 240 | } 241 | 242 | 254 |
255 | 256 |
257 |
258 |
259 | 266 |
267 |
268 | 269 | ) 270 | } 271 | 272 | } 273 | 274 | -------------------------------------------------------------------------------- /src/components/Header.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; 3 | import AppBar from 'material-ui/AppBar'; 4 | import NavigationMenu from 'material-ui/svg-icons/navigation/menu'; 5 | import MapsNearMe from 'material-ui/svg-icons/maps/near-me'; 6 | import ActionHome from 'material-ui/svg-icons/action/home'; 7 | import ActionAccountCircle from 'material-ui/svg-icons/action/account-circle'; 8 | import ActionFeedback from 'material-ui/svg-icons/action/feedback'; 9 | import SubdirectoryArrowLeft from 'material-ui/svg-icons/navigation/subdirectory-arrow-left'; 10 | 11 | import IconButton from 'material-ui/IconButton'; 12 | 13 | import MenuItem from 'material-ui/MenuItem' 14 | import Drawer from 'material-ui/Drawer' 15 | import Paper from 'material-ui/Paper'; 16 | import Menu from 'material-ui/Menu'; 17 | 18 | import SocialPersonOutline from 'material-ui/svg-icons/social/person-outline'; 19 | import ActionThumbUp from 'material-ui/svg-icons/action/thumb-up'; 20 | import SocialShare from 'material-ui/svg-icons/social/share'; 21 | import ActionQuestionAnswer from 'material-ui/svg-icons/action/question-answer'; 22 | import ActionWork from 'material-ui/svg-icons/action/work'; 23 | 24 | import Divider from 'material-ui/Divider'; 25 | 26 | import { Link,Redirect } from 'react-router-dom' 27 | 28 | import { connect } from 'react-redux' 29 | 30 | 31 | 32 | class head extends React.Component { 33 | 34 | constructor(props) { 35 | super(props) 36 | this.state = { 37 | open: false, 38 | title: this.props.routeName 39 | } 40 | } 41 | 42 | 43 | handleToggle = () => this.setState({open: !this.state.open}); 44 | 45 | handleClose = () => this.setState({open: false}); 46 | 47 | changeOpen = (open) => { 48 | this.setState({open: open}) 49 | } 50 | 51 | touchCreate = () => { 52 | this.handleClose() 53 | this.props.history.push('/create') 54 | }; 55 | 56 | login = () => { 57 | this.handleClose() 58 | let uri = this.props.location.pathname 59 | this.props.history.push('/login',{fromUri:uri}) 60 | } 61 | 62 | logout = () => { 63 | this.handleClose() 64 | this.props.clearUser() 65 | this.props.history.push('/login') 66 | } 67 | 68 | userinfo = () => { 69 | this.handleClose() 70 | const loginname = this.props.user.loginname 71 | let url = '/user/'+loginname 72 | this.props.history.push(url) 73 | } 74 | render(){ 75 | 76 | 77 | const user = this.props.user 78 | let login = false 79 | 80 | let logoutStyle = {} 81 | let loginStyle = {} 82 | if(user && Object.keys(user).length > 0){ 83 | loginStyle ={ 84 | display:'none' 85 | } 86 | login = true 87 | }else{ 88 | logoutStyle = { 89 | display:'none' 90 | } 91 | } 92 | 93 | 94 | return ( 95 | 96 |
97 | } 99 | onLeftIconButtonTouchTap={this.handleToggle} 100 | title={this.state.title} 101 | titleStyle={{textAlign: 'center'}} 102 | iconElementRight={} 103 | onRightIconButtonTouchTap={this.touchCreate} 104 | style={{position: 'fixed'}} 105 | /> 106 | 112 | 113 |
114 | } /> 115 | 116 |
117 |
118 | } /> 119 | 120 | 121 | } /> 122 | 123 |
124 | 125 | 126 | 127 | } /> 128 | 129 | 130 | } /> 131 | 132 | 133 | } /> 134 | 135 | 136 | } /> 137 | 138 | 139 | } /> 140 | 141 | 142 | 143 | } /> 144 | 145 |
146 |
147 |
148 |
149 | ) 150 | } 151 | } 152 | 153 | 154 | const mapStateToProps = (state) => { 155 | return { 156 | user: state.user 157 | } 158 | } 159 | 160 | import { clearUser } from '../store/actions' 161 | 162 | const mapDispatchToProps = (dispatch) => { 163 | return { 164 | clearUser: () => { 165 | dispatch(clearUser()) 166 | } 167 | } 168 | } 169 | 170 | 171 | const Header = connect( 172 | mapStateToProps, 173 | mapDispatchToProps 174 | )(head) 175 | 176 | export default Header 177 | 178 | -------------------------------------------------------------------------------- /src/components/LoginForm.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; 4 | 5 | import TextField from 'material-ui/TextField'; 6 | import RaisedButton from 'material-ui/RaisedButton'; 7 | import RefreshIndicator from 'material-ui/RefreshIndicator'; 8 | 9 | import { 10 | Redirect 11 | } from 'react-router-dom' 12 | 13 | 14 | export default class LoginForm extends React.Component { 15 | constructor(props) { 16 | super(props); 17 | this.state = { 18 | AccessToken: '' 19 | }; 20 | } 21 | 22 | handleChange = (event) => { 23 | this.setState({AccessToken: event.target.value}); 24 | } 25 | login = () => { 26 | let AccessToken = this.state.AccessToken 27 | this.props.login(AccessToken) 28 | } 29 | 30 | goBack = () => { 31 | const user = this.props.user 32 | if(user && Object.keys(user).length > 0){ 33 | let uri = this.props.location.state.fromUri 34 | this.props.history.push(uri) 35 | } 36 | } 37 | componentWillMount(){ 38 | this.goBack() 39 | } 40 | 41 | shouldComponentUpdate(nextProps){ 42 | this.goBack() 43 | return true 44 | } 45 | 46 | render(){ 47 | 48 | 49 | const errorText = this.props.status.error 50 | const doing = this.props.status.doing 51 | 52 | 53 | 54 | let loadStatus = 'hide' 55 | if(doing){ 56 | loadStatus = 'loading' 57 | } 58 | 59 | const style = { 60 | container: { 61 | position: 'relative', 62 | textAlign: 'center' 63 | }, 64 | refresh: { 65 | display: 'inline-block', 66 | position: 'relative', 67 | }, 68 | displayNone: { 69 | display: 'none' 70 | }, 71 | displayBlock: { 72 | display: 'block' 73 | } 74 | }; 75 | 76 | 77 | return ( 78 | 79 | 80 |
81 | 82 | 90 |
91 | 92 | 93 |
94 |
95 | 102 |
103 |
104 | 105 |
106 | ) 107 | } 108 | 109 | } 110 | 111 | -------------------------------------------------------------------------------- /src/components/TopicList.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; 4 | 5 | import RefreshIndicator from 'material-ui/RefreshIndicator'; 6 | 7 | import Avatar from 'material-ui/Avatar'; 8 | import List from 'material-ui/List'; 9 | import ListItem from 'material-ui/List/ListItem'; 10 | import ContentReply from 'material-ui/svg-icons/content/reply'; 11 | import Divider from 'material-ui/Divider'; 12 | 13 | 14 | import ContentForward from 'material-ui/svg-icons/content/forward'; 15 | import ActionThumbUp from 'material-ui/svg-icons/action/thumb-up'; 16 | 17 | import SocialShare from 'material-ui/svg-icons/social/share'; 18 | import ActionQuestionAnswer from 'material-ui/svg-icons/action/question-answer'; 19 | import ActionWork from 'material-ui/svg-icons/action/work'; 20 | import ActionHome from 'material-ui/svg-icons/action/home'; 21 | 22 | import { Link } from 'react-router-dom' 23 | 24 | import tool from '../lib/tool' 25 | 26 | import {teal500, red500, greenA200,orange900,blueA700,pinkA400,cyan500} from 'material-ui/styles/colors'; 27 | 28 | 29 | export default class TopicList extends React.Component { 30 | constructor(props) { 31 | super(props); 32 | } 33 | 34 | getTabIcon(item){ 35 | const style = { 36 | tabIcon:{ 37 | marginBottom:-5, 38 | marginRight:8 39 | } 40 | } 41 | 42 | const tabIcon = { 43 | home: , 44 | good: , 45 | share: , 46 | ask: , 47 | job: 48 | } 49 | let icon = '' 50 | if(item.top){ 51 | icon = 52 | }else if(item.good){ 53 | icon = tabIcon['good'] 54 | }else{ 55 | icon = tabIcon[item.tab] 56 | } 57 | if(!icon){ 58 | icon = tabIcon['home'] 59 | } 60 | 61 | return icon 62 | } 63 | 64 | render(){ 65 | let topic = this.props.topic 66 | if(!topic || Object.keys(topic).length <= 0){ 67 | return null; 68 | } 69 | const style = { 70 | 'leftIcon':{ 71 | marginLeft:0, 72 | marginRight:0 73 | }, 74 | 'secondaryText':{ 75 | marginLeft:10 76 | }, 77 | topicTitle:{ 78 | lineHeight:'24px' 79 | }, 80 | avatar:{ 81 | left:6, 82 | top:21 83 | }, 84 | ListItemText:{ 85 | marginLeft:-10, 86 | marginRight:-10 87 | } 88 | 89 | } 90 | 91 | 92 | 93 | return ( 94 | 95 | 96 | {topic.map((item,key) => 97 | 98 | } 100 | primaryText={ 101 |
102 | {this.getTabIcon(item)} 103 | {item.title} 104 |
105 | } 106 | secondaryText={ 107 |
108 | {tool.getLastTime(item.last_reply_at)} 109 | {`${item.reply_count} comments`} 110 | 111 |
112 | } 113 | /> 114 | 115 | 116 | ) 117 | } 118 |
119 |
120 | ) 121 | } 122 | 123 | } 124 | 125 | -------------------------------------------------------------------------------- /src/components/UserPage.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; 3 | 4 | import Header from '../components/Header' 5 | import TopicList from '../components/TopicList' 6 | 7 | import RefreshIndicator from 'material-ui/RefreshIndicator'; 8 | import Divider from 'material-ui/Divider'; 9 | import TextField from 'material-ui/TextField'; 10 | import RaisedButton from 'material-ui/RaisedButton'; 11 | import IconButton from 'material-ui/IconButton'; 12 | import ContentReply from 'material-ui/svg-icons/content/reply'; 13 | 14 | 15 | import Avatar from 'material-ui/Avatar'; 16 | import List from 'material-ui/List'; 17 | import ListItem from 'material-ui/List/ListItem'; 18 | import { Link,Redirect } from 'react-router-dom' 19 | 20 | 21 | import Tabs from 'material-ui/Tabs'; 22 | import Tab from 'material-ui/Tabs/Tab'; 23 | 24 | import Slider from 'material-ui/Slider'; 25 | 26 | import tool from '../lib/tool' 27 | 28 | 29 | export default class UserPage extends React.Component { 30 | constructor(props) { 31 | super(props); 32 | } 33 | 34 | 35 | componentDidMount() { 36 | 37 | let loginname = this.props.match.params.loginname 38 | this.props.showUserDetail(loginname) 39 | } 40 | 41 | 42 | 43 | render(){ 44 | 45 | const status = this.props.status 46 | let loadStatus = 'loading' 47 | let done = status.done 48 | if(done){ 49 | loadStatus = 'hide' 50 | } 51 | 52 | let account = status.account; 53 | let recent_topics = [] 54 | let recent_replies = [] 55 | if(account && Object.keys(account).length >= 0){ 56 | recent_replies = account.recent_replies 57 | recent_topics = account.recent_topics 58 | }else{ 59 | return null 60 | } 61 | 62 | 63 | const style = { 64 | container: { 65 | position: 'relative', 66 | textAlign: 'center', 67 | marginBottom:30 68 | }, 69 | refresh: { 70 | display: 'inline-block', 71 | position: 'relative', 72 | }, 73 | displayNone: { 74 | display: 'none' 75 | }, 76 | displayBlock: { 77 | display: 'block' 78 | }, 79 | container: { 80 | position: 'relative', 81 | textAlign: 'center' 82 | }, 83 | 'secondaryText':{ 84 | marginRight:10 85 | }, 86 | account_avatar:{ 87 | textAlign:'center', 88 | marginTop:20, 89 | marginBottom:10 90 | }, 91 | account_info:{ 92 | textAlign:'center', 93 | color:'#778087', 94 | marginBottom:20 95 | } 96 | 97 | }; 98 | 99 | const avatar_size = 80 100 | 101 | 102 | return ( 103 | 104 |
105 |
106 |
107 |

108 | 109 |

110 |

111 | {account.loginname} 112 | {tool.getLastTime(account.create_at)} 113 |

114 |
115 | 116 | 117 | 118 |
119 | 120 | {recent_topics.map((item,key) => 121 | 122 | } 124 | primaryText={item.title} 125 | secondaryText={ 126 |
127 | {item.author.loginname} 128 | {tool.getLastTime(item.last_reply_at)} 129 | 130 |
131 | } 132 | /> 133 | 134 | 135 | ) 136 | } 137 |
138 |
139 |
140 | 141 |
142 | 143 | {recent_replies.map((item,key) => 144 | 145 | } 147 | primaryText={item.title} 148 | secondaryText={ 149 |
150 | {item.author.loginname} 151 | {tool.getLastTime(item.last_reply_at)} 152 | 153 |
154 | } 155 | /> 156 | 157 | 158 | ) 159 | } 160 |
161 |
162 |
163 |
164 | 165 | 166 | 167 |
168 |
169 | 176 |
177 |
178 |
179 | ) 180 | } 181 | 182 | } 183 | 184 | -------------------------------------------------------------------------------- /src/containers/About.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import Divider from 'material-ui/Divider'; 4 | import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; 5 | 6 | import Header from '../components/Header' 7 | 8 | export default class About extends React.Component { 9 | 10 | render(){ 11 | const style = { 12 | headline: { 13 | fontSize: 24, 14 | marginBottom: 12, 15 | fontWeight: 400, 16 | }, 17 | } 18 | return ( 19 | 20 |
21 |
22 |
23 | 24 | 25 |

关于

26 |

27 | 本项目是基于Cnodejs的api,采用ReactJS前端框架,借助webpack开发的单页面web应用 28 |

29 |
30 | 31 |

地址

32 |

33 | https://github.com/luckybirdme/reactjs-cnodejs 34 |

35 |
36 | 37 | 38 | 39 |
40 |
41 |
42 | ) 43 | } 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /src/containers/Create.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import Header from '../components/Header' 4 | import CreateForm from '../components/CreateForm' 5 | 6 | 7 | import { connect } from 'react-redux' 8 | import { saveUser,todoStatus,doingStatus,doneStatus } from '../store/actions' 9 | 10 | import 'whatwg-fetch' 11 | 12 | const postCreateTopic = (topic) => { 13 | return (dispatch,getState) => { 14 | 15 | let state = getState() 16 | let status = state.status 17 | 18 | let doing = status.doing 19 | if(doing){ 20 | return; 21 | } 22 | 23 | status.error = '' 24 | if(!topic.tab){ 25 | status.error = "tab is empty" 26 | }else if(!topic.title){ 27 | status.error = "title is empty" 28 | }else if(!topic.content){ 29 | status.error = "content is empty" 30 | } 31 | 32 | if(status.error){ 33 | dispatch(doneStatus(status)) 34 | return; 35 | } 36 | 37 | 38 | let url = 'https://cnodejs.org/api/v1/topics' 39 | 40 | let user = state.user 41 | let postData = { 42 | content: topic.content + ' --- From [LBRC](https://github.com/luckybirdme/Reactjs-cnodejs)', 43 | accesstoken: user.accesstoken 44 | } 45 | postData = Object.assign({},topic,postData) 46 | 47 | status.doing = true 48 | status.done = false 49 | dispatch(todoStatus(status)) 50 | 51 | return fetch(url, { 52 | method: 'POST', 53 | headers: { 54 | 'Content-Type': 'application/json' 55 | }, 56 | body: JSON.stringify(postData) 57 | }).then(response => { 58 | return response.json() 59 | }).then(json => { 60 | if (json.success) { 61 | status.create = true; 62 | status.topic.search.page = 1 63 | }else{ 64 | status.error = json.error_msg 65 | } 66 | 67 | status.doing = false 68 | status.done = true 69 | dispatch(doneStatus(status)) 70 | 71 | }).catch((ex) => { 72 | status.error = "Something mistake :" + ex; 73 | status.doing = false 74 | status.done = true 75 | dispatch(doneStatus(status)) 76 | }) 77 | } 78 | } 79 | 80 | const defaultCreate = (topic) => { 81 | return (dispatch,getState) => { 82 | 83 | let state = getState() 84 | let status = state.status 85 | 86 | status.create = false 87 | status.error = '' 88 | dispatch(doneStatus(status)) 89 | 90 | 91 | } 92 | } 93 | const mapStateToProps = (state) => { 94 | return { 95 | user: state.user, 96 | status: state.status 97 | } 98 | } 99 | 100 | const mapDispatchToProps = (dispatch) => { 101 | return { 102 | createTopic: (topic) => { 103 | dispatch(postCreateTopic(topic)) 104 | }, 105 | clearCreate:() => { 106 | dispatch(defaultCreate()) 107 | } 108 | } 109 | } 110 | 111 | const TopicForm = connect( 112 | mapStateToProps, 113 | mapDispatchToProps 114 | )(CreateForm) 115 | 116 | 117 | export default class Create extends React.Component { 118 | 119 | render(){ 120 | return ( 121 |
122 |
123 |
124 | 125 |
126 |
127 | ) 128 | } 129 | 130 | } 131 | 132 | -------------------------------------------------------------------------------- /src/containers/Detail.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; 3 | 4 | import Header from '../components/Header' 5 | import DetailBody from '../components/DetailBody' 6 | 7 | 8 | import { connect } from 'react-redux' 9 | import { saveUser,todoStatus,doingStatus,doneStatus,saveTopic } from '../store/actions' 10 | 11 | 12 | import 'whatwg-fetch' 13 | 14 | const getTopicDetail = (id) => { 15 | return (dispatch,getState) => { 16 | let state = getState() 17 | let status = state.status 18 | 19 | let doing = status.doing 20 | if(doing){ 21 | return; 22 | } 23 | 24 | let url = "https://cnodejs.org/api/v1/topic/"+id; 25 | 26 | status.doing = true 27 | status.done = false 28 | dispatch(todoStatus(status)) 29 | 30 | return fetch(url, { 31 | method: 'GET', 32 | headers: { 33 | 'Content-Type': 'application/json' 34 | } 35 | }).then(response => { 36 | return response.json() 37 | }).then(json => { 38 | let detail = json.data 39 | status.detail = detail; 40 | status.doing = false 41 | status.done = true 42 | dispatch(doneStatus(status)) 43 | 44 | }).catch((ex) => { 45 | status.error = "Something mistake :" + ex; 46 | status.doing = false 47 | status.done = true 48 | dispatch(doneStatus(status)) 49 | }) 50 | } 51 | } 52 | 53 | const postReplyTopic = (content) => { 54 | return (dispatch,getState) => { 55 | let state = getState() 56 | let status = state.status 57 | 58 | let user = state.user 59 | 60 | let doing = status.doing 61 | if(doing){ 62 | return; 63 | } 64 | status.error = '' 65 | if(content.length <= 0){ 66 | status.error = "Comment can't be empty"; 67 | dispatch(doneStatus(status)) 68 | return; 69 | } 70 | 71 | let detail = status.detail 72 | let id = detail.id 73 | 74 | let url = 'https://cnodejs.org/api/v1/topic/' + id + '/replies' 75 | 76 | let postData = { 77 | accesstoken: user.accesstoken, 78 | content: content + ' --- From [LBRC](https://github.com/luckybirdme/Reactjs-cnodejs)' 79 | } 80 | 81 | status.doing = true 82 | status.done = false 83 | dispatch(todoStatus(status)) 84 | 85 | return fetch(url, { 86 | method: 'POST', 87 | headers: { 88 | 'Content-Type': 'application/json' 89 | }, 90 | body: JSON.stringify(postData) 91 | }).then(response => { 92 | return response.json() 93 | }).then(json => { 94 | if (json.success) { 95 | let time = new Date() 96 | if(!detail.replies || detail.replies.length <= 0){ 97 | detail.replies = [] 98 | } 99 | detail.replies.push({ 100 | author: user, 101 | content: content, 102 | create_at: time 103 | }) 104 | } 105 | 106 | status.detail = detail; 107 | status.doing = false 108 | status.done = true 109 | dispatch(doneStatus(status)) 110 | 111 | }).catch((ex) => { 112 | status.error = "Something mistake :" + ex; 113 | status.doing = false 114 | status.done = true 115 | dispatch(doneStatus(status)) 116 | }) 117 | } 118 | } 119 | 120 | const mapStateToProps = (state) => { 121 | return { 122 | user: state.user, 123 | status:state.status 124 | } 125 | } 126 | 127 | 128 | const mapDispatchToProps = (dispatch) => { 129 | return { 130 | showTopicDetail: (id) => { 131 | dispatch(getTopicDetail(id)) 132 | }, 133 | replyTopic: (content) => { 134 | dispatch(postReplyTopic(content)) 135 | } 136 | } 137 | } 138 | 139 | 140 | const DetailContent = connect( 141 | mapStateToProps, 142 | mapDispatchToProps 143 | )(DetailBody) 144 | 145 | 146 | export default class Detail extends React.Component { 147 | 148 | render(){ 149 | 150 | return ( 151 | 152 |
153 |
154 |
155 | 156 | 157 | 158 |
159 |
160 |
161 | ) 162 | } 163 | 164 | } 165 | 166 | -------------------------------------------------------------------------------- /src/containers/Home.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | 4 | import Header from '../components/Header' 5 | import BodyPage from '../components/BodyPage' 6 | import { connect } from 'react-redux' 7 | import { saveUser,todoStatus,doingStatus,doneStatus,saveTopic } from '../store/actions' 8 | 9 | import 'whatwg-fetch' 10 | 11 | 12 | const getTopic = (tab) => { 13 | return (dispatch,getState) => { 14 | let state = getState() 15 | let status = state.status 16 | 17 | let doing = status.doing 18 | if(doing){ 19 | return; 20 | } 21 | 22 | let topic = { 23 | data:[], 24 | search:{} 25 | } 26 | if(status && status.hasOwnProperty('topic')){ 27 | topic = status.topic 28 | } 29 | 30 | let search = topic.search 31 | 32 | if(!search || Object.keys(search).length <= 0){ 33 | search = { 34 | page: 1, 35 | limit: 20, 36 | tab: 'all', 37 | mdrender: true 38 | } 39 | topic.data = [] 40 | }else if(tab && search.tab != tab){ 41 | search.tab = tab 42 | search.page = 1 43 | topic.data = [] 44 | } 45 | topic.search = search 46 | 47 | 48 | let esc = encodeURIComponent; 49 | let query = Object.keys(search) 50 | .map(k => `${esc(k)}=${esc(search[k])}`) 51 | .join('&'); 52 | let url = "https://cnodejs.org/api/v1/topics?"+query; 53 | 54 | 55 | status.doing = true 56 | status.done = false 57 | status.topic = topic 58 | dispatch(todoStatus(status)) 59 | return fetch(url, { 60 | method: 'GET', 61 | headers: { 62 | 'Content-Type': 'application/json' 63 | } 64 | }).then(response => { 65 | return response.json() 66 | }).then(json => { 67 | 68 | 69 | let res = json.data 70 | if(search.page == 1){ 71 | topic.data = res 72 | }else{ 73 | topic.data = topic.data.concat(res) 74 | } 75 | search.page += 1 76 | 77 | topic.search = search; 78 | 79 | status.topic = topic 80 | status.doing = false 81 | status.done = true 82 | dispatch(doneStatus(status)) 83 | 84 | }).catch((ex) => { 85 | status.error = "Something mistake :" + ex; 86 | status.doing = false 87 | status.done = true 88 | dispatch(doneStatus(status)) 89 | }) 90 | } 91 | } 92 | 93 | 94 | const mapStateToProps = (state) => { 95 | return { 96 | status: state.status 97 | } 98 | } 99 | 100 | const mapDispatchToProps = (dispatch) => { 101 | return { 102 | showTopic: (tab) => { 103 | dispatch(getTopic(tab)) 104 | } 105 | } 106 | } 107 | 108 | 109 | const MainPage = connect( 110 | mapStateToProps, 111 | mapDispatchToProps 112 | )(BodyPage) 113 | 114 | 115 | 116 | export default class Home extends React.Component { 117 | render(){ 118 | return ( 119 |
120 |
121 |
122 | 123 |
124 |
125 | ) 126 | } 127 | } 128 | 129 | -------------------------------------------------------------------------------- /src/containers/Login.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import Header from '../components/Header' 4 | import LoginForm from '../components/LoginForm' 5 | 6 | 7 | import { connect } from 'react-redux' 8 | import { saveUser,todoStatus,doingStatus,doneStatus } from '../store/actions' 9 | 10 | import 'whatwg-fetch' 11 | 12 | const getUser = (AccessToken) => { 13 | return dispatch => { 14 | dispatch(todoStatus({ 15 | error: '', 16 | doing: true 17 | })) 18 | if(AccessToken.length <= 0){ 19 | dispatch(doneStatus({ 20 | error:"AccessToken can't be empty", 21 | doing : false 22 | })) 23 | return; 24 | } 25 | let url = "https://cnodejs.org/api/v1/accesstoken" 26 | 27 | return fetch(url, { 28 | method: 'POST', 29 | headers: { 30 | 'Content-Type': 'application/json' 31 | }, 32 | body: JSON.stringify({ 33 | accesstoken: AccessToken 34 | }) 35 | }).then(response => { 36 | return response.json() 37 | }).then(data => { 38 | if(data.success == true && data.loginname){ 39 | let user = { 40 | loginname: data.loginname, 41 | avatar_url: data.avatar_url, 42 | id: data.id, 43 | accesstoken: AccessToken 44 | } 45 | dispatch(saveUser(user)) 46 | dispatch(doneStatus({ 47 | error: '', 48 | doing: false 49 | })) 50 | 51 | }else{ 52 | dispatch(doneStatus({ 53 | error: "AccessToken is not right", 54 | doing: false 55 | })) 56 | } 57 | }).catch((ex) => { 58 | dispatch(doneStatus({ 59 | error: "Something mistake :" + ex, 60 | doing: false 61 | })) 62 | }) 63 | } 64 | } 65 | 66 | const mapStateToProps = (state) => { 67 | return { 68 | user: state.user, 69 | status: state.status 70 | } 71 | } 72 | 73 | const mapDispatchToProps = (dispatch) => { 74 | return { 75 | login: (AccessToken) => { 76 | dispatch(getUser(AccessToken)) 77 | } 78 | } 79 | } 80 | 81 | const UserLogin = connect( 82 | mapStateToProps, 83 | mapDispatchToProps 84 | )(LoginForm) 85 | 86 | 87 | export default class Login extends React.Component { 88 | 89 | render(){ 90 | return ( 91 |
92 |
93 |
94 | 95 |
96 |
97 | ) 98 | } 99 | 100 | } 101 | 102 | -------------------------------------------------------------------------------- /src/containers/Root.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Router from './Router' 3 | 4 | import { Provider } from 'react-redux' 5 | import configureStore from '../store/configureStore'; 6 | 7 | import '../static/css/global.css'; 8 | import '../static/css/github-markdown.css'; 9 | 10 | const store = configureStore() 11 | 12 | export default class Root extends React.Component { 13 | render(){ 14 | return ( 15 | 16 | 17 | 18 | ) 19 | } 20 | } 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/containers/Router.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { 3 | BrowserRouter, 4 | Route, 5 | Link 6 | } from 'react-router-dom' 7 | 8 | 9 | import Home from './Home' 10 | import About from './About' 11 | import Login from './Login' 12 | import Create from './Create' 13 | import Detail from './Detail' 14 | import User from './User' 15 | 16 | 17 | // Some folks find value in a centralized route config. 18 | // A route config is just data. React is great at mapping 19 | // data into components, and is a component. 20 | 21 | 22 | const routes = [ 23 | { 24 | path: '/', 25 | component: Home, 26 | exact: true, 27 | name: 'Home' 28 | }, 29 | { 30 | path: '/home/:tab', 31 | component: Home, 32 | name: 'Home' 33 | }, 34 | { 35 | path: '/about', 36 | component: About, 37 | name: 'About' 38 | }, 39 | { 40 | path: '/login', 41 | component: Login, 42 | name: 'Login' 43 | }, 44 | { 45 | path: '/create', 46 | component: Create, 47 | name: 'Create' 48 | }, 49 | { 50 | path: '/detail/:id', 51 | component: Detail, 52 | name: 'Detail' 53 | }, 54 | { 55 | path: '/user/:loginname', 56 | component: User, 57 | name: 'User' 58 | } 59 | ] 60 | 61 | 62 | export default () => ( 63 | 64 |
65 | {routes.map((route, i) => ( 66 | ( 67 | 68 | )}/> 69 | ))} 70 |
71 |
72 | ) 73 | 74 | 75 | -------------------------------------------------------------------------------- /src/containers/User.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | 4 | import Header from '../components/Header' 5 | import UserPage from '../components/UserPage' 6 | import { connect } from 'react-redux' 7 | import { saveUser,todoStatus,doingStatus,doneStatus,saveTopic } from '../store/actions' 8 | 9 | import 'whatwg-fetch' 10 | 11 | 12 | const getUserDetail = (loginname) => { 13 | return (dispatch,getState) => { 14 | let state = getState() 15 | let status = state.status 16 | 17 | let doing = status.doing 18 | if(doing){ 19 | return; 20 | } 21 | 22 | 23 | let url = "https://cnodejs.org/api/v1/user/"+loginname; 24 | 25 | 26 | status.doing = true 27 | status.done = false 28 | dispatch(todoStatus(status)) 29 | return fetch(url, { 30 | method: 'GET', 31 | headers: { 32 | 'Content-Type': 'application/json' 33 | } 34 | }).then(response => { 35 | return response.json() 36 | }).then(json => { 37 | 38 | let account = {} 39 | if(json.success){ 40 | account = json.data 41 | } 42 | 43 | status.account = account 44 | status.doing = false 45 | status.done = true 46 | dispatch(doneStatus(status)) 47 | 48 | 49 | 50 | 51 | }).catch((ex) => { 52 | status.error = "Something mistake :" + ex; 53 | status.doing = false 54 | status.done = true 55 | dispatch(doneStatus(status)) 56 | }) 57 | } 58 | } 59 | 60 | 61 | const mapStateToProps = (state) => { 62 | return { 63 | status: state.status 64 | } 65 | } 66 | 67 | const mapDispatchToProps = (dispatch) => { 68 | return { 69 | showUserDetail: (loginname) => { 70 | dispatch(getUserDetail(loginname)) 71 | } 72 | } 73 | } 74 | 75 | 76 | const UserBody = connect( 77 | mapStateToProps, 78 | mapDispatchToProps 79 | )(UserPage) 80 | 81 | 82 | 83 | export default class User extends React.Component { 84 | render(){ 85 | return ( 86 |
87 |
88 |
89 | 90 |
91 |
92 | ) 93 | } 94 | } 95 | 96 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | import { AppContainer } from 'react-hot-loader' 4 | 5 | import Root from './containers/Root' 6 | 7 | 8 | import injectTapEventPlugin from 'react-tap-event-plugin' 9 | 10 | // Needed for onTouchTap 11 | // http://stackoverflow.com/a/34015469/988941 12 | injectTapEventPlugin(); 13 | 14 | 15 | const render = Component => { 16 | ReactDOM.render( 17 | 18 | 19 | , 20 | document.getElementById('root') 21 | ) 22 | } 23 | 24 | 25 | render(Root) 26 | 27 | if (module.hot) { 28 | module.hot.accept('./containers/Root', () => { 29 | const NextApp = require('./containers/Root').default; 30 | ReactDOM.render( 31 | 32 | 33 | , 34 | document.getElementById('root') 35 | ); 36 | }); 37 | } -------------------------------------------------------------------------------- /src/lib/tool.js: -------------------------------------------------------------------------------- 1 | import timeago from 'timeago.js'; 2 | exports.getLastTime = function (time) { 3 | var timeagoInstance = timeago(); 4 | return timeagoInstance.format(time); 5 | } -------------------------------------------------------------------------------- /src/static/css/github-markdown.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: octicons-anchor; 3 | src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAYcAA0AAAAACjQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABMAAAABwAAAAca8vGTk9TLzIAAAFMAAAARAAAAFZG1VHVY21hcAAAAZAAAAA+AAABQgAP9AdjdnQgAAAB0AAAAAQAAAAEACICiGdhc3AAAAHUAAAACAAAAAj//wADZ2x5ZgAAAdwAAADRAAABEKyikaNoZWFkAAACsAAAAC0AAAA2AtXoA2hoZWEAAALgAAAAHAAAACQHngNFaG10eAAAAvwAAAAQAAAAEAwAACJsb2NhAAADDAAAAAoAAAAKALIAVG1heHAAAAMYAAAAHwAAACABEAB2bmFtZQAAAzgAAALBAAAFu3I9x/Nwb3N0AAAF/AAAAB0AAAAvaoFvbwAAAAEAAAAAzBdyYwAAAADP2IQvAAAAAM/bz7t4nGNgZGFgnMDAysDB1Ml0hoGBoR9CM75mMGLkYGBgYmBlZsAKAtJcUxgcPsR8iGF2+O/AEMPsznAYKMwIkgMA5REMOXicY2BgYGaAYBkGRgYQsAHyGMF8FgYFIM0ChED+h5j//yEk/3KoSgZGNgYYk4GRCUgwMaACRoZhDwCs7QgGAAAAIgKIAAAAAf//AAJ4nHWMMQrCQBBF/0zWrCCIKUQsTDCL2EXMohYGSSmorScInsRGL2DOYJe0Ntp7BK+gJ1BxF1stZvjz/v8DRghQzEc4kIgKwiAppcA9LtzKLSkdNhKFY3HF4lK69ExKslx7Xa+vPRVS43G98vG1DnkDMIBUgFN0MDXflU8tbaZOUkXUH0+U27RoRpOIyCKjbMCVejwypzJJG4jIwb43rfl6wbwanocrJm9XFYfskuVC5K/TPyczNU7b84CXcbxks1Un6H6tLH9vf2LRnn8Ax7A5WQAAAHicY2BkYGAA4teL1+yI57f5ysDNwgAC529f0kOmWRiYVgEpDgYmEA8AUzEKsQAAAHicY2BkYGB2+O/AEMPCAAJAkpEBFbAAADgKAe0EAAAiAAAAAAQAAAAEAAAAAAAAKgAqACoAiAAAeJxjYGRgYGBhsGFgYgABEMkFhAwM/xn0QAIAD6YBhwB4nI1Ty07cMBS9QwKlQapQW3VXySvEqDCZGbGaHULiIQ1FKgjWMxknMfLEke2A+IJu+wntrt/QbVf9gG75jK577Lg8K1qQPCfnnnt8fX1NRC/pmjrk/zprC+8D7tBy9DHgBXoWfQ44Av8t4Bj4Z8CLtBL9CniJluPXASf0Lm4CXqFX8Q84dOLnMB17N4c7tBo1AS/Qi+hTwBH4rwHHwN8DXqQ30XXAS7QaLwSc0Gn8NuAVWou/gFmnjLrEaEh9GmDdDGgL3B4JsrRPDU2hTOiMSuJUIdKQQayiAth69r6akSSFqIJuA19TrzCIaY8sIoxyrNIrL//pw7A2iMygkX5vDj+G+kuoLdX4GlGK/8Lnlz6/h9MpmoO9rafrz7ILXEHHaAx95s9lsI7AHNMBWEZHULnfAXwG9/ZqdzLI08iuwRloXE8kfhXYAvE23+23DU3t626rbs8/8adv+9DWknsHp3E17oCf+Z48rvEQNZ78paYM38qfk3v/u3l3u3GXN2Dmvmvpf1Srwk3pB/VSsp512bA/GG5i2WJ7wu430yQ5K3nFGiOqgtmSB5pJVSizwaacmUZzZhXLlZTq8qGGFY2YcSkqbth6aW1tRmlaCFs2016m5qn36SbJrqosG4uMV4aP2PHBmB3tjtmgN2izkGQyLWprekbIntJFing32a5rKWCN/SdSoga45EJykyQ7asZvHQ8PTm6cslIpwyeyjbVltNikc2HTR7YKh9LBl9DADC0U/jLcBZDKrMhUBfQBvXRzLtFtjU9eNHKin0x5InTqb8lNpfKv1s1xHzTXRqgKzek/mb7nB8RZTCDhGEX3kK/8Q75AmUM/eLkfA+0Hi908Kx4eNsMgudg5GLdRD7a84npi+YxNr5i5KIbW5izXas7cHXIMAau1OueZhfj+cOcP3P8MNIWLyYOBuxL6DRylJ4cAAAB4nGNgYoAALjDJyIAOWMCiTIxMLDmZedkABtIBygAAAA==) format('woff'); 4 | } 5 | 6 | .markdown-body { 7 | -webkit-text-size-adjust: 100%; 8 | text-size-adjust: 100%; 9 | color: #333; 10 | font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif; 11 | font-size: 16px; 12 | line-height: 1.6; 13 | word-wrap: break-word; 14 | } 15 | 16 | .markdown-body a { 17 | background-color: transparent; 18 | } 19 | 20 | .markdown-body a:active, 21 | .markdown-body a:hover { 22 | outline: 0; 23 | } 24 | 25 | .markdown-body strong { 26 | font-weight: bold; 27 | } 28 | 29 | .markdown-body h1 { 30 | font-size: 2em; 31 | margin: 0.67em 0; 32 | } 33 | 34 | .markdown-body img { 35 | border: 0; 36 | } 37 | 38 | .markdown-body hr { 39 | box-sizing: content-box; 40 | height: 0; 41 | } 42 | 43 | .markdown-body pre { 44 | overflow: auto; 45 | } 46 | 47 | .markdown-body code, 48 | .markdown-body kbd, 49 | .markdown-body pre { 50 | font-family: monospace, monospace; 51 | font-size: 1em; 52 | } 53 | 54 | .markdown-body input { 55 | color: inherit; 56 | font: inherit; 57 | margin: 0; 58 | } 59 | 60 | .markdown-body html input[disabled] { 61 | cursor: default; 62 | } 63 | 64 | .markdown-body input { 65 | line-height: normal; 66 | } 67 | 68 | .markdown-body input[type="checkbox"] { 69 | box-sizing: border-box; 70 | padding: 0; 71 | } 72 | 73 | .markdown-body table { 74 | border-collapse: collapse; 75 | border-spacing: 0; 76 | } 77 | 78 | .markdown-body td, 79 | .markdown-body th { 80 | padding: 0; 81 | } 82 | 83 | .markdown-body * { 84 | box-sizing: border-box; 85 | } 86 | 87 | .markdown-body input { 88 | font: 13px/1.4 Helvetica, arial, nimbussansl, liberationsans, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol"; 89 | } 90 | 91 | .markdown-body a { 92 | color: #4078c0; 93 | text-decoration: none; 94 | } 95 | 96 | .markdown-body a:hover, 97 | .markdown-body a:active { 98 | text-decoration: underline; 99 | } 100 | 101 | .markdown-body hr { 102 | height: 0; 103 | margin: 15px 0; 104 | overflow: hidden; 105 | background: transparent; 106 | border: 0; 107 | border-bottom: 1px solid #ddd; 108 | } 109 | 110 | .markdown-body hr:before { 111 | display: table; 112 | content: ""; 113 | } 114 | 115 | .markdown-body hr:after { 116 | display: table; 117 | clear: both; 118 | content: ""; 119 | } 120 | 121 | .markdown-body h1, 122 | .markdown-body h2, 123 | .markdown-body h3, 124 | .markdown-body h4, 125 | .markdown-body h5, 126 | .markdown-body h6 { 127 | margin-top: 15px; 128 | margin-bottom: 15px; 129 | line-height: 1.1; 130 | } 131 | 132 | .markdown-body h1 { 133 | font-size: 30px; 134 | } 135 | 136 | .markdown-body h2 { 137 | font-size: 21px; 138 | } 139 | 140 | .markdown-body h3 { 141 | font-size: 16px; 142 | } 143 | 144 | .markdown-body h4 { 145 | font-size: 14px; 146 | } 147 | 148 | .markdown-body h5 { 149 | font-size: 12px; 150 | } 151 | 152 | .markdown-body h6 { 153 | font-size: 11px; 154 | } 155 | 156 | .markdown-body blockquote { 157 | margin: 0; 158 | } 159 | 160 | .markdown-body ul, 161 | .markdown-body ol { 162 | padding: 0; 163 | margin-top: 0; 164 | margin-bottom: 0; 165 | } 166 | 167 | .markdown-body ol ol, 168 | .markdown-body ul ol { 169 | list-style-type: lower-roman; 170 | } 171 | 172 | .markdown-body ul ul ol, 173 | .markdown-body ul ol ol, 174 | .markdown-body ol ul ol, 175 | .markdown-body ol ol ol { 176 | list-style-type: lower-alpha; 177 | } 178 | 179 | .markdown-body dd { 180 | margin-left: 0; 181 | } 182 | 183 | .markdown-body code { 184 | font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; 185 | font-size: 12px; 186 | } 187 | 188 | .markdown-body pre { 189 | margin-top: 0; 190 | margin-bottom: 0; 191 | font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace; 192 | } 193 | 194 | .markdown-body .select::-ms-expand { 195 | opacity: 0; 196 | } 197 | 198 | .markdown-body .octicon { 199 | font: normal normal normal 16px/1 octicons-anchor; 200 | display: inline-block; 201 | text-decoration: none; 202 | text-rendering: auto; 203 | -webkit-font-smoothing: antialiased; 204 | -moz-osx-font-smoothing: grayscale; 205 | user-select: none; 206 | } 207 | 208 | .markdown-body .octicon-link:before { 209 | content: '\f05c'; 210 | } 211 | 212 | .markdown-body>*:first-child { 213 | margin-top: 0 !important; 214 | } 215 | 216 | 217 | .markdown-body a:not([href]) { 218 | color: inherit; 219 | text-decoration: none; 220 | } 221 | 222 | .markdown-body .anchor { 223 | display: inline-block; 224 | padding-right: 2px; 225 | margin-left: -18px; 226 | } 227 | 228 | .markdown-body .anchor:focus { 229 | outline: none; 230 | } 231 | 232 | .markdown-body h1, 233 | .markdown-body h2, 234 | .markdown-body h3, 235 | .markdown-body h4, 236 | .markdown-body h5, 237 | .markdown-body h6 { 238 | margin-top: 1em; 239 | margin-bottom: 16px; 240 | font-weight: bold; 241 | line-height: 1.4; 242 | } 243 | 244 | .markdown-body h1 .octicon-link, 245 | .markdown-body h2 .octicon-link, 246 | .markdown-body h3 .octicon-link, 247 | .markdown-body h4 .octicon-link, 248 | .markdown-body h5 .octicon-link, 249 | .markdown-body h6 .octicon-link { 250 | color: #000; 251 | vertical-align: middle; 252 | visibility: hidden; 253 | } 254 | 255 | .markdown-body h1:hover .anchor, 256 | .markdown-body h2:hover .anchor, 257 | .markdown-body h3:hover .anchor, 258 | .markdown-body h4:hover .anchor, 259 | .markdown-body h5:hover .anchor, 260 | .markdown-body h6:hover .anchor { 261 | text-decoration: none; 262 | } 263 | 264 | .markdown-body h1:hover .anchor .octicon-link, 265 | .markdown-body h2:hover .anchor .octicon-link, 266 | .markdown-body h3:hover .anchor .octicon-link, 267 | .markdown-body h4:hover .anchor .octicon-link, 268 | .markdown-body h5:hover .anchor .octicon-link, 269 | .markdown-body h6:hover .anchor .octicon-link { 270 | visibility: visible; 271 | } 272 | 273 | .markdown-body h1 { 274 | padding-bottom: 0.3em; 275 | font-size: 2.25em; 276 | line-height: 1.2; 277 | border-bottom: 1px solid #eee; 278 | } 279 | 280 | .markdown-body h1 .anchor { 281 | line-height: 1; 282 | } 283 | 284 | .markdown-body h2 { 285 | padding-bottom: 0.3em; 286 | font-size: 1.75em; 287 | line-height: 1.225; 288 | border-bottom: 1px solid #eee; 289 | } 290 | 291 | .markdown-body h2 .anchor { 292 | line-height: 1; 293 | } 294 | 295 | .markdown-body h3 { 296 | font-size: 1.5em; 297 | line-height: 1.43; 298 | } 299 | 300 | .markdown-body h3 .anchor { 301 | line-height: 1.2; 302 | } 303 | 304 | .markdown-body h4 { 305 | font-size: 1.25em; 306 | } 307 | 308 | .markdown-body h4 .anchor { 309 | line-height: 1.2; 310 | } 311 | 312 | .markdown-body h5 { 313 | font-size: 1em; 314 | } 315 | 316 | .markdown-body h5 .anchor { 317 | line-height: 1.1; 318 | } 319 | 320 | .markdown-body h6 { 321 | font-size: 1em; 322 | color: #777; 323 | } 324 | 325 | .markdown-body h6 .anchor { 326 | line-height: 1.1; 327 | } 328 | 329 | .markdown-body p, 330 | .markdown-body blockquote, 331 | .markdown-body ul, 332 | .markdown-body ol, 333 | .markdown-body dl, 334 | .markdown-body table, 335 | .markdown-body pre { 336 | margin-top: 0; 337 | margin-bottom: 16px; 338 | } 339 | 340 | .markdown-body hr { 341 | height: 4px; 342 | padding: 0; 343 | margin: 16px 0; 344 | background-color: #e7e7e7; 345 | border: 0 none; 346 | } 347 | 348 | .markdown-body ul, 349 | .markdown-body ol { 350 | padding-left: 2em; 351 | } 352 | 353 | .markdown-body ul ul, 354 | .markdown-body ul ol, 355 | .markdown-body ol ol, 356 | .markdown-body ol ul { 357 | margin-top: 0; 358 | margin-bottom: 0; 359 | } 360 | 361 | .markdown-body li>p { 362 | margin-top: 16px; 363 | } 364 | 365 | .markdown-body dl { 366 | padding: 0; 367 | } 368 | 369 | .markdown-body dl dt { 370 | padding: 0; 371 | margin-top: 16px; 372 | font-size: 1em; 373 | font-style: italic; 374 | font-weight: bold; 375 | } 376 | 377 | .markdown-body dl dd { 378 | padding: 0 16px; 379 | margin-bottom: 16px; 380 | } 381 | 382 | .markdown-body blockquote { 383 | padding: 0 15px; 384 | color: #777; 385 | border-left: 4px solid #ddd; 386 | } 387 | 388 | .markdown-body blockquote>:first-child { 389 | margin-top: 0; 390 | } 391 | 392 | .markdown-body blockquote>:last-child { 393 | margin-bottom: 0; 394 | } 395 | 396 | .markdown-body table { 397 | display: block; 398 | width: 100%; 399 | overflow: auto; 400 | word-break: normal; 401 | word-break: keep-all; 402 | } 403 | 404 | .markdown-body table th { 405 | font-weight: bold; 406 | } 407 | 408 | .markdown-body table th, 409 | .markdown-body table td { 410 | padding: 6px 13px; 411 | border: 1px solid #ddd; 412 | } 413 | 414 | .markdown-body table tr { 415 | background-color: #fff; 416 | border-top: 1px solid #ccc; 417 | } 418 | 419 | .markdown-body table tr:nth-child(2n) { 420 | background-color: #f8f8f8; 421 | } 422 | 423 | .markdown-body img { 424 | max-width: 100%; 425 | box-sizing: content-box; 426 | background-color: #fff; 427 | } 428 | 429 | .markdown-body code { 430 | padding: 0; 431 | padding-top: 0.2em; 432 | padding-bottom: 0.2em; 433 | margin: 0; 434 | font-size: 85%; 435 | background-color: rgba(0,0,0,0.04); 436 | border-radius: 3px; 437 | } 438 | 439 | .markdown-body code:before, 440 | .markdown-body code:after { 441 | letter-spacing: -0.2em; 442 | content: "\00a0"; 443 | } 444 | 445 | .markdown-body pre>code { 446 | padding: 0; 447 | margin: 0; 448 | font-size: 100%; 449 | word-break: normal; 450 | white-space: pre; 451 | background: transparent; 452 | border: 0; 453 | } 454 | 455 | .markdown-body .highlight { 456 | margin-bottom: 16px; 457 | } 458 | 459 | .markdown-body .highlight pre, 460 | .markdown-body pre { 461 | padding: 16px; 462 | overflow: auto; 463 | font-size: 85%; 464 | line-height: 1.45; 465 | background-color: #f7f7f7; 466 | border-radius: 3px; 467 | } 468 | 469 | .markdown-body .highlight pre { 470 | margin-bottom: 0; 471 | word-break: normal; 472 | } 473 | 474 | .markdown-body pre { 475 | word-wrap: normal; 476 | } 477 | 478 | .markdown-body pre code { 479 | display: inline; 480 | max-width: initial; 481 | padding: 0; 482 | margin: 0; 483 | overflow: initial; 484 | line-height: inherit; 485 | word-wrap: normal; 486 | background-color: transparent; 487 | border: 0; 488 | } 489 | 490 | .markdown-body pre code:before, 491 | .markdown-body pre code:after { 492 | content: normal; 493 | } 494 | 495 | .markdown-body kbd { 496 | display: inline-block; 497 | padding: 3px 5px; 498 | font-size: 11px; 499 | line-height: 10px; 500 | color: #555; 501 | vertical-align: middle; 502 | background-color: #fcfcfc; 503 | border: solid 1px #ccc; 504 | border-bottom-color: #bbb; 505 | border-radius: 3px; 506 | box-shadow: inset 0 -1px 0 #bbb; 507 | } 508 | 509 | .markdown-body .pl-c { 510 | color: #969896; 511 | } 512 | 513 | .markdown-body .pl-c1, 514 | .markdown-body .pl-s .pl-v { 515 | color: #0086b3; 516 | } 517 | 518 | .markdown-body .pl-e, 519 | .markdown-body .pl-en { 520 | color: #795da3; 521 | } 522 | 523 | .markdown-body .pl-s .pl-s1, 524 | .markdown-body .pl-smi { 525 | color: #333; 526 | } 527 | 528 | .markdown-body .pl-ent { 529 | color: #63a35c; 530 | } 531 | 532 | .markdown-body .pl-k { 533 | color: #a71d5d; 534 | } 535 | 536 | .markdown-body .pl-pds, 537 | .markdown-body .pl-s, 538 | .markdown-body .pl-s .pl-pse .pl-s1, 539 | .markdown-body .pl-sr, 540 | .markdown-body .pl-sr .pl-cce, 541 | .markdown-body .pl-sr .pl-sra, 542 | .markdown-body .pl-sr .pl-sre { 543 | color: #183691; 544 | } 545 | 546 | .markdown-body .pl-v { 547 | color: #ed6a43; 548 | } 549 | 550 | .markdown-body .pl-id { 551 | color: #b52a1d; 552 | } 553 | 554 | .markdown-body .pl-ii { 555 | background-color: #b52a1d; 556 | color: #f8f8f8; 557 | } 558 | 559 | .markdown-body .pl-sr .pl-cce { 560 | color: #63a35c; 561 | font-weight: bold; 562 | } 563 | 564 | .markdown-body .pl-ml { 565 | color: #693a17; 566 | } 567 | 568 | .markdown-body .pl-mh, 569 | .markdown-body .pl-mh .pl-en, 570 | .markdown-body .pl-ms { 571 | color: #1d3e81; 572 | font-weight: bold; 573 | } 574 | 575 | .markdown-body .pl-mq { 576 | color: #008080; 577 | } 578 | 579 | .markdown-body .pl-mi { 580 | color: #333; 581 | font-style: italic; 582 | } 583 | 584 | .markdown-body .pl-mb { 585 | color: #333; 586 | font-weight: bold; 587 | } 588 | 589 | .markdown-body .pl-md { 590 | background-color: #ffecec; 591 | color: #bd2c00; 592 | } 593 | 594 | .markdown-body .pl-mi1 { 595 | background-color: #eaffea; 596 | color: #55a532; 597 | } 598 | 599 | .markdown-body .pl-mdr { 600 | color: #795da3; 601 | font-weight: bold; 602 | } 603 | 604 | .markdown-body .pl-mo { 605 | color: #1d3e81; 606 | } 607 | 608 | .markdown-body kbd { 609 | display: inline-block; 610 | padding: 3px 5px; 611 | font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace; 612 | line-height: 10px; 613 | color: #555; 614 | vertical-align: middle; 615 | background-color: #fcfcfc; 616 | border: solid 1px #ccc; 617 | border-bottom-color: #bbb; 618 | border-radius: 3px; 619 | box-shadow: inset 0 -1px 0 #bbb; 620 | } 621 | 622 | .markdown-body:before { 623 | display: table; 624 | content: ""; 625 | } 626 | 627 | .markdown-body:after { 628 | display: table; 629 | clear: both; 630 | content: ""; 631 | } 632 | 633 | .markdown-body .task-list-item { 634 | list-style-type: none; 635 | } 636 | 637 | .markdown-body .task-list-item+.task-list-item { 638 | margin-top: 3px; 639 | } 640 | 641 | .markdown-body .task-list-item input { 642 | margin: 0 0.35em 0.25em -1.6em; 643 | vertical-align: middle; 644 | } 645 | 646 | .markdown-body :checked+.radio-label { 647 | z-index: 1; 648 | position: relative; 649 | border-color: #4078c0; 650 | } 651 | -------------------------------------------------------------------------------- /src/static/css/global.css: -------------------------------------------------------------------------------- 1 | body{ 2 | margin:0; 3 | padding:0; 4 | } 5 | a{ 6 | text-decoration: none; 7 | } 8 | 9 | p{ 10 | margin: 0 11 | } 12 | 13 | img{ 14 | width: 100%; 15 | height: height; 16 | } 17 | div{ 18 | margin: 0; 19 | padding: 0; 20 | } 21 | .main{ 22 | padding: 70px 10px 10px 10px; 23 | 24 | } 25 | 26 | .counterclockwise45 { 27 | -moz-transform: rotate(-45deg); 28 | -o-transform: rotate(-45deg); 29 | -webkit-transform: rotate(-45deg); 30 | transform: rotate(-45deg); 31 | } 32 | 33 | .counterclockwise90 { 34 | -moz-transform: rotate(-90deg); 35 | -o-transform: rotate(-90deg); 36 | -webkit-transform: rotate(-90deg); 37 | transform: rotate(-90deg); 38 | } -------------------------------------------------------------------------------- /src/store/actions/index.js: -------------------------------------------------------------------------------- 1 | export function saveUser(user){ 2 | return { 3 | type: 'saveUser', 4 | user 5 | } 6 | } 7 | 8 | export function clearUser(){ 9 | return { 10 | type: 'clearUser' 11 | } 12 | } 13 | 14 | 15 | 16 | export const TODO_STATUS = 'TODO_STATUS' 17 | export const DOING_STATUS = 'DOING_STATUS' 18 | export const DONE_STATUS = 'DONE_STATUS' 19 | 20 | export function todoStatus(status){ 21 | return { 22 | type: TODO_STATUS, 23 | status 24 | } 25 | } 26 | 27 | export function doingStatus(status){ 28 | return { 29 | type: DOING_STATUS, 30 | status 31 | } 32 | } 33 | 34 | export function doneStatus(status){ 35 | return { 36 | type: DONE_STATUS, 37 | status 38 | } 39 | } 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/store/configureStore.js: -------------------------------------------------------------------------------- 1 | import {compose,createStore ,applyMiddleware} from 'redux' 2 | import reducers from './reducers/index' 3 | import thunkMiddleware from 'redux-thunk' 4 | //import {createLogger} from 'redux-logger' 5 | import {persistStore, autoRehydrate} from 'redux-persist' 6 | 7 | 8 | 9 | 10 | 11 | export default function configureStore() { 12 | //const loggerMiddleware = createLogger() 13 | 14 | const store = createStore( 15 | reducers, 16 | undefined, 17 | compose( 18 | applyMiddleware( 19 | thunkMiddleware, 20 | //loggerMiddleware 21 | ), 22 | autoRehydrate() 23 | ) 24 | 25 | ) 26 | 27 | persistStore(store) 28 | 29 | 30 | 31 | if (module.hot) { 32 | module.hot.accept(() => { 33 | const nextRootReducer = require('./reducers/index').default; 34 | store.replaceReducer(nextRootReducer); 35 | }); 36 | } 37 | 38 | return store; 39 | 40 | }; -------------------------------------------------------------------------------- /src/store/reducers/index.js: -------------------------------------------------------------------------------- 1 | import {combineReducers } from 'redux' 2 | import user from './user' 3 | import status from './status' 4 | 5 | 6 | 7 | const reducers = combineReducers({ 8 | user, 9 | status 10 | }) 11 | 12 | 13 | export default reducers -------------------------------------------------------------------------------- /src/store/reducers/status.js: -------------------------------------------------------------------------------- 1 | 2 | import { TODO_STATUS,DOING_STATUS,DONE_STATUS } from '../actions' 3 | 4 | let statusId = 0; 5 | const status = (state = {}, action) => { 6 | switch (action.type) { 7 | case TODO_STATUS: 8 | return Object.assign({},{TODO_STATUS},action.status) 9 | case DOING_STATUS: 10 | return Object.assign({},{DOING_STATUS},action.status) 11 | case DONE_STATUS: 12 | return Object.assign({},{DONE_STATUS},action.status) 13 | default: 14 | return state 15 | } 16 | } 17 | 18 | export default status -------------------------------------------------------------------------------- /src/store/reducers/user.js: -------------------------------------------------------------------------------- 1 | const user = (state = {}, action) => { 2 | switch (action.type) { 3 | case 'saveUser': 4 | return action.user 5 | case 'clearUser': 6 | return {} 7 | default: 8 | return state 9 | } 10 | } 11 | 12 | export default user -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack') 2 | const path = require('path') 3 | 4 | module.exports = { 5 | devtool: 'source-map', 6 | entry: { 7 | 'app': [ 8 | 'react-hot-loader/patch', 9 | './src/index' 10 | ] 11 | }, 12 | output: { 13 | path: path.resolve(__dirname, './dist'), 14 | filename: 'bundle.js' 15 | }, 16 | module: { 17 | rules: [ 18 | { test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader' }, 19 | { test: /\.css$/, use: [ 20 | { loader: "style-loader" }, 21 | { loader: "css-loader" } 22 | ] 23 | }, 24 | { 25 | test: /\.(woff2?|eot|ttf|otf|svg)(\?.*)?$/, 26 | loader: 'url-loader' 27 | } 28 | ] 29 | } 30 | } -------------------------------------------------------------------------------- /webpack.prod.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack') 2 | const path = require('path') 3 | const WebpackBundleSizeAnalyzerPlugin = require('webpack-bundle-size-analyzer').WebpackBundleSizeAnalyzerPlugin 4 | module.exports = { 5 | devtool: 'source-map', 6 | entry: { 7 | 'app':'./src/index' 8 | }, 9 | output: { 10 | path: path.resolve(__dirname, './dist'), 11 | filename: '[name].js' 12 | }, 13 | module: { 14 | rules: [ 15 | { test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader' }, 16 | { test: /\.css$/, use: [ 17 | { loader: "style-loader" }, 18 | { loader: "css-loader" } 19 | ] 20 | }, 21 | { 22 | test: /\.(woff2?|eot|ttf|otf|svg)(\?.*)?$/, 23 | loader: 'url-loader' 24 | } 25 | ] 26 | }, 27 | plugins: [ 28 | 29 | 30 | new webpack.LoaderOptionsPlugin({ 31 | minimize: true, 32 | debug: false 33 | }), 34 | new webpack.DefinePlugin({ 35 | 'process.env': { 36 | 'NODE_ENV': JSON.stringify('production') 37 | } 38 | }), 39 | new webpack.optimize.UglifyJsPlugin({ 40 | output: { 41 | comments: false, // remove all comments 42 | }, 43 | compress: { 44 | warnings: false 45 | } 46 | }), 47 | 48 | new WebpackBundleSizeAnalyzerPlugin('./plain-report.txt') 49 | 50 | 51 | 52 | ], 53 | } --------------------------------------------------------------------------------