-
Notifications
You must be signed in to change notification settings - Fork 16
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
New: Implement no-commonjs-return rule (fixes #4)
* Add more appropriate return values to test fixtures
- Loading branch information
Casey Visco
committed
Apr 10, 2015
1 parent
03c7e6d
commit b26312b
Showing
6 changed files
with
163 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
# Disallow use of `return` statement in a module definition when using Simplified CommonJS Wrapper (no-commonjs-return) | ||
|
||
When using the Simplified CommonJS Wrapper, module definition functions may export a value in one of three ways; by assigning to `module.exports`, adding a property to the `exports` object, or by directly returning a value. Exporting a value via `return` is typical of AMD modules, but not CommonJS modules. If you're using the Simplified CommonJS Wrapper, you may wish to enable this rule. | ||
|
||
Note that this rule is only in affect when using the Simplified CommonJS Wrapper form of `define`. It will *not* flag | ||
`return` statements in AMD definitions or simple function definitions. | ||
|
||
## Rule Details | ||
|
||
This rule aims to prevent exporting module values with `return`. | ||
|
||
The following patterns are considered warnings: | ||
|
||
```js | ||
define(function (require) { | ||
var foo = require('path/to/foo'), | ||
bar = require('path/to/bar'); | ||
|
||
return function () { /* ... */ }; | ||
}); | ||
``` | ||
|
||
The following patterns are not warnings: | ||
|
||
```js | ||
define(function (require, exports) { | ||
var foo = require('path/to/foo'), | ||
bar = require('path/to/bar'); | ||
|
||
exports.doSomething = function () { /* ... */ }; | ||
}); | ||
|
||
define(function (require, exports, module) { | ||
var foo = require('path/to/foo'), | ||
bar = require('path/to/bar'); | ||
|
||
module.exports = { | ||
doSomething: function () { /* ... */ }; | ||
} | ||
}); | ||
``` | ||
|
||
## When Not To Use It | ||
|
||
If you want to allow exporting a module value using the `return` statement, then it is safe to disable this rule. | ||
|
||
## Further Reading | ||
|
||
* [Define a Module with Simplified CommonJS Wrapper](http://requirejs.org/docs/api.html#cjsmodule) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
/** | ||
* @fileoverview Disallow use of `return` statement in a module definition when using Simplified CommonJS Wrapper | ||
* @author Casey Visco | ||
*/ | ||
|
||
"use strict"; | ||
|
||
//------------------------------------------------------------------------------ | ||
// Requirements | ||
//------------------------------------------------------------------------------ | ||
|
||
var helpers = require("../helpers"); | ||
|
||
|
||
//------------------------------------------------------------------------------ | ||
// Rule Definition | ||
//------------------------------------------------------------------------------ | ||
|
||
module.exports = function (context) { | ||
|
||
var MESSAGE = "Unexpected `return` in module definition. Use `exports` or `module.exports` instead."; | ||
var functions = []; | ||
|
||
//-------------------------------------------------------------------------- | ||
// Public | ||
//-------------------------------------------------------------------------- | ||
|
||
return { | ||
"FunctionExpression": function (node) { | ||
var parent = node.parent, | ||
isDefineCall = parent.type === "CallExpression" && parent.callee.name === "define"; | ||
|
||
functions.push({ | ||
isModuleDef: isDefineCall && helpers.isCommonJsDef(parent.arguments) | ||
}); | ||
}, | ||
|
||
"FunctionExpression:exit": function () { | ||
functions.pop(); | ||
}, | ||
|
||
"ReturnStatement": function (node) { | ||
var currentFunction = functions[functions.length - 1]; | ||
|
||
if (currentFunction.isModuleDef) { | ||
context.report(node, MESSAGE); | ||
} | ||
} | ||
}; | ||
|
||
}; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
/** | ||
* @fileoverview Tests for `no-commonjs-return` rule | ||
* @author Casey Visco <cvisco@gmail.com> | ||
*/ | ||
|
||
"use strict"; | ||
|
||
//------------------------------------------------------------------------------ | ||
// Requirements | ||
//------------------------------------------------------------------------------ | ||
|
||
var eslint = require("eslint"), | ||
ESLintTester = require("eslint-tester"), | ||
fixtures = require("../fixtures"); | ||
|
||
|
||
//------------------------------------------------------------------------------ | ||
// Tests | ||
//------------------------------------------------------------------------------ | ||
|
||
var eslintTester = new ESLintTester(eslint.linter); | ||
|
||
eslintTester.addRuleTest("lib/rules/no-commonjs-return", { | ||
|
||
valid: [ | ||
fixtures.define.OBJECT, | ||
fixtures.define.FUNCTION, | ||
fixtures.define.AMD, | ||
fixtures.define.AMD_EMPTY, | ||
fixtures.define.AMD_NAMED, | ||
fixtures.define.AMD_NAMED_EMPTY, | ||
fixtures.define.COMMONJS_2, | ||
fixtures.define.COMMONJS_3, | ||
fixtures.define.CJS_WITH_FUNC_EXPR | ||
], | ||
|
||
invalid: [ | ||
{ | ||
code: fixtures.define.COMMONJS_1, | ||
errors: [{ | ||
message: "Unexpected `return` in module definition. Use `exports` or `module.exports` instead.", | ||
type: "ReturnStatement" | ||
}] | ||
} | ||
] | ||
|
||
}); |