├── src ├── app │ ├── views │ │ ├── home │ │ │ ├── home.scss │ │ │ ├── index.js │ │ │ └── Home.js │ │ ├── about │ │ │ ├── about.scss │ │ │ ├── index.js │ │ │ └── About.js │ │ ├── login │ │ │ ├── login.scss │ │ │ └── index.js │ │ ├── protected │ │ │ ├── protected.scss │ │ │ ├── index.js │ │ │ └── Protected.js │ │ ├── pageNotFound │ │ │ ├── pageNotFound.scss │ │ │ ├── index.js │ │ │ └── PageNotFound.js │ │ └── index.js │ ├── containers │ │ ├── index.js │ │ └── app │ │ │ ├── index.js │ │ │ └── App.js │ ├── mock │ │ ├── fakeAPI.json │ │ └── userInfosMock.json │ ├── style │ │ ├── _vars.scss │ │ ├── index.scss │ │ ├── common.scss │ │ └── _mixins.scss │ ├── config │ │ ├── index.js │ │ └── navigation.json │ ├── services │ │ ├── index.js │ │ ├── auth │ │ │ └── type.js │ │ ├── universal.js │ │ ├── utils │ │ │ └── getLocationOrigin.js │ │ └── API │ │ │ ├── example.js │ │ │ └── fetchTools.js │ ├── redux │ │ ├── store │ │ │ ├── configureStore.js │ │ │ ├── configureStore.prod.js │ │ │ └── configureStore.dev.js │ │ ├── modules │ │ │ ├── reducers.js │ │ │ ├── immutableRoute.js │ │ │ └── fakeModuleWithFetch.js │ │ └── middleware │ │ │ └── fetchMiddleware.js │ ├── components │ │ ├── index.js │ │ ├── jumbotron │ │ │ └── Jumbotron.js │ │ ├── navigation │ │ │ ├── humburger │ │ │ │ └── Humburger.js │ │ │ ├── leftNav │ │ │ │ ├── leftNavButton │ │ │ │ │ └── LeftNavButton.js │ │ │ │ └── LeftNav.js │ │ │ ├── rightNav │ │ │ │ ├── rightNavButton │ │ │ │ │ └── RightNavButton.js │ │ │ │ └── RightNav.js │ │ │ └── NavigationBar.js │ │ ├── backToTop │ │ │ ├── backToTopButton │ │ │ │ ├── UpIcon.js │ │ │ │ └── BackToTopButton.js │ │ │ ├── lib │ │ │ │ └── smoothScroll.js │ │ │ └── BackToTop.js │ │ ├── animatedView │ │ │ └── AnimatedView.js │ │ ├── logoutRoute │ │ │ └── LogoutRoute.js │ │ ├── routes │ │ │ ├── logoutRoute │ │ │ │ └── LogoutRoute.js │ │ │ └── privateRoute │ │ │ │ └── PrivateRoute.js │ │ ├── scrollToTop │ │ │ └── ScrollToTop.js │ │ └── privateRoute │ │ │ └── PrivateRoute.js │ ├── routes │ │ └── MainRoutes.js │ ├── index.js │ └── Root.js └── server │ └── SPA │ └── index.js ├── preview └── preview.png ├── test ├── redux │ ├── README.md │ ├── actions │ │ └── views.spec.js │ └── reducers │ │ └── views.spec.js ├── .setup.js ├── views │ ├── pageNotFound │ │ └── PageNotFound.spec.js │ ├── home │ │ └── Home.spec.js │ └── about │ │ └── About.spec.js ├── components │ ├── jumbotron │ │ └── Jumbotron.spec.js │ ├── NavigationBar │ │ ├── humburger │ │ │ └── Humburger.spec.js │ │ ├── leftNav │ │ │ └── leftNavButton │ │ │ │ └── LeftNavButton.spec.js │ │ ├── rightNav │ │ │ └── rightNavButton │ │ │ │ └── RightNavButton.spec.js │ │ └── NavigationBar.spec.js │ └── backToTop │ │ ├── backToTopButton │ │ ├── UpIcon.spec.js │ │ └── BackToTopButton.spec.js │ │ └── BackToTop.spec.js └── containers │ ├── app │ └── App.spec.js │ ├── about │ └── About.spec.js │ └── home │ └── Home.spec.js ├── .gitignore ├── docs ├── public │ └── assets │ │ ├── fontawesome-webfont.eot │ │ └── fontawesome-webfont.ttf └── index.html ├── jsconfig.json ├── .flowconfig ├── postcss.config.js ├── flow-typed ├── npm │ ├── flow-bin_v0.x.x.js │ ├── classnames_v2.x.x.js │ ├── font-awesome_vx.x.x.js │ ├── pretty-error_v2.x.x.js │ ├── react-modal_v1.x.x.js │ ├── helmet_vx.x.x.js │ ├── animate.css_vx.x.x.js │ ├── redux-mock-store_v1.2.x.js │ ├── url-loader_vx.x.x.js │ ├── compression_vx.x.x.js │ ├── file-loader_vx.x.x.js │ ├── json-loader_vx.x.x.js │ ├── expose-loader_vx.x.x.js │ ├── postcss-focus_vx.x.x.js │ ├── babel-preset-flow_vx.x.x.js │ ├── babel-preset-react_vx.x.x.js │ ├── babel-preset-es2015_vx.x.x.js │ ├── babel-preset-stage-0_vx.x.x.js │ ├── babel-preset-stage-2_vx.x.x.js │ ├── postcss-load-config_vx.x.x.js │ ├── serialize-javascript_vx.x.x.js │ ├── webpack-node-externals_vx.x.x.js │ ├── babel-preset-react-optimize_vx.x.x.js │ ├── rimraf_vx.x.x.js │ ├── chalk_vx.x.x.js │ ├── babel-plugin-transform-regenerator_vx.x.x.js │ ├── babel-plugin-transform-async-to-generator_vx.x.x.js │ ├── babel-preset-babili_vx.x.x.js │ ├── precss_vx.x.x.js │ ├── prop-types_v15.x.x.js │ ├── babel-register_vx.x.x.js │ ├── postcss-loader_vx.x.x.js │ ├── body-parser_v1.x.x.js │ ├── postcss-reporter_vx.x.x.js │ ├── webpack-dev-middleware_vx.x.x.js │ ├── redux-thunk_vx.x.x.js │ ├── cross-env_vx.x.x.js │ ├── dirty-chai_vx.x.x.js │ ├── react-tap-event-plugin_vx.x.x.js │ ├── style-loader_vx.x.x.js │ ├── redux-logger_vx.x.x.js │ ├── redux-devtools-extension_vx.x.x.js │ ├── babel-loader_vx.x.x.js │ ├── babel-polyfill_vx.x.x.js │ ├── sass-loader_vx.x.x.js │ ├── postcss-import_vx.x.x.js │ ├── js-base64_vx.x.x.js │ ├── react-addons-test-utils_v15.x.x.js │ ├── jwt-decode_vx.x.x.js │ ├── webpack-hot-middleware_vx.x.x.js │ ├── redux-immutable_vx.x.x.js │ ├── postcss-cssnext_vx.x.x.js │ ├── extract-text-webpack-plugin_vx.x.x.js │ ├── babel-eslint_vx.x.x.js │ ├── css-loader_vx.x.x.js │ ├── react-redux_v4.x.x.js │ ├── nyc_vx.x.x.js │ └── babel-cli_vx.x.x.js └── interface │ └── global.js ├── .editorconfig ├── typings.json ├── .travis.yml ├── .babelrc ├── typings ├── globals │ ├── node │ │ └── typings.json │ ├── axios │ │ └── typings.json │ ├── redux │ │ └── typings.json │ ├── jquery │ │ └── typings.json │ ├── moment │ │ └── typings.json │ ├── classnames │ │ ├── typings.json │ │ └── index.d.ts │ ├── immutable │ │ └── typings.json │ ├── react-router │ │ ├── typings.json │ │ └── index.d.ts │ ├── redux-thunk │ │ ├── typings.json │ │ └── index.d.ts │ └── react-router-dom │ │ ├── typings.json │ │ └── index.d.ts ├── modules │ ├── react │ │ └── typings.json │ ├── react-redux │ │ └── typings.json │ ├── react-motion │ │ └── typings.json │ └── react-bootstrap │ │ └── typings.json └── index.d.ts ├── index.html ├── server.hot.reload.js ├── webpack.hot.reload.config.js ├── webpack.server.ssr.config.js └── webpack.dev.config.js /src/app/views/home/home.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/views/about/about.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/views/login/login.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/views/protected/protected.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/views/pageNotFound/pageNotFound.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/containers/index.js: -------------------------------------------------------------------------------- 1 | // @flow weak 2 | 3 | export { default as App } from './app/App'; 4 | -------------------------------------------------------------------------------- /preview/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MacKentoch/react-redux-immutable-webpack-ssr-starter/HEAD/preview/preview.png -------------------------------------------------------------------------------- /src/app/views/pageNotFound/index.js: -------------------------------------------------------------------------------- 1 | // @flow weak 2 | import PageNotFound from './PageNotFound'; 3 | 4 | export default PageNotFound; 5 | -------------------------------------------------------------------------------- /test/redux/README.md: -------------------------------------------------------------------------------- 1 | # testing redux 2 | 3 | how to test redux :[redux.js.org](http://redux.js.org/docs/recipes/WritingTests.html) 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .vscode/ 3 | .idea/ 4 | *.log 5 | 6 | build/ 7 | dist/ 8 | public/assets/ 9 | /coverage 10 | /.nyc_output 11 | -------------------------------------------------------------------------------- /src/app/mock/fakeAPI.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "label": "item 1" 5 | }, 6 | { 7 | "id": 2, 8 | "label": "item 2" 9 | } 10 | ] 11 | -------------------------------------------------------------------------------- /docs/public/assets/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MacKentoch/react-redux-immutable-webpack-ssr-starter/HEAD/docs/public/assets/fontawesome-webfont.eot -------------------------------------------------------------------------------- /docs/public/assets/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MacKentoch/react-redux-immutable-webpack-ssr-starter/HEAD/docs/public/assets/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "typeAcquisition": { 3 | "include": [ 4 | "react", 5 | "redux", 6 | "react-router", 7 | "immutable" 8 | ] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/app/style/_vars.scss: -------------------------------------------------------------------------------- 1 | $MAIN_COLOR : #000; 2 | 3 | // container definition 4 | $CONTAINER_CUSTOM_PADDING_LEFT : 2%; 5 | $CONTAINER_CUSTOM_PADDING_RIGHT : $CONTAINER_CUSTOM_PADDING_LEFT; 6 | -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | 3 | [include] 4 | 5 | [libs] 6 | ./interfaces/global.js 7 | 8 | [options] 9 | module.name_mapper='.*\(.css\)' -> 'CSSModule' 10 | module.system=haste 11 | strip_root=true 12 | -------------------------------------------------------------------------------- /src/app/config/index.js: -------------------------------------------------------------------------------- 1 | // @flow weak 2 | 3 | export const appConfig = { 4 | DEV_MODE: true, // flag to fetch mock or real fetch 5 | 6 | api: { 7 | fakeEndPoint: 'api/somewhere' 8 | } 9 | }; 10 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | // @flow weak 2 | 3 | module.exports = { 4 | plugins: { 5 | 'postcss-import': {}, 6 | 'postcss-cssnext': { 7 | browsers: ['last 2 versions', '>5%'] 8 | } 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /src/app/services/index.js: -------------------------------------------------------------------------------- 1 | // @flow weak 2 | 3 | import * as fetchTools from './API/fetchTools'; 4 | import {getSomething} from './API/example'; 5 | 6 | export { 7 | fetchTools, 8 | getSomething 9 | }; 10 | -------------------------------------------------------------------------------- /flow-typed/npm/flow-bin_v0.x.x.js: -------------------------------------------------------------------------------- 1 | // flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583 2 | // flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x 3 | 4 | declare module "flow-bin" { 5 | declare module.exports: string; 6 | } 7 | -------------------------------------------------------------------------------- /src/app/redux/store/configureStore.js: -------------------------------------------------------------------------------- 1 | /* eslint no-process-env:0 */ 2 | if (process.env.NODE_ENV === 'production') { 3 | module.exports = require('./configureStore.prod'); 4 | } else { 5 | module.exports = require('./configureStore.dev'); 6 | } 7 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | insert_final_newline = true 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /src/app/services/auth/type.js: -------------------------------------------------------------------------------- 1 | 2 | // @flow 3 | 4 | export type STORES_TYPES = 5 | | 'localStorage' 6 | | 'sessionStorage'; 7 | 8 | export type Storage = STORES_TYPES 9 | export type TokenKey = string; 10 | export type UserInfoKey = string; 11 | -------------------------------------------------------------------------------- /src/app/components/index.js: -------------------------------------------------------------------------------- 1 | // @flow weak 2 | 3 | export { default as Jumbotron } from './jumbotron/Jumbotron'; 4 | export { default as NavigationBar } from './navigation/NavigationBar'; 5 | export { default as BackToTop } from './backToTop/BackToTop'; 6 | -------------------------------------------------------------------------------- /typings.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-redux-immutable-webpack-starter", 3 | "dependencies": {}, 4 | "globalDependencies": { 5 | "node": "registry:dt/node#7.0.0+20170322231424", 6 | "react-router-dom": "registry:dt/react-router-dom#4.0.0+20170323201651" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/app/style/index.scss: -------------------------------------------------------------------------------- 1 | // common 2 | @import "./common"; 3 | // views: 4 | @import "../views/home/home"; 5 | @import "../views/about/about"; 6 | @import "../views/login/login"; 7 | @import "../views/protected/protected"; 8 | @import "../views/pageNotFound/pageNotFound" 9 | 10 | // components: 11 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | --- 2 | language: node_js 3 | node_js: 4 | - 6 5 | - 8 6 | sudo: false 7 | cache: 8 | directories: 9 | - node_modules 10 | before_install: 11 | - export DISPLAY=:99.0 12 | - sh -e /etc/init.d/xvfb start 13 | before_script: 14 | - npm install 15 | after_success: npm run coverage 16 | -------------------------------------------------------------------------------- /src/app/services/universal.js: -------------------------------------------------------------------------------- 1 | // @flow weak 2 | 3 | 4 | /** 5 | * when in a universal application, this function will help telling you if you can use window object (not server side) 6 | * 7 | * @export 8 | * @returns 9 | */ 10 | export function isBrowserSide(): boolean { 11 | return typeof window === 'object'; 12 | } 13 | -------------------------------------------------------------------------------- /src/app/views/index.js: -------------------------------------------------------------------------------- 1 | // @flow weak 2 | 3 | export { default as About } from './about/About'; 4 | export { default as Home } from './home/Home'; 5 | export { default as PageNotFound } from './pageNotFound/PageNotFound'; 6 | export { default as Login } from './login'; 7 | export { default as Protected } from './protected'; 8 | -------------------------------------------------------------------------------- /src/app/style/common.scss: -------------------------------------------------------------------------------- 1 | @import "./_vars"; 2 | @import "./_mixins"; 3 | 4 | .containersCustom { 5 | padding-left: $CONTAINER_CUSTOM_PADDING_LEFT; 6 | padding-right: $CONTAINER_CUSTOM_PADDING_RIGHT; 7 | } 8 | 9 | .invisible { 10 | opacity: 0; 11 | } 12 | 13 | .view-enter { 14 | @include fade-in(0s, 0.7s, ease-in); 15 | z-index: 9999; 16 | } 17 | -------------------------------------------------------------------------------- /flow-typed/interface/global.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-vars */ 2 | 3 | // for import 'somestyle.css': 4 | declare module CSSModule { 5 | declare var exports: { [key: string]: string }; 6 | } 7 | 8 | // for module.hot.reload: 9 | declare var module : { 10 | hot : { 11 | accept(path:string, callback:() => void): void; 12 | }; 13 | }; 14 | 15 | // for jQuery: 16 | declare var $: any; 17 | -------------------------------------------------------------------------------- /src/app/services/utils/getLocationOrigin.js: -------------------------------------------------------------------------------- 1 | // @flow weak 2 | 3 | export const getLocationOrigin: () => string = () => { 4 | if (!window.location.origin) { 5 | window.location.origin = `${window.location.protocol}//${window.location.hostname}${window.location.port ? ':' + window.location.port : ''}`; 6 | } 7 | return window.location.origin; 8 | }; 9 | 10 | export default getLocationOrigin; 11 | -------------------------------------------------------------------------------- /src/app/components/jumbotron/Jumbotron.js: -------------------------------------------------------------------------------- 1 | // @flow weak 2 | 3 | import React from 'react'; 4 | import PropTypes from 'prop-types'; 5 | 6 | const Jumbotron = ({ 7 | children 8 | }) => ( 9 |