Skip to content

Commit

Permalink
Rewrite component detection
Browse files Browse the repository at this point in the history
  • Loading branch information
yannickcr committed Nov 4, 2015
1 parent 0e14ff3 commit 2749a0b
Show file tree
Hide file tree
Showing 10 changed files with 477 additions and 407 deletions.
27 changes: 7 additions & 20 deletions lib/rules/display-name.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,18 @@
*/
'use strict';

var componentUtil = require('../util/component');
var ComponentList = componentUtil.List;
var Components = require('../util/Components');

// ------------------------------------------------------------------------------
// Rule Definition
// ------------------------------------------------------------------------------

module.exports = function(context) {
module.exports = Components.detect(function(context, components) {

var config = context.options[0] || {};
var acceptTranspilerName = config.acceptTranspilerName || false;

var componentList = new ComponentList();

var MISSING_MESSAGE = 'Component definition is missing display name';
var MISSING_MESSAGE_NAMED_COMP = '{{component}} component definition is missing display name';

/**
* Checks if we are declaring a display name
Expand Down Expand Up @@ -51,7 +47,7 @@ module.exports = function(context) {
* @param {ASTNode} node The AST node being checked.
*/
function markDisplayNameAsDeclared(node) {
componentList.set(context, node, {
components.set(node, {
hasDisplayName: true
});
}
Expand All @@ -63,7 +59,7 @@ module.exports = function(context) {
function reportMissingDisplayName(component) {
context.report(
component.node,
component.name === componentUtil.DEFAULT_COMPONENT_NAME ? MISSING_MESSAGE : MISSING_MESSAGE_NAMED_COMP, {
MISSING_MESSAGE, {
component: component.name
}
);
Expand Down Expand Up @@ -135,31 +131,28 @@ module.exports = function(context) {
if (!isDisplayNameDeclaration(node.property)) {
return;
}
var component = componentList.getByName(context.getSource(node.object));
var component = context.react.getRelatedComponent(node);
if (!component) {
return;
}
markDisplayNameAsDeclared(component.node);
},

FunctionExpression: function(node) {
componentList.set(context, node);
if (!acceptTranspilerName || !hasTranspilerName(node)) {
return;
}
markDisplayNameAsDeclared(node);
},

FunctionDeclaration: function(node) {
componentList.set(context, node);
if (!acceptTranspilerName || !hasTranspilerName(node)) {
return;
}
markDisplayNameAsDeclared(node);
},

ArrowFunctionExpression: function(node) {
componentList.set(context, node);
if (!acceptTranspilerName || !hasTranspilerName(node)) {
return;
}
Expand All @@ -174,15 +167,13 @@ module.exports = function(context) {
},

ClassDeclaration: function(node) {
componentList.set(context, node);
if (!acceptTranspilerName || !hasTranspilerName(node)) {
return;
}
markDisplayNameAsDeclared(node);
},

ObjectExpression: function(node) {
componentList.set(context, node);
if (!acceptTranspilerName || !hasTranspilerName(node)) {
// Search for the displayName declaration
node.properties.forEach(function(property) {
Expand All @@ -196,12 +187,8 @@ module.exports = function(context) {
markDisplayNameAsDeclared(node);
},

ReturnStatement: function(node) {
componentList.set(context, node);
},

'Program:exit': function() {
var list = componentList.getList();
var list = components.list();
// Report missing display name for all components
for (var component in list) {
if (!list.hasOwnProperty(component) || list[component].hasDisplayName) {
Expand All @@ -211,7 +198,7 @@ module.exports = function(context) {
}
}
};
};
});

module.exports.schema = [{
type: 'object',
Expand Down
24 changes: 6 additions & 18 deletions lib/rules/no-direct-mutation-state.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,13 @@
*/
'use strict';

var componentUtil = require('../util/component');
var ComponentList = componentUtil.List;
var Components = require('../util/Components');

// ------------------------------------------------------------------------------
// Rule Definition
// ------------------------------------------------------------------------------

module.exports = function(context) {

var componentList = new ComponentList();
module.exports = Components.detect(function(context, components) {

/**
* Checks if the component is valid
Expand Down Expand Up @@ -41,15 +38,6 @@ module.exports = function(context) {
// --------------------------------------------------------------------------

return {

ObjectExpression: function(node) {
componentList.set(context, node);
},

ClassDeclaration: function(node) {
componentList.set(context, node);
},

AssignmentExpression: function(node) {
var item;
if (!node.left || !node.left.object || !node.left.object.object) {
Expand All @@ -63,18 +51,18 @@ module.exports = function(context) {
item.object.type === 'ThisExpression' &&
item.property.name === 'state'
) {
var component = componentList.getByNode(context, node);
var component = components.get(context.react.getParentComponent());
var mutations = component && component.mutations || [];
mutations.push(node.left.object);
componentList.set(context, node, {
components.set(node, {
mutateSetState: true,
mutations: mutations
});
}
},

'Program:exit': function() {
var list = componentList.getList();
var list = components.list();
for (var component in list) {
if (!list.hasOwnProperty(component) || isValid(list[component])) {
continue;
Expand All @@ -84,4 +72,4 @@ module.exports = function(context) {
}
};

};
});
22 changes: 5 additions & 17 deletions lib/rules/no-multi-comp.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,13 @@
*/
'use strict';

var componentUtil = require('../util/component');
var ComponentList = componentUtil.List;
var Components = require('../util/Components');

// ------------------------------------------------------------------------------
// Rule Definition
// ------------------------------------------------------------------------------

module.exports = function(context) {

var componentList = new ComponentList();
module.exports = Components.detect(function(context, components) {

var MULTI_COMP_MESSAGE = 'Declare only one React component per file';

Expand All @@ -22,21 +19,12 @@ module.exports = function(context) {
// --------------------------------------------------------------------------

return {

ClassDeclaration: function(node) {
componentList.set(context, node);
},

ObjectExpression: function(node) {
componentList.set(context, node);
},

'Program:exit': function() {
if (componentList.count() <= 1) {
if (components.length() <= 1) {
return;
}

var list = componentList.getList();
var list = components.list();
var i = 0;

for (var component in list) {
Expand All @@ -47,6 +35,6 @@ module.exports = function(context) {
}
}
};
};
});

module.exports.schema = [];
8 changes: 4 additions & 4 deletions lib/rules/prefer-es6-class.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,21 @@
*/
'use strict';

var componentUtil = require('../util/component');
var Components = require('../util/Components');

// ------------------------------------------------------------------------------
// Rule Definition
// ------------------------------------------------------------------------------

module.exports = function(context) {
module.exports = Components.detect(function(context) {

return {
ObjectExpression: function(node) {
if (componentUtil.isComponentDefinition(context, node)) {
if (context.react.isES5Component(node)) {
context.report(node, 'Component should use es6 class instead of createClass');
}
}
};
};
});

module.exports.schema = [];

0 comments on commit 2749a0b

Please sign in to comment.