128 lines
13 KiB
JavaScript
128 lines
13 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var _docsUrl = require('../docsUrl');
|
||
|
|
||
|
var _docsUrl2 = _interopRequireDefault(_docsUrl);
|
||
|
|
||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
|
||
|
const EXPORT_MESSAGE = 'Expected "export" or "export default"',
|
||
|
IMPORT_MESSAGE = 'Expected "import" instead of "require()"'; /**
|
||
|
* @fileoverview Rule to prefer ES6 to CJS
|
||
|
* @author Jamund Ferguson
|
||
|
*/
|
||
|
|
||
|
function normalizeLegacyOptions(options) {
|
||
|
if (options.indexOf('allow-primitive-modules') >= 0) {
|
||
|
return { allowPrimitiveModules: true };
|
||
|
}
|
||
|
return options[0] || {};
|
||
|
}
|
||
|
|
||
|
function allowPrimitive(node, options) {
|
||
|
if (!options.allowPrimitiveModules) return false;
|
||
|
if (node.parent.type !== 'AssignmentExpression') return false;
|
||
|
return node.parent.right.type !== 'ObjectExpression';
|
||
|
}
|
||
|
|
||
|
function allowRequire(node, options) {
|
||
|
return options.allowRequire;
|
||
|
}
|
||
|
|
||
|
function allowConditionalRequire(node, options) {
|
||
|
return options.allowConditionalRequire !== false;
|
||
|
}
|
||
|
|
||
|
function validateScope(scope) {
|
||
|
return scope.variableScope.type === 'module';
|
||
|
}
|
||
|
|
||
|
// https://github.com/estree/estree/blob/master/es5.md
|
||
|
function isConditional(node) {
|
||
|
if (node.type === 'IfStatement' || node.type === 'TryStatement' || node.type === 'LogicalExpression' || node.type === 'ConditionalExpression') return true;
|
||
|
if (node.parent) return isConditional(node.parent);
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
// Rule Definition
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
const schemaString = { enum: ['allow-primitive-modules'] };
|
||
|
const schemaObject = {
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
allowPrimitiveModules: { 'type': 'boolean' },
|
||
|
allowRequire: { 'type': 'boolean' },
|
||
|
allowConditionalRequire: { 'type': 'boolean' }
|
||
|
},
|
||
|
additionalProperties: false
|
||
|
};
|
||
|
|
||
|
module.exports = {
|
||
|
meta: {
|
||
|
type: 'suggestion',
|
||
|
docs: {
|
||
|
url: (0, _docsUrl2.default)('no-commonjs')
|
||
|
},
|
||
|
|
||
|
schema: {
|
||
|
anyOf: [{
|
||
|
type: 'array',
|
||
|
items: [schemaString],
|
||
|
additionalItems: false
|
||
|
}, {
|
||
|
type: 'array',
|
||
|
items: [schemaObject],
|
||
|
additionalItems: false
|
||
|
}]
|
||
|
}
|
||
|
},
|
||
|
|
||
|
create: function (context) {
|
||
|
const options = normalizeLegacyOptions(context.options);
|
||
|
|
||
|
return {
|
||
|
|
||
|
'MemberExpression': function (node) {
|
||
|
|
||
|
// module.exports
|
||
|
if (node.object.name === 'module' && node.property.name === 'exports') {
|
||
|
if (allowPrimitive(node, options)) return;
|
||
|
context.report({ node, message: EXPORT_MESSAGE });
|
||
|
}
|
||
|
|
||
|
// exports.
|
||
|
if (node.object.name === 'exports') {
|
||
|
const isInScope = context.getScope().variables.some(variable => variable.name === 'exports');
|
||
|
if (!isInScope) {
|
||
|
context.report({ node, message: EXPORT_MESSAGE });
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
'CallExpression': function (call) {
|
||
|
if (!validateScope(context.getScope())) return;
|
||
|
|
||
|
if (call.callee.type !== 'Identifier') return;
|
||
|
if (call.callee.name !== 'require') return;
|
||
|
|
||
|
if (call.arguments.length !== 1) return;
|
||
|
var module = call.arguments[0];
|
||
|
|
||
|
if (module.type !== 'Literal') return;
|
||
|
if (typeof module.value !== 'string') return;
|
||
|
|
||
|
if (allowRequire(call, options)) return;
|
||
|
|
||
|
if (allowConditionalRequire(call, options) && isConditional(call.parent)) return;
|
||
|
|
||
|
// keeping it simple: all 1-string-arg `require` calls are reported
|
||
|
context.report({
|
||
|
node: call.callee,
|
||
|
message: IMPORT_MESSAGE
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
};
|
||
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1jb21tb25qcy5qcyJdLCJuYW1lcyI6WyJFWFBPUlRfTUVTU0FHRSIsIklNUE9SVF9NRVNTQUdFIiwibm9ybWFsaXplTGVnYWN5T3B0aW9ucyIsIm9wdGlvbnMiLCJpbmRleE9mIiwiYWxsb3dQcmltaXRpdmVNb2R1bGVzIiwiYWxsb3dQcmltaXRpdmUiLCJub2RlIiwicGFyZW50IiwidHlwZSIsInJpZ2h0IiwiYWxsb3dSZXF1aXJlIiwiYWxsb3dDb25kaXRpb25hbFJlcXVpcmUiLCJ2YWxpZGF0ZVNjb3BlIiwic2NvcGUiLCJ2YXJpYWJsZVNjb3BlIiwiaXNDb25kaXRpb25hbCIsInNjaGVtYVN0cmluZyIsImVudW0iLCJzY2hlbWFPYmplY3QiLCJwcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJhbnlPZiIsIml0ZW1zIiwiYWRkaXRpb25hbEl0ZW1zIiwiY3JlYXRlIiwiY29udGV4dCIsIm9iamVjdCIsIm5hbWUiLCJwcm9wZXJ0eSIsInJlcG9ydCIsIm1lc3NhZ2UiLCJpc0luU2NvcGUiLCJnZXRTY29wZSIsInZhcmlhYmxlcyIsInNvbWUiLCJ2YXJpYWJsZSIsImNhbGwiLCJjYWxsZWUiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ2YWx1ZSJdLCJtYXBwaW5ncyI6Ijs7QUFLQTs7Ozs7O0FBRUEsTUFBTUEsaUJBQWlCLHVDQUF2QjtBQUFBLE1BQ01DLGlCQUFpQiwwQ0FEdkIsQyxDQVBBOzs7OztBQVVBLFNBQVNDLHNCQUFULENBQWdDQyxPQUFoQyxFQUF5QztBQUN2QyxNQUFJQSxRQUFRQyxPQUFSLENBQWdCLHlCQUFoQixLQUE4QyxDQUFsRCxFQUFxRDtBQUNuRCxXQUFPLEVBQUVDLHVCQUF1QixJQUF6QixFQUFQO0FBQ0Q7QUFDRCxTQUFPRixRQUFRLENBQVIsS0FBYyxFQUFyQjtBQUNEOztBQUVELFNBQVNHLGNBQVQsQ0FBd0JDLElBQXhCLEVBQThCSixPQUE5QixFQUF1QztBQUNyQyxNQUFJLENBQUNBLFFBQVFFLHFCQUFiLEVBQW9DLE9BQU8sS0FBUDtBQUNwQyxNQUFJRSxLQUFLQyxNQUFMLENBQVlDLElBQVosS0FBcUIsc0JBQXpCLEVBQWlELE9BQU8sS0FBUDtBQUNqRCxTQUFRRixLQUFLQyxNQUFMLENBQVlFLEtBQVosQ0FBa0JELElBQWxCLEtBQTJCLGtCQUFuQztBQUNEOztBQUVELFNBQVNFLFlBQVQsQ0FBc0JKLElBQXRCLEVBQTRCSixPQUE1QixFQUFxQztBQUNuQyxTQUFPQSxRQUFRUSxZQUFmO0FBQ0Q7O0FBRUQsU0FBU0MsdUJBQVQsQ0FBaUNMLElBQWpDLEVBQXVDSixPQUF2QyxFQUFnRDtBQUM5QyxTQUFPQSxRQUFRUyx1QkFBUixLQUFvQyxLQUEzQztBQUNEOztBQUVELFNBQVNDLGFBQVQsQ0FBdUJDLEtBQXZCLEVBQThCO0FBQzVCLFNBQU9BLE1BQU1DLGFBQU4sQ0FBb0JOLElBQXBCLEtBQTZCLFFBQXBDO0FBQ0Q7O0FBRUQ7QUFDQSxTQUFTTyxhQUFULENBQXVCVCxJQUF2QixFQUE2QjtBQUMzQixNQUNFQSxLQUFLRSxJQUFMLEtBQWMsYUFBZCxJQUNHRixLQUFLRSxJQUFMLEtBQWMsY0FEakIsSUFFR0YsS0FBS0UsSUFBTCxLQUFjLG1CQUZqQixJQUdHRixLQUFLRSxJQUFMLEtBQWMsdUJBSm5CLEVBS0UsT0FBTyxJQUFQO0FBQ0YsTUFBSUYsS0FBS0MsTUFBVCxFQUFpQixPQUFPUSxjQUFjVCxLQUFLQyxNQUFuQixDQUFQO0FBQ2pCLFNBQU8sS0FBUDtBQUNEOztBQUVEO0FBQ0E7QUFDQTs7QUFFQSxNQUFNUyxlQUFlLEVBQUVDLE1BQU0sQ0FBQyx5QkFBRCxDQUFSLEVBQXJCO0FBQ0EsTUFBTUMsZUFBZTtBQUNuQlYsUUFBTSxRQURhO0FBRW5CVyxjQUFZO0FBQ1ZmLDJCQUF1QixFQUFFLFFBQVEsU0FBVixFQURiO0FBRVZNLGtCQUFjLEVBQUUsUUFBUSxTQUFWLEVBRko7QUFHVkMsNkJBQXlCLEVBQUUsUUFBUSxTQUFWO0FBSGYsR0FGTztBQU9uQlMsd0JBQXNCO0FBUEgsQ0FBckI7O0FBVUFDLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKZixVQUFNLFlBREY7QUFFSmdCLFVBQU07QUFDSkMsV0FBSyx1QkFBUSxhQUFSO0FBREQsS0FGRjs7QUFNSkMsWUFBUTtBQUNOQyxhQUFPLENBQ0w7QUFDRW5CLGNBQU0sT0FEUjtBQUVFb0IsZUFBTyxDQUFDWixZQUFELENBRlQ7QUFHRWEseUJBQWlCO0FBSG5CLE9BREssRUFNTDtBQUNFckIsY0FBTSxPQURSO0FBRUVvQixlQUFPLENBQUNWLFlBQUQsQ0FGVDtBQUdFVyx5QkFBaUI7QUFIbkIsT0FOSztBQUREO0FBTkosR0FEUzs7QUF1QmZDLFVBQVEsVUFBVUMsT0FBVixFQUFtQjtBQUN6QixVQUFNN0IsVUFBVUQsdUJBQXVCOEIsUUFBUTdCLE9BQS9CLENBQWhCOztBQUVBLFdBQU87O0FBRUwsMEJBQW9CLFVBQVVJLElBQVYsRUFBZ0I7O0FBRWxDO0FBQ0EsWUFBSUEsS0FBSzBCLE1BQUwsQ0FBWUMsSUFBWixLQUFxQixRQUFyQixJQUFpQzNCLEtBQUs0QixRQUFMLENBQWNELElBQWQsS0FBdUIsU0FBNUQsRUFBdUU7QUFDckUsY0FBSTVCLGVBQWVDLElBQWYsRUFBcUJKLE9BQXJCLENBQUosRUFBbUM7QUFDbkM2QixrQkFBUUksTUFBUixDQUFlLEVBQUU3QixJQUFGLEVBQVE4QixTQUFTckMsY0FBakIsRUFBZjtBQUNEOztBQUVEO0FBQ0EsWUFBSU8sS0FBSzBCLE1BQUwsQ0FBWUMsSUFBWixLQUFxQixTQUF6QixFQUFvQztBQUNsQyxnQkFBTUksWUFBWU4sUUFBUU8sUUFBUixHQUNmQyxTQURlLENBRWZDLElBRmUsQ0FFVkMsWUFBWUEsU0FBU1IsSUFBVCxLQUFrQixTQUZwQixDQUFsQjtBQUdBLGNBQUksQ0FBRUksU0FBTixFQUFpQjtBQUNmTixvQkFBUUksTUFBUixDQUFlLEVBQUU3QixJQUFGLEVBQVE4QixTQUFTckMsY0FBakIsRUFBZjtBQUNEO0FBQ0Y7QUFFRixPQXBCSTtBQXFCTCx3QkFBa0IsVUFBVTJDLElBQVYsRUFBZ0I7QUFDaEMsWUFBSSxDQUFDOUIsY0FBY21CLFFBQVFPLFFBQVIsRUFBZCxDQUFMLEVBQXdDOztBQUV4QyxZQUFJSSxLQUFLQyxNQUFMLENBQVluQyxJQUFaLEtBQXFCLFlBQXpCLEVBQXVDO0FBQ3ZDLFlBQUlrQyxLQUFLQyxNQUFMLENBQVlWLElBQVosS0FBcUIsU0FBekIsRUFBb0M7O0FBRXBDLFlBQUlTLEtBQUtFLFNBQUwsQ0FBZUMsTUFBZixLQUEwQixDQUE5QixFQUFpQztBQUNqQyxZQUFJeEIsU0FBU3FCLEtBQUtFLFNBQUwsQ0FBZSxDQUFmLENBQWI7O0F
|