Skip to content

Commit 4702c81

Browse files
committed
Shameful, large commit
[ADD] Basic testing framework [ADD] CSS Modules [CHG] Organization [CHG] Update all dependencies to latest
1 parent 63ca4c2 commit 4702c81

20 files changed

Lines changed: 169 additions & 59 deletions

.babelrc

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,20 @@
11
{
2-
"stage": 0
2+
"presets": [
3+
"es2015",
4+
"react",
5+
"stage-1"
6+
],
7+
"env": {
8+
"test": {
9+
"plugins": [
10+
[
11+
"babel-plugin-webpack-loaders",
12+
{
13+
"config": "./webpack/runtime.webpack.config.js",
14+
"verbose": false
15+
}
16+
]
17+
]
18+
}
19+
}
320
}

.eslintrc

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
{
22
"extends": "airbnb",
3+
"parser": "babel-eslint",
34
"rules": {
45
"comma-dangle": 0,
5-
'no-unused-vars': [2, { // http://eslint.org/docs/rules/no-unused-vars
6-
'vars': 'local',
7-
'args': 'after-used',
8-
'argsIgnorePattern': '^_'
9-
}]
6+
"no-unused-vars": [2, { // http://eslint.org/docs/rules/no-unused-vars
7+
"vars": "local",
8+
"args": "after-used",
9+
"argsIgnorePattern": "^_"
10+
}],
11+
"react/prefer-stateless-function": 0 // this is annoying in a boilerplate
1012
}
1113
}

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ Frontend scaffold: Webpack, Babel, Sass, React, Redux, ESLint
1111
* `npm install -g webpack-dev-server`
1212
* `npm start`
1313

14+
## Test
15+
* `npm test`
16+
1417
## Build
1518
* Set `['output']['publicPath']` to your deployment URL in `webpack-production.config.js`
1619
* npm run build

package.json

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
"main": "index.js",
66
"scripts": {
77
"start": "node server.js",
8-
"build": "webpack -p --config webpack-production.config.js",
9-
"test": "echo \"Error: no test specified\" && exit 1"
8+
"build": "webpack -p --config webpack/webpack-production.config.js",
9+
"test": "NODE_ENV=test BABEL_DISABLE_CACHE=1 babel-tape-runner tests/**/*.js | faucet"
1010
},
1111
"keywords": [
1212
"scaffold",
@@ -25,31 +25,43 @@
2525
"license": "ISC",
2626
"dependencies": {
2727
"jsonp": "^0.2.0",
28-
"lodash": "^3.10.1",
29-
"node-libs-browser": "^0.5.2",
28+
"lodash": "^4.6.1",
29+
"node-libs-browser": "^1.0.0",
3030
"react": "^0.14.0",
3131
"react-dom": "^0.14.0",
3232
"react-redux": "^4.0.0",
3333
"redux": "^3.0.2",
3434
"webpack": "^1.10.1"
3535
},
3636
"devDependencies": {
37-
"autoprefixer-loader": "^2.0.0",
38-
"babel-core": "^5.6.20",
39-
"babel-eslint": "^4.1.1",
40-
"babel-loader": "^5.3.1",
41-
"css-loader": "^0.17.0",
42-
"eslint": "^1.3.1",
43-
"eslint-config-airbnb": "0.0.8",
37+
"autoprefixer-loader": "^3.2.0",
38+
"babel-core": "^6.7.2",
39+
"babel-eslint": "^5.0.0",
40+
"babel-loader": "^6.2.4",
41+
"babel-plugin-webpack-loaders": "^0.3.10",
42+
"babel-preset-es2015": "^6.6.0",
43+
"babel-preset-react": "^6.5.0",
44+
"babel-preset-stage-1": "^6.5.0",
45+
"babel-tape-runner": "^2.0.1",
46+
"css-loader": "^0.23.1",
47+
"eslint": "^2.4.0",
48+
"eslint-config-airbnb": "6.1.0",
4449
"eslint-loader": "^1.0.0",
45-
"eslint-plugin-react": "^3.3.1",
46-
"extract-text-webpack-plugin": "^0.8.2",
50+
"eslint-plugin-react": "^4.2.3",
51+
"estraverse-fb": "^1.3.1",
52+
"extend-tape": "^1.2.0",
53+
"extract-text-webpack-plugin": "^1.0.1",
54+
"faucet": "0.0.1",
4755
"file-loader": "^0.8.4",
4856
"node-sass": "^3.2.0",
57+
"react-addons-test-utils": "^0.14.7",
4958
"react-hot-loader": "^1.2.8",
50-
"sass-loader": "^2.0.1",
59+
"react-unit": "^1.2.1",
60+
"sass-loader": "^3.2.0",
5161
"scss-lint-loader": "^1.0.1",
52-
"style-loader": "^0.12.3",
62+
"style-loader": "^0.13.0",
63+
"tape": "^4.5.1",
64+
"tape-jsx-equals": "^1.0.0",
5365
"url-loader": "^0.5.6",
5466
"webpack-dev-server": "^1.10.1",
5567
"webpack-notifier": "^1.2.1"

server.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const webpack = require('webpack');
22
const WebpackDevServer = require('webpack-dev-server');
3-
const config = require('./webpack.config');
3+
const config = require('./webpack/webpack.config');
44

55
new WebpackDevServer(webpack(config), {
66
publicPath: config.output.publicPath,

source/components/name/Name.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import React, { Component, PropTypes } from 'react';
2+
3+
class Name extends Component {
4+
static propTypes = {
5+
name: PropTypes.string.isRequired,
6+
actions: PropTypes.object.isRequired
7+
}
8+
constructor(props, context) {
9+
super(props, context);
10+
this.displayName = 'Name';
11+
}
12+
removeName = () => {
13+
this.props.actions.deleteName(this.props.name);
14+
}
15+
render() {
16+
const { name } = this.props;
17+
return (
18+
<p>{name} <a onClick={this.removeName}>(remove)</a></p>
19+
);
20+
}
21+
}
22+
23+
export default Name;
Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import React, { Component, PropTypes } from 'react';
2+
import Name from '../name/Name';
3+
4+
import styles from './NameList.scss';
25

36
class NameList extends Component {
47
static propTypes = {
@@ -9,22 +12,17 @@ class NameList extends Component {
912
super(props, context);
1013
this.displayName = 'NameList';
1114
}
12-
removeName(name) {
13-
this.props.actions.deleteName(name);
14-
}
15-
addName() {
15+
addName = () => {
1616
const random = Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
1717
this.props.actions.addName(random);
1818
}
1919
render() {
20-
const { names } = this.props;
20+
const { names, actions } = this.props;
2121
return (
2222
<div>
23-
<h3>Names!</h3>
24-
{names.map(name =>
25-
<p key={name}>{name} <a onClick={this.removeName.bind(this, name)}>(remove)</a></p>
26-
)}
27-
<a onClick={this.addName.bind(this)}>Add Name</a>
23+
<h3 className={styles.header}>Names!</h3>
24+
{names.map(name => <Name key={name} name={name} actions={actions} />)}
25+
<a onClick={this.addName}>Add Name</a>
2826
</div>
2927
);
3028
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.header {
2+
color: red;
3+
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import React, { Component, PropTypes } from 'react';
22
import { bindActionCreators } from 'redux';
33
import { connect } from 'react-redux';
4-
import NameList from '../components/nameList';
5-
import * as NameActions from '../data/names';
4+
import NameList from '../../components/nameList/NameList';
5+
import * as NameActions from '../../data/names';
6+
7+
import './App.scss';
68

79
class App extends Component {
810
static propTypes = {

0 commit comments

Comments
 (0)