Basic skeleton, and dependencies
This commit is contained in:
parent
66e4ae2bdd
commit
f4d3aa5023
4
.gitignore
vendored
4
.gitignore
vendored
@ -92,3 +92,7 @@ jspm_packages
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# bundled javascript
|
||||
/build/*.js
|
||||
/build/*.js.map
|
||||
|
11
index.html
Normal file
11
index.html
Normal file
@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Arbor</title>
|
||||
<!-- Add css here later -->
|
||||
</head>
|
||||
<body>
|
||||
<main id="app"></main>
|
||||
<script src="build/bundle.js"></script>
|
||||
</body>
|
||||
</html>
|
46
package.json
Normal file
46
package.json
Normal file
@ -0,0 +1,46 @@
|
||||
{
|
||||
"name": "arbor-frontend",
|
||||
"version": "1.0.0",
|
||||
"description": "This is the frontend part of the Arbor application",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start:dev": "webpack-dev-server",
|
||||
"build": "webpack -p --define process.env.NODE_ENV='\"production\"' --progress --colors",
|
||||
"build:watch": "webpack -w -d",
|
||||
"test": "mocha --compilers js:babel-core/register --require ./test/test_helper.js test/**/*.js",
|
||||
"test:watch": "npm run test -- --watch"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@git.timshomepage.net:timw4mail/arbor-frontend.git"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"immutable": "^3.8.1",
|
||||
"react": "^15.1.0",
|
||||
"react-dom": "^15.1.0",
|
||||
"react-redux": "^4.4.5",
|
||||
"react-router": "^2.4.1",
|
||||
"redux": "^3.5.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"babel": "^6.5.2",
|
||||
"babel-loader": "^6.2.4",
|
||||
"babel-preset-es2015": "^6.9.0",
|
||||
"babel-preset-react": "^6.5.0",
|
||||
"chai": "^3.5.0",
|
||||
"mocha": "^2.5.3",
|
||||
"postcss": "^5.0.21",
|
||||
"postcss-cssnext": "^2.6.0",
|
||||
"webpack": "^1.13.1",
|
||||
"webpack-dev-server": "^1.14.1"
|
||||
},
|
||||
"babel": {
|
||||
"presets": [
|
||||
"es2015",
|
||||
"react"
|
||||
]
|
||||
}
|
||||
}
|
7
src/action_creators.js
Normal file
7
src/action_creators.js
Normal file
@ -0,0 +1,7 @@
|
||||
export function setState(state) {
|
||||
|
||||
}
|
||||
|
||||
export function update(item) {
|
||||
|
||||
}
|
19
src/app.js
Normal file
19
src/app.js
Normal file
@ -0,0 +1,19 @@
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
import {Router, Route, hashHistory} from 'react-router';
|
||||
import {createStore} from 'redux';
|
||||
import {Provider} from 'react-redux';
|
||||
|
||||
import reducer from './reducer';
|
||||
import App from './components/App';
|
||||
|
||||
const store = createStore(reducer);
|
||||
|
||||
const routes = <Route component={App} />;
|
||||
|
||||
ReactDOM.render(
|
||||
<Provider store={store}>
|
||||
<Router history={hashHistory}>{routes}</Router>
|
||||
</Provider>,
|
||||
document.getElementById('app')
|
||||
);
|
9
src/components/App.js
Normal file
9
src/components/App.js
Normal file
@ -0,0 +1,9 @@
|
||||
import React from 'react';
|
||||
|
||||
class App extends React.Component {
|
||||
render() {
|
||||
return this.props.children
|
||||
}
|
||||
}
|
||||
|
||||
export default App;
|
6
src/constants.js
Normal file
6
src/constants.js
Normal file
@ -0,0 +1,6 @@
|
||||
/**
|
||||
* 'Global' constants
|
||||
*/
|
||||
export const SET_STATE = 'SET_STATE';
|
||||
export const UPDATE = 'UPDATE';
|
||||
export const DELETE = 'DELETE';
|
22
src/reducer.js
Normal file
22
src/reducer.js
Normal file
@ -0,0 +1,22 @@
|
||||
import {Map} from 'immutable';
|
||||
import * as CONST from './constants';
|
||||
|
||||
const actionMap = {
|
||||
[CONST.SET_STATE]: (state) => {
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Reducer function mapping action objects to state transition functions
|
||||
*
|
||||
* @param {Map} state
|
||||
* @param {Object} action
|
||||
* @return {Map}
|
||||
*/
|
||||
export default function reducer(state=Map(), action) {
|
||||
// Return default state if action is undefined
|
||||
if ( ! Object.keys(actionMap).includes(action)) {
|
||||
return state;
|
||||
}
|
||||
}
|
21
test/test_helper.js
Normal file
21
test/test_helper.js
Normal file
@ -0,0 +1,21 @@
|
||||
/**
|
||||
* Fakes a browser environment for testing react
|
||||
*/
|
||||
import jsdom from 'jsdom';
|
||||
import chai from 'chai';
|
||||
import chaiImmutable from 'chai-immutable';
|
||||
|
||||
const doc = jsdom.jsdom('<!DOCTYPE html><html><body></body></html>');
|
||||
const win = doc.defaultView;
|
||||
|
||||
global.document = doc;
|
||||
global.window = win;
|
||||
|
||||
// Hoist window properties to global
|
||||
Object.keys(window).forEach(key => {
|
||||
if ( ! (key in global)) {
|
||||
global[key] = window[key];
|
||||
}
|
||||
});
|
||||
|
||||
chai.use(chaiImmutable);
|
39
webpack.config.js
Normal file
39
webpack.config.js
Normal file
@ -0,0 +1,39 @@
|
||||
const webpack = require('webpack');
|
||||
|
||||
module.exports = {
|
||||
cache: true,
|
||||
debug: true,
|
||||
devServer: {
|
||||
contentBase: './build',
|
||||
hot: true
|
||||
},
|
||||
devtool: 'sourcemaps',
|
||||
entry: [
|
||||
'webpack/hot/only-dev-server',
|
||||
'./src/app.js',
|
||||
],
|
||||
module: {
|
||||
loaders: [{
|
||||
test: /\.js$/,
|
||||
exclude: /(node_modules)/,
|
||||
loader: 'react-hot!babel-loader'
|
||||
}, {
|
||||
test: /\.css$/,
|
||||
loader: 'style-loader!css-loader!postcss-loader'
|
||||
}]
|
||||
},
|
||||
output: {
|
||||
path: `${__dirname}/build`,
|
||||
publicPath: '/',
|
||||
filename: 'bundle.js'
|
||||
},
|
||||
plugins: [
|
||||
new webpack.HotModuleReplacementPlugin()
|
||||
],
|
||||
postcss: () => {
|
||||
|
||||
},
|
||||
resolve: {
|
||||
extensions: ['', '.js']
|
||||
}
|
||||
};
|
Reference in New Issue
Block a user