Skip to content

Commit

Permalink
#303 normalize code a bit, more concise code
Browse files Browse the repository at this point in the history
  • Loading branch information
prayerslayer committed Oct 16, 2015
1 parent 7ba0e10 commit d36dfe3
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 103 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ scm-source.json
*.log

stats.json
.DS_Store
96 changes: 0 additions & 96 deletions client/codemods/unflummox.js

This file was deleted.

8 changes: 5 additions & 3 deletions client/lib/yourturn/src/search/search.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ import 'common/asset/less/yourturn/search.less';
class Search extends React.Component {
constructor(props) {
super();
this.store = props.flux.getStore('search');
this.stores = {
search: props.flux.getStore('search')
};
this.actions = props.flux.getActions('search');
this.state = {
term: ''
Expand All @@ -25,7 +27,7 @@ class Search extends React.Component {
if (!term.length) {
this.actions.clearSearchResults(term);
} else {
if (this.store.hasResults(term)) {
if (this.stores.search.hasResults(term)) {
this.actions.clearSearchResults(term);
}
Object
Expand All @@ -41,7 +43,7 @@ class Search extends React.Component {

render() {
let {term} = this.state,
results = this.store.getSearchResults(term);
results = this.stores.search.getSearchResults(term);

return <div className='search'>
<h2>Search</h2>
Expand Down
10 changes: 6 additions & 4 deletions client/lib/yourturn/src/sidebar/sidebar.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ class Sidebar extends React.Component {
constructor(props) {
super();
this.actions = props.flux.getActions('user');
this.store = props.flux.getStore('user');
this.stores = {
user: props.flux.getStore('user')
};
this.interval = false;
this.state = {
isTokenValid: true
Expand All @@ -30,7 +32,7 @@ class Sidebar extends React.Component {
}

updateExpiryDate() {
let tokeninfo = this.store.getTokenInfo(),
let tokeninfo = this.stores.user.getTokenInfo(),
NOW = Date.now();
this.setState({
currentDate: NOW, // to enforce state change
Expand All @@ -51,8 +53,8 @@ class Sidebar extends React.Component {
}

render() {
let tokeninfo = this.store.getTokenInfo(),
userinfo = this.store.getUserInfo(),
let tokeninfo = this.stores.user.getTokenInfo(),
userinfo = this.stores.user.getUserInfo(),
{router} = this.context;
return <aside className='sidebar'>
<div className='sidebar-content'>
Expand Down
28 changes: 28 additions & 0 deletions codemods/unflummox/test.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// lolz
/* lol */
import React from 'react';
import 'common/asset/less/application/application-form.less';

class Class extends React.Component {
constructor(props) {
super();
this.stores = {
user: props.flux.getStore('user'),
app: this.props.flux.getStore('app')
};
this.action = props.flux.getActions('user');

props.flux.getActions('whatever').call(13);

this.props.flux.getActions('blob').fetch().then();
}

render() {
let user = this.stores.user.getUser('current');
moreUsers = this.props.getStore('user').do(23);
this.action.do();
}

}

export default Class;
96 changes: 96 additions & 0 deletions codemods/unflummox/unflummox.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
function camelCase(word) {
return word[0].toUpperCase() + word.substring(1);
}

module.exports = function(file, api) {
if (/^router/.test(file.path)) {
// do not touch routers here
return;
}
if (/test.js$/.test(file.path)) {
// also do not touch tests
return;
}

let j = api.jscodeshift,
result = j(file.source);

// this.stores = { 'user' : props.flux.getStore('user') } => this.stores = { 'user': props.userStore }
result
.find(j.AssignmentExpression)
.filter(ass => ass.value.left.type === 'MemberExpression'
&& ass.value.left.object.type === 'ThisExpression'
&& ass.value.left.property.name === 'stores')
.find(j.ObjectExpression)
.find(j.Property)
.replaceWith(prop => {
return j.property(
'init',
prop.value.key,
j.memberExpression(
j.identifier('props'),
j.identifier(prop.value.key.name + 'Store')));
});

// this.stores.x.getSomething(y) => xGetters.getSometing(this.stores.x, y)
var getterImports = {};
result
.find(j.CallExpression)
.find(j.MemberExpression, { object: { type: 'ThisExpression' }})
.filter(member => /stores?/.test(member.value.property.name))
.closest(j.CallExpression)
.replaceWith(call => {
console.log(call.value);
var method = call.value.callee.property.name,
store = call.value.callee.object.property.name,
args = call.value.arguments;
getterImports[store] = true;
return j.callExpression(
j.memberExpression(j.identifier(store + 'Getters'), j.identifier(method)),
[j.memberExpression(
j.memberExpression(j.thisExpression(), j.identifier('stores')),
j.identifier(store))]
.concat(args));
});
// => add xGetters to imports
Object
.keys(getterImports)
.forEach(getter => {
let declaration = j.importDeclaration(
[j.importNamespaceSpecifier(j.identifier(getter + 'Getter'))],
j.literal('common/src/data/' + getter + '/' + getter + '-getter'));
result
.find(j.ClassDeclaration)
.insertBefore(declaration);
});

// this.action = props.flux.getActions('user') => delete
result
.find(j.AssignmentExpression)
.filter(assignment => assignment.value.right.type === 'CallExpression')
.find(j.CallExpression)
.filter(call => call.value.callee.type === 'MemberExpression')
.filter(call => call.value.callee.property.name === 'getActions')
.closest(j.AssignmentExpression)
.remove();

// flux.getActions('blahr').foo() => blahrActionsFoo()
result
.find(j.MemberExpression)
.filter(member => member.value.property.name === 'getActions')
.closest(j.CallExpression)
.filter(call => call.parentPath.value.type === 'MemberExpression')
.map(call => call.parentPath.parentPath)
.replaceWith(expr => {
let method = expr.value.callee.property.name,
args = expr.value.arguments,
actions = expr.value.callee.object.arguments[0].value;
return j.callExpression(
j.memberExpression(
j.memberExpression(j.thisExpression(), j.identifier('props')),
j.identifier(actions + 'Actions' + camelCase(method))),
args);
});

return result.toSource();
};

0 comments on commit d36dfe3

Please sign in to comment.