eslint-plugin-commonjs-require-name
Version:
eslint plugin for enforcing a `require` naming convention
355 lines (330 loc) • 9 kB
JavaScript
const ESLint = require('eslint');
const Options = require('./options');
const Rule = require('./rule');
function valid(cases, options) {
return cases.map(code => ({code, options}));
}
function invalid(cases, options) {
return cases.map(code => ({code, errors: 1, options}));
}
function options(obj) {
return Options.merge(Options.disabled(), obj);
}
describe('Rule', () => {
const tester = new ESLint.RuleTester({parserOptions: {ecmaVersion: 2015}});
describe('selectors', () => {
tester.run('assignment expression', Rule, {
valid: valid(['let path; path = require("path");'], [null, options()]),
invalid: invalid(['let not; not = require("path");'], [null, options()])
});
tester.run('declared assignment', Rule, {
valid: valid(['const path = require("path");'], [null, options()]),
invalid: invalid(['const not = require("path");'], [null, options()])
});
tester.run('multiple', Rule, {
valid: valid(
[
`
let childProcess;
const fs = require("fs");
const path = require("path");
let url;
childProcess = require("child_process");
url = require("url");
`
],
[null, options()]
),
invalid: invalid(
[
`
let childProcess;
const fs = require("fs");
let not;
const path = require("path");
childProcess = require("child_process");
not = require("url");
`
],
[null, options()]
)
});
tester.run('ignored', Rule, {
valid: valid(
[
'const ignore = require();',
'const ignore = require("too", "many");',
'const ignore = require(__filename + "dynamic");',
'let ignore; ignore = require();',
'let ignore; ignore = require("too", "many");',
'let ignore; ignore = require(__filename + "dynamic");',
'let ignore, Ignore = ignore = require("ignore");',
'const ignore = { _: require("ignore") };',
'const ignore = {}; ignore._ = require("ignore");',
`
let ignore;
function lazy() {
return require("ignore");
}
ignore = lazy();
`,
'const {ignore} = require("ignore");',
'const [ignore] = require("ignore");',
'let ignore; ({ignore} = require("ignore"));',
'let ignore; ([ignore] = require("ignore"));'
],
[options(), options()]
),
invalid: []
});
});
describe('path type', () => {
tester.run('local', Rule, {
valid: valid(
[
'const not = require("child_process");',
'const user = require("./test/fixture/models/user");'
],
[options(), null]
),
invalid: invalid(
['const not = require("./test/fixture/models/user");'],
[options(), null]
)
});
tester.run('node', Rule, {
valid: valid(
[
'const childProcess = require("child_process");',
'const not = require("./test/fixture/models/user");'
],
[null, options()]
),
invalid: invalid(
['const not = require("child_process");'],
[null, options()]
)
});
tester.run('none', Rule, {
valid: [],
invalid: invalid(
[
'const none = require("");',
'const none = require(null);',
'const none = require(false);'
],
[options(), options()]
)
});
});
describe('readme', () => {
tester.run('name', Rule, {
valid: valid(
[
'const childProcess = require("child_process");',
'const has = require("lodash/has");',
'const traverse = require("@babel/traverse");',
'const data = require("./app/models/data.json");',
'const user = require("./app/models/user");'
],
[options(), options()]
),
invalid: invalid(
[
'const child = require("child_process");',
'const babel = require("@babel/traverse");',
'const key = require("lodash/has");',
'const models = require("./app/models/data.json");',
'const usr = require("./app/models/user");'
],
[options(), options()]
)
});
tester.run('disable', Rule, {
valid: valid(
[
'const Promise = require("bluebird");',
'const Promise = require("./vendor/bluebird/dist");',
'const $ = require("jquery");',
'const $ = require("./vendor/jquery/dist");',
'const _ = require("lodash");',
'const _ = require("./vendor/lodash/dist");'
],
[
options({disable: ['vendor/(bluebird|jquery|lodash)/dist']}),
options({disable: ['^bluebird$', '^jquery$', '^lodash$']})
]
),
invalid: invalid(
[
'const Promise = require("bluebird");',
'const $ = require("jquery");',
'const _ = require("lodash");'
],
[options(), options()]
)
});
tester.run('namespace canonicalize', Rule, {
valid: valid(
[
'const controllerUser = require("./controllers/user");',
'const modelUser = require("./models/user");',
'const viewUser = require("./views/user");'
],
[
options({namespace: {canonicalize: true}, strict: {tokens: true}}),
null
]
),
invalid: [].concat(
invalid(
[
'const controllerUser = require("./controllers/user");',
'const modelUser = require("./models/user");',
'const viewUser = require("./views/user");'
],
[options({strict: {tokens: true}}), null]
),
invalid(
[
'const otherThing = require("other-things");',
'const thing = require("./things");'
],
[
options({namespace: {canonicalize: true}, strict: {tokens: true}}),
options({namespace: {canonicalize: true}, strict: {tokens: true}})
]
)
)
});
tester.run('namespace separators', Rule, {
valid: valid(
['const get = require("lodash.get");'],
[null, options({namespace: {separators: ['.']}})]
),
invalid: invalid(
['const get = require("lodash.get");'],
[null, options()]
)
});
tester.run('order', Rule, {
valid: [].concat(
valid(
[
'const childProcess = require("child_process");',
'const get = require("lodash/fp/get");'
],
[null, options({order: 'left-to-right'})]
),
valid(
[
'const userControllers = require("./app/controllers/user");',
'const userModelsV2 = require("./app/models/user");'
],
[options({order: 'right-to-left'}), null]
),
valid(
[
'const follower = require("./app/models/follower");',
'const userAppModelsV3 = require("./app/models/user");'
],
[options({order: 'any'}), null]
)
),
invalid: [].concat(
invalid(
['const intersectionByFP = require("lodash/fp/intersectionBy");'],
[null, options({order: 'left-to-right'})]
),
invalid(
['const viewsUser = require("./app/views/user");'],
[options({order: 'right-to-left'}), null]
),
invalid(
['const noMatch = require("./app/models");'],
[options({order: 'any'})]
)
)
});
tester.run('strict size', Rule, {
valid: [].concat(
valid(
['const babelTraverse = require("@babel/traverse");'],
[null, options({strict: {size: true}})]
),
valid(
['const followerAppModels = require("./app/models/follower");'],
[{strict: {size: true}}, null]
)
),
invalid: [].concat(
invalid(
['const types = require("@babel/types");'],
[null, options({strict: {size: true}})]
),
invalid(
['const user = require("./app/models/user");'],
[options({strict: {size: true}}), null]
)
)
});
tester.run('strict tokens', Rule, {
valid: [].concat(
valid(
['const traverse = require("@babel/traverse");'],
[null, options({strict: {tokens: true}})]
),
valid(
['const followerModels = require("./app/models/follower");'],
[options({strict: {tokens: true}}), null]
)
),
invalid: [].concat(
invalid(
['const babbleTypes = require("@babel/types");'],
[null, options({strict: {tokens: true}})]
),
invalid(
['const userModelsV2 = require("./app/models/user");'],
[options({strict: {tokens: true}}), null]
)
)
});
tester.run('strip', Rule, {
valid: [].concat(
valid(
[
'const decimal = require("decimal.js");',
'const socket = require("socket.io");'
],
[null, options({strip: ['.js', '.io']})]
),
valid(
[
'const get = require("lodash/get.js");',
'const user = require("./user.js");',
'const decimal = require("decimal.js");'
],
[options({strip: ['.js']}), options({strip: ['.js']})]
),
valid(
[
'const get = require("lodash/get.js");',
'const user = require("./user.js");'
],
[options({strip: []}), options({strip: []})]
)
),
invalid: [].concat(
invalid(
['const normalize = require("normalize.css");'],
[null, options({strip: ['.js', '.io']})]
),
invalid(
['const decimal = require("decimal.js");'],
[options({strip: []}), options({strip: []})]
)
)
});
});
});