Skip to content

Commit

Permalink
Improved error messages for order-in rules (#23)
Browse files Browse the repository at this point in the history
* rules/order: Extract common determinePropertyType() function

* utils/property-order: Merge duplicate "service" checks

* utils/property-order: Add missing strict mode directive

* utils/property-order: Merge duplicate "unknown" branches

* utils/property-order: Merge duplicate "method" branches

* utils/property-order: Merge duplicate "actions" branches

* utils/property-order: Merge duplicate "property" branches

* rules/order: Merge NAMES hashes

* rules/order: Merge duplicate code

* utils/property-order: Inline toPropertyInfo() function

* utils/property-order: Sort unknown types below everything else

* utils/property-order: Merge duplicate "observer" branches

* utils/property-order: Merge duplicate "single/multi-line-function" branches

* rules/order: Allow users to override the default order

* utils/property-order: Extract getOrder() function

* utils/property-order: Allow multiple types per order

* utils/property-order: Extract getName() function

* utils/property-order: Include key names in property descriptions

* utils/property-order: Replace "default-property" with "inherited-property"
  • Loading branch information
Turbo87 authored and Michał Sajnóg committed Feb 9, 2017
1 parent 28ac2a1 commit e02828d
Show file tree
Hide file tree
Showing 9 changed files with 308 additions and 226 deletions.
52 changes: 7 additions & 45 deletions lib/rules/order-in-components.js
@@ -1,7 +1,9 @@
'use strict';

var ember = require('../utils/ember');
var reportUnorderedProperties = require('../utils/property-order').reportUnorderedProperties;
var propOrder = require('../utils/property-order');

var reportUnorderedProperties = propOrder.reportUnorderedProperties;

const ORDER = [
'service',
Expand All @@ -12,61 +14,21 @@ const ORDER = [
'lifecycle-hook',
'actions',
'method',
'unknown',
];

const NAMES = {
'service': 'service injection',
'property': 'property',
'single-line-function': 'single-line function',
'multi-line-function': 'multi-line function',
'observer': 'observer',
'lifecycle-hook': 'lifecycle hook',
'actions': 'actions hash',
'method': 'custom method',
'unknown': 'unknown property type',
};

function toType(node) {
if (ember.isInjectedServiceProp(node.value)) {
return 'service';
} else if (ember.isCustomProp(node)) {
return 'property';
} else if (ember.isSingleLineFn(node)) {
return 'single-line-function';
} else if (ember.isMultiLineFn(node)) {
return 'multi-line-function';
} else if (ember.isObserverProp(node.value)) {
return 'observer';
} else if (ember.isComponentLifecycleHook(node)) {
return 'lifecycle-hook';
} else if (ember.isActionsProp(node)) {
return 'actions';
} else if (ember.isComponentCustomFunction(node)) {
return 'method';
} else {
return 'unknown';
}
}

//------------------------------------------------------------------------------
// Organizing - Organize your components and keep order in objects
//------------------------------------------------------------------------------

module.exports = function(context) {
var options = context.options[0] || {};
var order = options.order || ORDER;

return {
CallExpression: function(node) {
if (!ember.isEmberComponent(node)) return;

reportUnorderedProperties(node, context, function(property) {
var type = toType(property);

return {
node: property,
name: NAMES[type],
order: ORDER.indexOf(type)
};
});
reportUnorderedProperties(node, context, 'component', order);
}
}
};
54 changes: 8 additions & 46 deletions lib/rules/order-in-controllers.js
@@ -1,72 +1,34 @@
'use strict';

var ember = require('../utils/ember');
var reportUnorderedProperties = require('../utils/property-order').reportUnorderedProperties;
var propOrder = require('../utils/property-order');

var reportUnorderedProperties = propOrder.reportUnorderedProperties;

const ORDER = [
'service',
'default-property',
'inherited-property',
'property',
'single-line-function',
'multi-line-function',
'observer',
'actions',
'method',
'unknown',
];

const NAMES = {
'service': 'service injection',
'default-property': 'default property',
'property': 'property',
'single-line-function': 'single-line function',
'multi-line-function': 'multi-line function',
'observer': 'observer',
'actions': 'actions hash',
'method': 'custom method',
'unknown': 'unknown property type',
};

function toType(node) {
if (ember.isInjectedServiceProp(node.value)) {
return 'service';
} else if (ember.isControllerDefaultProp(node)) {
return 'default-property';
} else if (ember.isCustomProp(node)) {
return 'property';
} else if (ember.isSingleLineFn(node)) {
return 'single-line-function';
} else if (ember.isMultiLineFn(node)) {
return 'multi-line-function';
} else if (ember.isObserverProp(node.value)) {
return 'observer';
} else if (ember.isActionsProp(node)) {
return 'actions';
} else if (ember.isFunctionExpression(node.value)) {
return 'method';
} else {
return 'unknown';
}
}

//------------------------------------------------------------------------------
// Organizing - Organize your routes and keep order in objects
//------------------------------------------------------------------------------

module.exports = function(context) {
var options = context.options[0] || {};
var order = options.order || ORDER;

return {
CallExpression: function(node) {
if (!ember.isEmberController(node)) return;

reportUnorderedProperties(node, context, function(property) {
var type = toType(property);

return {
node: property,
name: NAMES[type],
order: ORDER.indexOf(type)
};
});
reportUnorderedProperties(node, context, 'controller', order);
}
};
};
Expand Down
40 changes: 7 additions & 33 deletions lib/rules/order-in-models.js
@@ -1,57 +1,31 @@
'use strict';

var ember = require('../utils/ember');
var reportUnorderedProperties = require('../utils/property-order').reportUnorderedProperties;
var propOrder = require('../utils/property-order');

var reportUnorderedProperties = propOrder.reportUnorderedProperties;

const ORDER = [
'attribute',
'relationship',
'single-line-function',
'multi-line-function',
'other',
];

const NAMES = {
'attribute': 'attribute',
'relationship': 'relationship',
'single-line-function': 'single-line function',
'multi-line-function': 'multi-line function',
'other': 'property',
};

function toType(node) {
if (ember.isModule(node.value, 'attr', 'DS')) {
return 'attribute';
} else if (ember.isRelation(node)) {
return 'relationship';
} else if (ember.isSingleLineFn(node)) {
return 'single-line-function';
} else if (ember.isMultiLineFn(node)) {
return 'multi-line-function';
} else {
return 'other';
}
}

//------------------------------------------------------------------------------
// Organizing - Organize your models
// Attributes -> Relations -> Computed Properties
//------------------------------------------------------------------------------

module.exports = function(context) {
var options = context.options[0] || {};
var order = options.order || ORDER;

return {
CallExpression: function(node) {
if (!ember.isDSModel(node)) return;

reportUnorderedProperties(node, context, function(property) {
var type = toType(property);

return {
node: property,
name: NAMES[type],
order: ORDER.indexOf(type)
};
});
reportUnorderedProperties(node, context, 'model', order);
}
};
};
56 changes: 7 additions & 49 deletions lib/rules/order-in-routes.js
@@ -1,75 +1,33 @@
'use strict';

var ember = require('../utils/ember');
var reportUnorderedProperties = require('../utils/property-order').reportUnorderedProperties;
var propOrder = require('../utils/property-order');

var reportUnorderedProperties = propOrder.reportUnorderedProperties;

const ORDER = [
'service',
'default-property',
'inherited-property',
'property',
'model',
'lifecycle-hook',
'actions',
'method',
'unknown',
];

const NAMES = {
'service': 'service injection',
'default-property': 'default property',
'property': 'property',
'model': 'model hook',
'lifecycle-hook': 'lifecycle hook',
'actions': 'actions hash',
'method': 'custom method',
'unknown': 'unknown property type',
};

function toType(node) {

if (ember.isInjectedServiceProp(node.value)) {
return 'service';
} else if (ember.isRouteDefaultProp(node)) {
return 'default-property';
} else if (ember.isCustomProp(node)) {
return 'property';
} else if (ember.isModelProp(node)) {
return 'model';
} else if (ember.isRouteDefaultMethod(node)) {
return 'lifecycle-hook';
} else if (ember.isActionsProp(node)) {
return 'actions';
} else if (ember.isRouteCustomFunction(node)) {
return 'method';
} else {
return 'unknown';
}
}

//------------------------------------------------------------------------------
// Organizing - Organize your routes and keep order in objects
//------------------------------------------------------------------------------

module.exports = function(context) {
var message = 'Check order of properties';

function report(node) {
context.report(node, message);
}
var options = context.options[0] || {};
var order = options.order || ORDER;

return {
CallExpression: function(node) {
if (!ember.isEmberRoute(node)) return;

reportUnorderedProperties(node, context, function(property) {
var type = toType(property);

return {
node: property,
name: NAMES[type],
order: ORDER.indexOf(type)
};
});
reportUnorderedProperties(node, context, 'route', order);
}
};
};

0 comments on commit e02828d

Please sign in to comment.