Skip to content

Commit

Permalink
add option: noImplicit
Browse files Browse the repository at this point in the history
  • Loading branch information
aladdin-add committed May 8, 2017
1 parent 7c8517b commit 963e3c3
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 28 deletions.
19 changes: 16 additions & 3 deletions lib/rules/getter-return.js
Expand Up @@ -50,11 +50,23 @@ module.exports = {
category: "Best Practices",
recommended: false
},

schema: []
fixable: null,
schema: [
{
type: "object",
properties: {
noImplicit: {
type: "boolean"
}
}
}
]
},

create(context) {

const options = context.options[0] || {};

let funcInfo = {
upper: null,
codePath: null,
Expand Down Expand Up @@ -120,7 +132,8 @@ module.exports = {
if (funcInfo.shouldCheck) {
funcInfo.hasReturn = true;

if (!node.argument) {
// if noImplicit: true, should also check node.argument
if (options.noImplicit && !node.argument) {
context.report({
node,
message: "Expected to return a value in {{name}}.",
Expand Down
70 changes: 45 additions & 25 deletions tests/lib/rules/getter-return.js
Expand Up @@ -23,54 +23,74 @@ const name = "getter 'bar'";
const noReturnMessage = `Expected to return a value in ${name}.`;
const noLastReturnMessage = `Expected to return a value at the end of ${name}.`;
const parserOptions = { ecmaVersion: 6 };
const options = [{ noImplicit: true }];

ruleTester.run("enforce-return-in-getter", rule, {

valid: [

// test obj: get
// test obj: get, option: {noImplicit: false}
{ code: "var foo = { get bar(){return true;} };" },
{ code: "var foo = { get bar(){return;} };" },
{ code: "var foo = { bar: function(){return true;} };" },
{ code: "var foo = { bar: function(){return;} };" },
{ code: "var foo = { bar(){return true;} };", parserOptions },
{ code: "var foo = { bar: function(){} };" },
{ code: "var foo = { bar(){} };", parserOptions },
{ code: "var foo = { bar(){return;} };", parserOptions },

// test class: get
// test class: get, option: {noImplicit: false}
{ code: "class foo { get bar(){return true;} }", parserOptions },
{ code: "class foo { get bar(){if(baz){return true;} else {return false;} } }", parserOptions },
{ code: "class foo { get bar(){if(baz){return;} else {return false;} } }", parserOptions },
{ code: "class foo { get(){return true;} }", parserOptions },
{ code: "var foo = { get bar(){if(bar) {return;} return true;} };", parserOptions, errors: [] },

// add object.defineProperty
// test object.defineProperty(s), option: {noImplicit: false}
{ code: "Object.defineProperty(foo, \"bar\", { get: function () {return true;}});" },
{ code: "Object.defineProperty(foo, \"bar\", { get: function () {return;}});" },
{ code: "Object.defineProperies(foo, { bar: { get: function () {return true;}} });" },
{ code: "Object.defineProperies(foo, { bar: { get: function () {return;}} });" },

// test option: {noImplicit: true}
{ code: "var foo = { get bar(){return true;} };", options },
{ code: "class foo { get bar(){return true;} }", options, parserOptions },
{ code: "Object.defineProperty(foo, \"bar\", { get: function () {return true;}});", options },
{ code: "Object.defineProperies(foo, { bar: { get: function () {return true;}} });", options },

// not getter.
{ code: "var get = function(){};" }
{ code: "var get = function(){};" },
{ code: "var get = function(){ return true; };" },
{ code: "var foo = { bar: function(){} };" },
{ code: "var foo = { bar: function(){ return true; } };" },
{ code: "var foo = { bar(){} };", parserOptions },
{ code: "var foo = { bar(){ return true; } };", parserOptions }
],

invalid: [

// TODO: why data: { name: "getter 'bar'"} is not working?
// test obj: get
{ code: "var foo = { get bar() {} };", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] },
{ code: "var foo = { get bar() {return;} };", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] },
{ code: "var foo = { get bar() {return; ;} };", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] },
{ code: "var foo = { get bar() {return 1; return;} };", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] },
{ code: "var foo = { get bar() {return; return 1;} };", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] },
{ code: "var foo = { get bar(){if(bar) {return true;}} };", parserOptions, errors: [{ message: noLastReturnMessage, data: { name: "getter 'bar'" } }] },
{ code: "var foo = { get bar(){if(bar) {return true;} return;} };", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] },
{ code: "var foo = { get bar(){if(bar) {return true;} ;} };", parserOptions, errors: [{ message: noLastReturnMessage, data: { name: "getter 'bar'" } }] },
{ code: "var foo = { get bar(){if(bar) {return;} return true;} };", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] },
{ code: "var foo = { get bar() {} };", parserOptions, errors: [{ message: noReturnMessage }] },
{ code: "var foo = { get bar() {return;} };", options, parserOptions, errors: [{ message: noReturnMessage }] },
{ code: "var foo = { get bar() {return; ;} };", options, parserOptions, errors: [{ message: noReturnMessage }] },
{ code: "var foo = { get bar() {return; return 1;} };", options, parserOptions, errors: [{ message: noReturnMessage }] },
{ code: "var foo = { get bar(){if(bar) {return true;}} };", parserOptions, errors: [{ message: noLastReturnMessage }] },
{ code: "var foo = { get bar(){if(bar) {return true;} return;} };", options, parserOptions, errors: [{ message: noReturnMessage }] },
{ code: "var foo = { get bar(){if(bar) {return true;} ;} };", parserOptions, errors: [{ message: noLastReturnMessage }] },
{ code: "var foo = { get bar(){if(bar) {return;} return true;} };", options, parserOptions, errors: [{ message: noReturnMessage }] },

// test class: get
{ code: "class foo { get bar(){} }", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] },
{ code: "class foo { get bar(){return;} }", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] },
{ code: "class foo { get bar(){if(bar) {return true;}} }", parserOptions, errors: [{ message: noLastReturnMessage, data: { name: "getter 'bar'" } }] },
{ code: "class foo { get bar(){if(bar) {return;} return true;} }", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] },

// add object.defineProperty
{ code: "Object.defineProperty(foo, \"bar\", { get: function (){return;}});", errors: [{ message: "Expected to return a value in method 'get'.", data: { name: "getter 'bar'" } }] },
{ code: "Object.defineProperty(foo, \"bar\", { get: function (){if(bar) {return true;}}});", errors: [{ message: "Expected to return a value at the end of method 'get'.", data: { name: "getter 'bar'" } }] },
{ code: "Object.defineProperty(foo, \"bar\", { get: function (){if(bar) {return;} return true;}});", errors: [{ message: "Expected to return a value in method 'get'.", data: { name: "getter 'bar'" } }] }
{ code: "class foo { get bar(){} }", parserOptions, errors: [{ message: noReturnMessage }] },
{ code: "class foo { get bar(){} }", options, parserOptions, errors: [{ message: noReturnMessage }] },
{ code: "class foo { get bar(){return;} }", options, parserOptions, errors: [{ message: noReturnMessage }] },
{ code: "class foo { get bar(){if(bar) {return true;}} }", options, parserOptions, errors: [{ message: noLastReturnMessage }] },
{ code: "class foo { get bar(){if(bar) {return;} return true;} }", options, parserOptions, errors: [{ message: noReturnMessage }] },

// test object.defineProperty
{ code: "Object.defineProperty(foo, \"bar\", { get: function (){return;}});", options, errors: [{ message: "Expected to return a value in method 'get'." }] },
{ code: "Object.defineProperty(foo, \"bar\", { get: function (){if(bar) {return true;}}});", errors: [{ message: "Expected to return a value at the end of method 'get'." }] },
{ code: "Object.defineProperty(foo, \"bar\", { get: function (){if(bar) {return;} return true;}});", options: [{ noImplicit: true }], errors: [{ message: "Expected to return a value in method 'get'." }] },

// test option: {noImplicit: true}
{ code: "Object.defineProperty(foo, \"bar\", { get: function (){return;}});", options, errors: [{ message: "Expected to return a value in method 'get'." }] }

]
});

0 comments on commit 963e3c3

Please sign in to comment.