├── .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 |
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 |
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 |
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 |
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 | }
--------------------------------------------------------------------------------