Skip to content

Commit

Permalink
add rule no-unresolved-require
Browse files Browse the repository at this point in the history
  • Loading branch information
mctep committed Nov 9, 2015
1 parent ae30023 commit acd4b45
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export const rules = {
'no-unresolved': require('./rules/no-unresolved')
, 'no-unresolved-require': require('./rules/no-unresolved-require')
, 'named': require('./rules/named')
, 'default': require('./rules/default')
, 'namespace': require('./rules/namespace')
Expand All @@ -17,6 +18,7 @@ export const rules = {
export const rulesConfig = {

'no-unresolved': 0
, 'no-unresolved-require': 0
, 'named': 0
, 'namespace': 0
, 'default': 0
Expand Down
35 changes: 35 additions & 0 deletions src/rules/no-unresolved-require.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/**
* @fileOverview Ensures that an required path exists, given resolution rules.
* @author Ben Mosher
*/
import resolve from '../core/resolve'

module.exports = function (context) {
function checkSource(call) {
if (call.callee.type !== 'Identifier') return
if (call.callee.name !== 'require') return

var requireArg = call.arguments[0];
var modules;

if (requireArg.type === 'ArrayExpression') {
modules = requireArg.elements;
} else {
modules = [requireArg];
}

modules.forEach(function(module) {
if (module.type !== 'Literal') return
if (typeof module.value !== 'string') return

if (resolve(module.value, context) == null) {
context.report(module,
'Unable to resolve path to module \'' + module.value + '\'.')
}
});
}

return {
'CallExpression': checkSource
}
}
63 changes: 63 additions & 0 deletions tests/src/rules/no-unresolved-require.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
var path = require('path')

import { test } from '../utils'

import { RuleTester } from 'eslint'

var ruleTester = new RuleTester()
, rule = require('../../../lib/rules/no-unresolved-require')

ruleTester.run('no-unresolved-require', rule, {
valid: [
test({ code: 'require("./bar");' }),
test({ code: "require('fs');" }),
test({ code: 'require(["./bar", "fs"]);' }),
test({
code: "require('in-alternate-root');",
settings: {
'import/resolve': {
'paths': [path.join( process.cwd()
, 'tests', 'files', 'alternate-root')],
},
},
}),
],

invalid: [
// should fail for jsx by default
test({ code: 'require("jsx-module/foo")'
, errors: [ {message: 'Unable to resolve path to ' +
'module \'jsx-module/foo\'.'} ],
}),

test({ code: 'require(["fs", "jsx-module/foo"])'
, errors: [ {message: 'Unable to resolve path to ' +
'module \'jsx-module/foo\'.'} ],
}),

test({ code: 'require("./reallyfake/module")'
, settings: { 'import/ignore': ['^\\./fake/'] }
, errors: [{ message: 'Unable to resolve path to module ' +
'\'./reallyfake/module\'.' }],
}),

test({ code: 'require(["jsx-module/foo", "./reallyfake/module"])'
, settings: { 'import/ignore': ['^\\./fake/'] }
, errors: [{ message: 'Unable to resolve path to module ' +
'\'jsx-module/foo\'.' },
{ message: 'Unable to resolve path to module ' +
'\'./reallyfake/module\'.' }],
}),

test({
code: "require('./baz');",
errors: [{ message: "Unable to resolve path to module './baz'."
, type: 'Literal',
}]}),
test({
code: "require('./empty-folder');",
errors: [{ message: "Unable to resolve path to module './empty-folder'."
, type: 'Literal',
}]}),
],
})

0 comments on commit acd4b45

Please sign in to comment.