diff --git a/app/.eslintrc b/app/.eslintrc index 9d218e5..415b23f 100644 --- a/app/.eslintrc +++ b/app/.eslintrc @@ -1,6 +1,14 @@ { - "extends": "eslint-config-airbnb", + "extends": "airbnb", + "parser": "babel-eslint", + "env": { + "meteor": true, + "browser": true, + "jasmine": true + }, "rules": { - "prefer-const": 0 + "no-console": 0, + "prefer-template": 0, + "import/no-unresolved": 0 } } diff --git a/app/components/App.jsx b/app/components/App.jsx index 9d8cc61..d44b323 100644 --- a/app/components/App.jsx +++ b/app/components/App.jsx @@ -1,11 +1,11 @@ /* global ReactMeteorData */ -import React, {Component} from 'react'; +import React, { Component } from 'react'; import reactMixin from 'react-mixin'; import BlazeTemplate from './BlazeTemplate'; -import {Users, Posts} from 'collections'; +import { Users, Posts } from 'collections'; import './App.css'; -Meteor.call('sayHello', function(err, res) { +Meteor.call('sayHello', (err, res) => { console.log(res); }); @@ -13,18 +13,19 @@ Meteor.call('sayHello', function(err, res) { export default class App extends Component { getMeteorData() { return { - users: Users.find().fetch() + usersCount: Users.find().fetch().length, + postsCount: Posts.find().fetch().length }; } render() { - let userCount = Users.find().fetch().length; - let postsCount = Posts.find().fetch().length; + const { usersCount, postsCount } = this.data; + return (
{Meteor.isClient && }

Hello Webpack!

-

There are {userCount} users in the Minimongo (login to change)

+

There are {usersCount} users in the Minimongo (login to change)

There are {postsCount} posts in the Minimongo (autopublish removed)

); diff --git a/app/components/BlazeTemplate.js b/app/components/BlazeTemplate.js index 276b39b..ebb12fe 100644 --- a/app/components/BlazeTemplate.js +++ b/app/components/BlazeTemplate.js @@ -1,8 +1,8 @@ /* global Blaze */ -import React, {component} from 'react'; +import React, { Component } from 'react'; import ReactDOM from 'react-dom'; -export default class BlazeTemplate extends React.Component { +export default class BlazeTemplate extends Component { static propTypes = { template: React.PropTypes.any.isRequired, component: React.PropTypes.any, @@ -10,19 +10,19 @@ export default class BlazeTemplate extends React.Component { static defaultProps = { component: 'div', } - // we don't want to re-render this component if parent changes - shouldComponentUpdate() { - return false; - } componentDidMount() { - let {template} = this.props; + const { template } = this.props; this.view = Blaze.render(template, ReactDOM.findDOMNode(this.refs.root)); } + shouldComponentUpdate() { + return false; + } componentWillUnmount() { Blaze.remove(this.view); } render() { - let {component, ...props} = this.props; + const { component } = this.props; + let { ...props } = this.props; props.ref = 'root'; return React.createElement(component, props); } diff --git a/app/components/__tests__/client/unit/AppSpec.js b/app/components/__tests__/client/unit/AppSpec.js index 499d9e0..e232414 100644 --- a/app/components/__tests__/client/unit/AppSpec.js +++ b/app/components/__tests__/client/unit/AppSpec.js @@ -5,23 +5,26 @@ // data and then the children can be very easily tested with // just props and state. We'll use a local component for an example -import React, {Component} from 'react'; -import {mount} from 'enzyme'; +import React, { Component, PropTypes } from 'react'; +import { mount } from 'enzyme'; class Post extends Component { - state = { - isVisible: true - }; static defaultProps = { - title: 'Default Post Name' + title: 'Default Post Name', + }; + static propTypes = { + title: PropTypes.string, + }; + state = { + isVisible: true, }; handleHide = () => { - this.setState({isVisible: false}); + this.setState({ isVisible: false }); }; render() { - let visibleClass = (this.state.isVisible) ? 'block' : 'hidden'; + const visibleClass = (this.state.isVisible) ? 'block' : 'hidden'; return ( -
+

{this.props.title}

How now brown cow @@ -34,22 +37,22 @@ class Post extends Component { describe('Sample post component', () => { it('renders default post name without props', () => { - let comp = mount(); + const comp = mount(); expect(comp.find('h1').text()).toEqual('Default Post Name'); }); it('renders correct post name with a name prop', () => { - let comp = mount(); - expect(comp.find('h1').text()).toEqual("Webpack is awesome!"); + const comp = mount(); + expect(comp.find('h1').text()).toEqual('Webpack is awesome!'); }); - it("should have a default state of visible", () => { - let comp = mount(); + it('should have a default state of visible', () => { + const comp = mount(); expect(comp.find('.Post').prop('style').display).toEqual('block'); }); - it("should hide when hide button is clicked", () => { - let comp = mount(); + it('should hide when hide button is clicked', () => { + const comp = mount(); comp.find('button').simulate('click'); expect(comp.find('.Post').prop('style').display).toEqual('hidden'); }); diff --git a/app/fixtures.js b/app/fixtures.js index f07b827..1f43304 100644 --- a/app/fixtures.js +++ b/app/fixtures.js @@ -1,9 +1,9 @@ /* global Accounts */ -import {Posts} from './collections'; +import { Posts } from './collections'; export function createPosts() { console.log('Creating fake posts'); - [1, 2, 3, 4].forEach(function(count) { + [1, 2, 3, 4].forEach(count => { Posts.insert({ name: 'Test post # ' + count, desc: 'How now brown cow', @@ -13,7 +13,7 @@ export function createPosts() { export function createUsers() { console.log('Creating fake users'); - ['Bob', 'Jane', 'Max'].forEach(function(name) { + ['Bob', 'Jane', 'Max'].forEach(name => { Accounts.createUser({ username: name, password: 'password', diff --git a/app/main_client.js b/app/main_client.js index 16f0cd6..2eb4fed 100644 --- a/app/main_client.js +++ b/app/main_client.js @@ -9,5 +9,5 @@ Accounts.ui.config({ console.log('Running on client only'); Meteor.startup(() => { - ReactDOM.render(, document.getElementById('root')); + ReactDOM.render(, document.getElementById('root')); }); diff --git a/app/main_server.js b/app/main_server.js index a07f3fe..b6e19e0 100644 --- a/app/main_server.js +++ b/app/main_server.js @@ -1,7 +1,5 @@ -import React from 'react'; -import App from './components/App.jsx'; -import {Posts} from './collections'; -import {createPosts, createUsers} from './fixtures'; +import { Posts } from './collections'; +import { createPosts, createUsers } from './fixtures'; // we don't call this so we're just importing to initialize file import './method_example'; @@ -16,5 +14,5 @@ console.log('\n\nRunning on server only'); console.log('There are # posts:', Posts.find().fetch().length); Meteor.startup(() => { - console.log('React SSR:', React.renderToString()); + }); diff --git a/core-js-custom-build.js b/core-js-custom-build.js index 4fab526..2b807b4 100644 --- a/core-js-custom-build.js +++ b/core-js-custom-build.js @@ -6,7 +6,7 @@ var path = require('path'); dirs.lib = path.join(dirs.webpack, 'lib'); if (!fs.existsSync(dirs.lib)) mkdir(dirs.lib); -var coreJsVersion = JSON.parse(fs.readFileSync('node_modules/core-js/package.json')).version; +var coreJsVersion = JSON.parse(fs.readFileSync('node_modules/core-js-builder/node_modules/core-js/package.json')).version; var targetFileName = 'core-js-no-number.js'; var currentFileExist = fs.existsSync(path.join(dirs.lib, targetFileName)); var currentFileFewLines = currentFileExist ? diff --git a/meteor_core/.meteor/.finished-upgraders b/meteor_core/.meteor/.finished-upgraders index 61ee313..dacc2c0 100644 --- a/meteor_core/.meteor/.finished-upgraders +++ b/meteor_core/.meteor/.finished-upgraders @@ -10,3 +10,4 @@ notices-for-facebook-graph-api-2 1.2.0-meteor-platform-split 1.2.0-cordova-changes 1.2.0-breaking-changes +1.3.0-split-minifiers-package diff --git a/meteor_core/.meteor/packages b/meteor_core/.meteor/packages index d67b4da..c3f2183 100644 --- a/meteor_core/.meteor/packages +++ b/meteor_core/.meteor/packages @@ -4,21 +4,20 @@ # 'meteor add' and 'meteor remove' will edit this file for you, # but you can also edit it by hand. -accounts-ui +meteor-base accounts-password react-meteor-data -babel-runtime -meteor-base -mobile-experience mongo -blaze-html-templates session -jquery tracker logging reload random ejson -spacebars check mindfront:why-reminify + +accounts-ui +mobile-experience +blaze-html-templates +spacebars diff --git a/meteor_core/.meteor/release b/meteor_core/.meteor/release index 5684262..940e0b5 100644 --- a/meteor_core/.meteor/release +++ b/meteor_core/.meteor/release @@ -1 +1 @@ -METEOR@1.2.0.2 +METEOR@1.3.2.4 diff --git a/meteor_core/.meteor/versions b/meteor_core/.meteor/versions index 8d333be..0988565 100644 --- a/meteor_core/.meteor/versions +++ b/meteor_core/.meteor/versions @@ -1,78 +1,82 @@ -accounts-base@1.2.1 -accounts-password@1.1.3 -accounts-ui@1.1.6 -accounts-ui-unstyled@1.1.8 -autoupdate@1.2.3 -babel-compiler@5.8.24_1 -babel-runtime@0.1.4 -base64@1.0.4 -binary-heap@1.0.4 -blaze@2.1.3 -blaze-html-templates@1.0.1 -blaze-tools@1.0.4 -boilerplate-generator@1.0.4 -caching-compiler@1.0.0 -caching-html-compiler@1.0.2 -callback-hook@1.0.4 -check@1.0.6 -ddp@1.2.2 -ddp-client@1.2.1 -ddp-common@1.2.1 -ddp-rate-limiter@1.0.0 -ddp-server@1.2.1 -deps@1.0.9 -diff-sequence@1.0.1 -ecmascript@0.1.5 -ecmascript-collections@0.1.6 -ejson@1.0.7 -email@1.0.7 -fastclick@1.0.7 -geojson-utils@1.0.4 -hot-code-push@1.0.0 -html-tools@1.0.5 -htmljs@1.0.5 -http@1.1.1 -id-map@1.0.4 -jquery@1.11.4 -jsx@0.2.1 -launch-screen@1.0.4 -less@2.5.0_3 -livedata@1.0.15 -localstorage@1.0.5 -logging@1.0.8 -meteor@1.1.9 -meteor-base@1.0.1 -mindfront:why-reminify@1.0.0 +accounts-base@1.2.7 +accounts-password@1.1.8 +accounts-ui@1.1.9 +accounts-ui-unstyled@1.1.12 +allow-deny@1.0.4 +autoupdate@1.2.9 +babel-compiler@6.6.4 +babel-runtime@0.1.8 +base64@1.0.8 +binary-heap@1.0.8 +blaze@2.1.7 +blaze-html-templates@1.0.4 +blaze-tools@1.0.8 +boilerplate-generator@1.0.8 +caching-compiler@1.0.4 +caching-html-compiler@1.0.6 +callback-hook@1.0.8 +check@1.2.1 +ddp@1.2.5 +ddp-client@1.2.7 +ddp-common@1.2.5 +ddp-rate-limiter@1.0.4 +ddp-server@1.2.6 +deps@1.0.12 +diff-sequence@1.0.5 +ecmascript@0.4.3 +ecmascript-runtime@0.2.10 +ejson@1.0.11 +email@1.0.12 +fastclick@1.0.11 +geojson-utils@1.0.8 +hot-code-push@1.0.4 +html-tools@1.0.9 +htmljs@1.0.9 +http@1.1.5 +id-map@1.0.7 +jquery@1.11.8 +launch-screen@1.0.11 +less@2.6.0 +livedata@1.0.18 +localstorage@1.0.9 +logging@1.0.12 +meteor@1.1.14 +meteor-base@1.0.4 +mindfront:why-reminify@1.0.1 +minifier-js@1.1.11 minifiers@1.1.7 -minimongo@1.0.10 -mobile-experience@1.0.1 -mobile-status-bar@1.0.6 -mongo@1.1.2 -mongo-id@1.0.1 -npm-bcrypt@0.7.8_2 -npm-mongo@1.4.39_1 -observe-sequence@1.0.7 -ordered-dict@1.0.4 -promise@0.5.0 -random@1.0.4 -rate-limit@1.0.0 -react-meteor-data@0.1.9 -reactive-dict@1.1.2 -reactive-var@1.0.6 -reload@1.1.4 -retry@1.0.4 -routepolicy@1.0.6 -service-configuration@1.0.5 -session@1.1.1 -sha@1.0.4 -spacebars@1.0.7 -spacebars-compiler@1.0.7 -srp@1.0.4 -templating@1.1.4 -templating-tools@1.0.0 -tracker@1.0.9 -ui@1.0.8 -underscore@1.0.4 -url@1.0.5 -webapp@1.2.2 -webapp-hashing@1.0.5 +minimongo@1.0.16 +mobile-experience@1.0.4 +mobile-status-bar@1.0.12 +modules@0.6.1 +modules-runtime@0.6.3 +mongo@1.1.7 +mongo-id@1.0.4 +npm-bcrypt@0.8.5 +npm-mongo@1.4.43 +observe-sequence@1.0.11 +ordered-dict@1.0.7 +promise@0.6.7 +random@1.0.9 +rate-limit@1.0.4 +react-meteor-data@0.2.9 +reactive-dict@1.1.7 +reactive-var@1.0.9 +reload@1.1.8 +retry@1.0.7 +routepolicy@1.0.10 +service-configuration@1.0.9 +session@1.1.5 +sha@1.0.7 +spacebars@1.0.11 +spacebars-compiler@1.0.11 +srp@1.0.8 +templating@1.1.9 +templating-tools@1.0.4 +tmeasday:check-npm-versions@0.3.1 +tracker@1.0.13 +ui@1.0.11 +underscore@1.0.8 +url@1.0.9 +webapp@1.2.8 +webapp-hashing@1.0.9 diff --git a/meteor_core/package.json b/meteor_core/package.json new file mode 100644 index 0000000..f0e7155 --- /dev/null +++ b/meteor_core/package.json @@ -0,0 +1,15 @@ +{ + "name": "meteor_core", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "react": "^15.0.2", + "react-addons-pure-render-mixin": "^15.0.2" + } +} diff --git a/package.json b/package.json index f503de6..38d64a1 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "repository": "https://www.github.com/jedwards1211/meteor-webpack-react", "devDependencies": { "babel-core": "^6.7.2", - "babel-eslint": "^5.0.0", + "babel-eslint": "^6.0.4", "babel-loader": "^6.2.4", "babel-plugin-react-transform": "^2.0.2", "babel-plugin-transform-decorators": "^6.6.5", @@ -14,46 +14,44 @@ "babel-preset-es2015": "^6.6.0", "babel-preset-react": "^6.5.0", "babel-preset-stage-1": "^6.5.0", - "core-js": "^2.1.4", - "core-js-builder": "^2.1.4", + "core-js-builder": "^2.3.0", "css-loader": "^0.23.1", - "enzyme": "^2.1.0", - "eslint-plugin-react": "^4.2.1", + "enzyme": "^2.2.0", + "eslint": "^2.9.0", + "eslint-config-airbnb": "^8.0.0", + "eslint-plugin-import": "^1.7.0", + "eslint-plugin-jsx-a11y": "^1.0.4", + "eslint-plugin-react": "^5.0.1", "jasmine-core": "^2.4.1", "json-loader": "^0.5.4", - "karma": "^0.13.9", - "karma-chrome-launcher": "^0.2.0", - "karma-jasmine": "^0.3.7", + "karma": "^0.13.22", + "karma-chrome-launcher": "^1.0.1", + "karma-jasmine": "^1.0.2", "karma-sourcemap-loader": "^0.3.5", "karma-webpack": "^1.7.0", "minimist": "^1.2.0", - "node-libs-browser": "^1.0.0", "null-loader": "^0.1.1", - "progress-bar-webpack-plugin": "^1.4.1", - "react-addons-test-utils": "^0.14.7", - "react-transform-catch-errors": "^1.0.0", - "react-transform-hmr": "^1.0.0", - "redbox-react": "^1.0.1", - "regenerator": "^0.8.36", - "shelljs": "^0.6.0", + "progress-bar-webpack-plugin": "^1.5.0", + "react-addons-test-utils": "^15.0.2", + "react-transform-catch-errors": "^1.0.2", + "react-transform-hmr": "^1.0.4", + "redbox-react": "^1.2.4", + "regenerator-runtime": "^0.9.5", + "shelljs": "^0.7.0", "source-map-support": "^0.4.0", "style-loader": "^0.13.0", "webpack": "^1.12.14", "webpack-dev-server": "git+https://github.com/jedwards1211/webpack-dev-server#ec658699d413407fb12025c59c768221bb05ab0c", - "webpack-merge": "^0.8.3" + "webpack-merge": "^0.12.0" }, "dependencies": { - "classnames": "^2.1.3", - "karma": "^0.13.22", - "lodash": "^4.6.1", - "progress-bar-webpack-plugin": "^1.5.0", - "react": "^0.14.0", - "react-dom": "^0.14.0", - "react-mixin": "^3.0.3", - "react-transform-hmr": "^1.0.4" + "lodash": "^4.11.2", + "react": "^15.0.2", + "react-dom": "^15.0.2", + "react-mixin": "^3.0.3" }, "scripts": { - "lint": "eslint app", + "lint": "eslint app --ext .js,.jsx; exit 0", "karma": "karma start" }, "author": "", diff --git a/webpack/make-webpack-config.js b/webpack/make-webpack-config.js index 6e57b85..128ca01 100644 --- a/webpack/make-webpack-config.js +++ b/webpack/make-webpack-config.js @@ -35,7 +35,7 @@ module.exports = function(options) { context: __dirname, entry: [ './lib/core-js-no-number', - 'regenerator/runtime' + 'regenerator-runtime/runtime' ], output: { path: path.join(__dirname, 'assets'), @@ -250,7 +250,8 @@ module.exports = function(options) { jsdom: 'window' }, plugins: [ - new webpack.IgnorePlugin(/react\/lib\/(ReactContext|ExecutionEnvironment)/) + new webpack.IgnorePlugin(/react\/lib\/(ReactContext|ExecutionEnvironment)/), + new webpack.IgnorePlugin(/react\/addons/) ], devServer: { port: webpackPort, @@ -265,7 +266,7 @@ module.exports = function(options) { if (entry) { config = merge(config, { - entry: entry + entry: entry }); }