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
|
# Optional REPL history
|
||||||
.node_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