153 lines
15 KiB
JavaScript
153 lines
15 KiB
JavaScript
|
'use strict';var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);
|
||
|
var _object = require('object.values');var _object2 = _interopRequireDefault(_object);
|
||
|
var _arrayPrototype = require('array.prototype.flat');var _arrayPrototype2 = _interopRequireDefault(_arrayPrototype);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { 'default': obj };}
|
||
|
|
||
|
var meta = {
|
||
|
type: 'suggestion',
|
||
|
docs: {
|
||
|
url: (0, _docsUrl2['default'])('group-exports') } };
|
||
|
|
||
|
|
||
|
/* eslint-disable max-len */
|
||
|
var errors = {
|
||
|
ExportNamedDeclaration: 'Multiple named export declarations; consolidate all named exports into a single export declaration',
|
||
|
AssignmentExpression: 'Multiple CommonJS exports; consolidate all exports into a single assignment to `module.exports`' };
|
||
|
|
||
|
/* eslint-enable max-len */
|
||
|
|
||
|
/**
|
||
|
* Returns an array with names of the properties in the accessor chain for MemberExpression nodes
|
||
|
*
|
||
|
* Example:
|
||
|
*
|
||
|
* `module.exports = {}` => ['module', 'exports']
|
||
|
* `module.exports.property = true` => ['module', 'exports', 'property']
|
||
|
*
|
||
|
* @param {Node} node AST Node (MemberExpression)
|
||
|
* @return {Array} Array with the property names in the chain
|
||
|
* @private
|
||
|
*/
|
||
|
function accessorChain(node) {
|
||
|
var chain = [];
|
||
|
|
||
|
do {
|
||
|
chain.unshift(node.property.name);
|
||
|
|
||
|
if (node.object.type === 'Identifier') {
|
||
|
chain.unshift(node.object.name);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
node = node.object;
|
||
|
} while (node.type === 'MemberExpression');
|
||
|
|
||
|
return chain;
|
||
|
}
|
||
|
|
||
|
function create(context) {
|
||
|
var nodes = {
|
||
|
modules: {
|
||
|
set: new Set(),
|
||
|
sources: {} },
|
||
|
|
||
|
types: {
|
||
|
set: new Set(),
|
||
|
sources: {} },
|
||
|
|
||
|
commonjs: {
|
||
|
set: new Set() } };
|
||
|
|
||
|
|
||
|
|
||
|
return {
|
||
|
ExportNamedDeclaration: function () {function ExportNamedDeclaration(node) {
|
||
|
var target = node.exportKind === 'type' ? nodes.types : nodes.modules;
|
||
|
if (!node.source) {
|
||
|
target.set.add(node);
|
||
|
} else if (Array.isArray(target.sources[node.source.value])) {
|
||
|
target.sources[node.source.value].push(node);
|
||
|
} else {
|
||
|
target.sources[node.source.value] = [node];
|
||
|
}
|
||
|
}return ExportNamedDeclaration;}(),
|
||
|
|
||
|
AssignmentExpression: function () {function AssignmentExpression(node) {
|
||
|
if (node.left.type !== 'MemberExpression') {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var chain = accessorChain(node.left);
|
||
|
|
||
|
// Assignments to module.exports
|
||
|
// Deeper assignments are ignored since they just modify what's already being exported
|
||
|
// (ie. module.exports.exported.prop = true is ignored)
|
||
|
if (chain[0] === 'module' && chain[1] === 'exports' && chain.length <= 3) {
|
||
|
nodes.commonjs.set.add(node);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Assignments to exports (exports.* = *)
|
||
|
if (chain[0] === 'exports' && chain.length === 2) {
|
||
|
nodes.commonjs.set.add(node);
|
||
|
return;
|
||
|
}
|
||
|
}return AssignmentExpression;}(),
|
||
|
|
||
|
'Program:exit': function () {function onExit() {
|
||
|
// Report multiple `export` declarations (ES2015 modules)
|
||
|
if (nodes.modules.set.size > 1) {
|
||
|
nodes.modules.set.forEach(function (node) {
|
||
|
context.report({
|
||
|
node: node,
|
||
|
message: errors[node.type] });
|
||
|
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// Report multiple `aggregated exports` from the same module (ES2015 modules)
|
||
|
(0, _arrayPrototype2['default'])((0, _object2['default'])(nodes.modules.sources).
|
||
|
filter(function (nodesWithSource) {return Array.isArray(nodesWithSource) && nodesWithSource.length > 1;})).
|
||
|
forEach(function (node) {
|
||
|
context.report({
|
||
|
node: node,
|
||
|
message: errors[node.type] });
|
||
|
|
||
|
});
|
||
|
|
||
|
// Report multiple `export type` declarations (FLOW ES2015 modules)
|
||
|
if (nodes.types.set.size > 1) {
|
||
|
nodes.types.set.forEach(function (node) {
|
||
|
context.report({
|
||
|
node: node,
|
||
|
message: errors[node.type] });
|
||
|
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// Report multiple `aggregated type exports` from the same module (FLOW ES2015 modules)
|
||
|
(0, _arrayPrototype2['default'])((0, _object2['default'])(nodes.types.sources).
|
||
|
filter(function (nodesWithSource) {return Array.isArray(nodesWithSource) && nodesWithSource.length > 1;})).
|
||
|
forEach(function (node) {
|
||
|
context.report({
|
||
|
node: node,
|
||
|
message: errors[node.type] });
|
||
|
|
||
|
});
|
||
|
|
||
|
// Report multiple `module.exports` assignments (CommonJS)
|
||
|
if (nodes.commonjs.set.size > 1) {
|
||
|
nodes.commonjs.set.forEach(function (node) {
|
||
|
context.report({
|
||
|
node: node,
|
||
|
message: errors[node.type] });
|
||
|
|
||
|
});
|
||
|
}
|
||
|
}return onExit;}() };
|
||
|
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
meta: meta,
|
||
|
create: create };
|
||
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9ncm91cC1leHBvcnRzLmpzIl0sIm5hbWVzIjpbIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsImVycm9ycyIsIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iLCJBc3NpZ25tZW50RXhwcmVzc2lvbiIsImFjY2Vzc29yQ2hhaW4iLCJub2RlIiwiY2hhaW4iLCJ1bnNoaWZ0IiwicHJvcGVydHkiLCJuYW1lIiwib2JqZWN0IiwiY3JlYXRlIiwiY29udGV4dCIsIm5vZGVzIiwibW9kdWxlcyIsInNldCIsIlNldCIsInNvdXJjZXMiLCJ0eXBlcyIsImNvbW1vbmpzIiwidGFyZ2V0IiwiZXhwb3J0S2luZCIsInNvdXJjZSIsImFkZCIsIkFycmF5IiwiaXNBcnJheSIsInZhbHVlIiwicHVzaCIsImxlZnQiLCJsZW5ndGgiLCJvbkV4aXQiLCJzaXplIiwiZm9yRWFjaCIsInJlcG9ydCIsIm1lc3NhZ2UiLCJmaWx0ZXIiLCJub2Rlc1dpdGhTb3VyY2UiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiYUFBQSxxQztBQUNBLHVDO0FBQ0Esc0Q7O0FBRUEsSUFBTUEsT0FBTztBQUNYQyxRQUFNLFlBREs7QUFFWEMsUUFBTTtBQUNKQyxTQUFLLDBCQUFRLGVBQVIsQ0FERCxFQUZLLEVBQWI7OztBQU1BO0FBQ0EsSUFBTUMsU0FBUztBQUNiQywwQkFBd0Isb0dBRFg7QUFFYkMsd0JBQXNCLGlHQUZULEVBQWY7O0FBSUE7O0FBRUE7Ozs7Ozs7Ozs7OztBQVlBLFNBQVNDLGFBQVQsQ0FBdUJDLElBQXZCLEVBQTZCO0FBQzNCLE1BQU1DLFFBQVEsRUFBZDs7QUFFQSxLQUFHO0FBQ0RBLFVBQU1DLE9BQU4sQ0FBY0YsS0FBS0csUUFBTCxDQUFjQyxJQUE1Qjs7QUFFQSxRQUFJSixLQUFLSyxNQUFMLENBQVlaLElBQVosS0FBcUIsWUFBekIsRUFBdUM7QUFDckNRLFlBQU1DLE9BQU4sQ0FBY0YsS0FBS0ssTUFBTCxDQUFZRCxJQUExQjtBQUNBO0FBQ0Q7O0FBRURKLFdBQU9BLEtBQUtLLE1BQVo7QUFDRCxHQVRELFFBU1NMLEtBQUtQLElBQUwsS0FBYyxrQkFUdkI7O0FBV0EsU0FBT1EsS0FBUDtBQUNEOztBQUVELFNBQVNLLE1BQVQsQ0FBZ0JDLE9BQWhCLEVBQXlCO0FBQ3ZCLE1BQU1DLFFBQVE7QUFDWkMsYUFBUztBQUNQQyxXQUFLLElBQUlDLEdBQUosRUFERTtBQUVQQyxlQUFTLEVBRkYsRUFERzs7QUFLWkMsV0FBTztBQUNMSCxXQUFLLElBQUlDLEdBQUosRUFEQTtBQUVMQyxlQUFTLEVBRkosRUFMSzs7QUFTWkUsY0FBVTtBQUNSSixXQUFLLElBQUlDLEdBQUosRUFERyxFQVRFLEVBQWQ7Ozs7QUFjQSxTQUFPO0FBQ0xkLDBCQURLLCtDQUNrQkcsSUFEbEIsRUFDd0I7QUFDM0IsWUFBTWUsU0FBU2YsS0FBS2dCLFVBQUwsS0FBb0IsTUFBcEIsR0FBNkJSLE1BQU1LLEtBQW5DLEdBQTJDTCxNQUFNQyxPQUFoRTtBQUNBLFlBQUksQ0FBQ1QsS0FBS2lCLE1BQVYsRUFBa0I7QUFDaEJGLGlCQUFPTCxHQUFQLENBQVdRLEdBQVgsQ0FBZWxCLElBQWY7QUFDRCxTQUZELE1BRU8sSUFBSW1CLE1BQU1DLE9BQU4sQ0FBY0wsT0FBT0gsT0FBUCxDQUFlWixLQUFLaUIsTUFBTCxDQUFZSSxLQUEzQixDQUFkLENBQUosRUFBc0Q7QUFDM0ROLGlCQUFPSCxPQUFQLENBQWVaLEtBQUtpQixNQUFMLENBQVlJLEtBQTNCLEVBQWtDQyxJQUFsQyxDQUF1Q3RCLElBQXZDO0FBQ0QsU0FGTSxNQUVBO0FBQ0xlLGlCQUFPSCxPQUFQLENBQWVaLEtBQUtpQixNQUFMLENBQVlJLEtBQTNCLElBQW9DLENBQUNyQixJQUFELENBQXBDO0FBQ0Q7QUFDRixPQVZJOztBQVlMRix3QkFaSyw2Q0FZZ0JFLElBWmhCLEVBWXNCO0FBQ3pCLFlBQUlBLEtBQUt1QixJQUFMLENBQVU5QixJQUFWLEtBQW1CLGtCQUF2QixFQUEyQztBQUN6QztBQUNEOztBQUVELFlBQU1RLFFBQVFGLGNBQWNDLEtBQUt1QixJQUFuQixDQUFkOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQUl0QixNQUFNLENBQU4sTUFBYSxRQUFiLElBQXlCQSxNQUFNLENBQU4sTUFBYSxTQUF0QyxJQUFtREEsTUFBTXVCLE1BQU4sSUFBZ0IsQ0FBdkUsRUFBMEU7QUFDeEVoQixnQkFBTU0sUUFBTixDQUFlSixHQUFmLENBQW1CUSxHQUFuQixDQUF1QmxCLElBQXZCO0FBQ0E7QUFDRDs7QUFFRDtBQUNBLFlBQUlDLE1BQU0sQ0FBTixNQUFhLFNBQWIsSUFBMEJBLE1BQU11QixNQUFOLEtBQWlCLENBQS9DLEVBQWtEO0FBQ2hEaEIsZ0JBQU1NLFFBQU4sQ0FBZUosR0FBZixDQUFtQlEsR0FBbkIsQ0FBdUJsQixJQUF2QjtBQUNBO0FBQ0Q7QUFDRixPQWhDSTs7QUFrQ0wsaUNBQWdCLFNBQVN5QixNQUFULEdBQWtCO0FBQ2hDO0FBQ0EsWUFBSWpCLE1BQU1DLE9BQU4sQ0FBY0MsR0FBZCxDQUFrQmdCLElBQWxCLEdBQXlCLENBQTdCLEVBQWdDO0FBQzlCbEIsZ0JBQU1DLE9BQU4sQ0FBY0MsR0FBZCxDQUFrQmlCLE9BQWxCLENBQTBCLGdCQUFRO0FBQ2hDcEIsb0JBQVFxQixNQUFSLENBQWU7QUFDYjVCLHdCQURhO0FBRWI2Qix1QkFBU2pDLE9BQU9JLEtBQUtQLElBQVosQ0FGSSxFQUFmOztBQUlELFdBTEQ7QUFNRDs7QUFFRDtBQUNBLHlDQUFLLHlCQUFPZSxNQUFNQyxPQUFOLENBQWNHLE9BQXJCO0FBQ0ZrQixjQURFLENBQ0ssbUNBQW1CWCxNQUFNQyxPQUFOLENBQWNXLGVBQWQsS0FBa0NBLGdCQUFnQlAsTUFBaEIsR0FBeUIsQ0FBOUUsRUFETCxDQUFMO0FBRUdHLGVBRkgsQ0FFVyxVQUFDM0IsSUFBRCxFQUFVO0FBQ2pCTyxrQkFBUXFCLE1BQVIsQ0FBZTtBQUNiNUIsc0JBRGE7QUFFYjZCLHFCQUFTakMsT0FBT0ksS0FBS1AsSUFBWixDQUZJLEVBQWY7O0FBSUQsU0FQSDs7QUFTQTtBQUNBLFlBQUllLE1BQU1LLEtBQU4sQ0FBWUgsR0FBWixDQUFnQmdCLElBQWhCLEdBQXVCLENBQTNCLEVBQThCO0FBQzVCbEIsZ0JBQU1LLEtBQU4sQ0FBWUgsR0FBWixDQUFnQmlCLE9BQWhCLENBQXdCLGdCQUFRO0FBQzlCcEIsb0JBQVFxQixNQUFSLENBQWU7QUFDYjVCLHdCQURhO0FBRWI2Qix1QkFBU2pDLE9BQU9JLEtBQUtQLElBQVosQ0FGSSxFQUFmOztBQUlELFdBTEQ7QUFNRDs7QUFFRDtBQUNBLHlDQUFLLHlCQUFPZSxNQUFNSyxLQUFOLENBQVlELE9BQW5CO0FBQ0ZrQixjQURFLENBQ0ssbUNBQW1CWCxNQUFNQyxPQUFOLENBQWNXLGVBQWQsS0FBa0NBLGdCQUFnQlAsTUFBaEIsR0F
|