123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- '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 };}
- const meta = {
- type: 'suggestion',
- docs: {
- url: (0, _docsUrl2.default)('group-exports') } };
- const 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`' };
- function accessorChain(node) {
- const 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) {
- const nodes = {
- modules: {
- set: new Set(),
- sources: {} },
- types: {
- set: new Set(),
- sources: {} },
- commonjs: {
- set: new Set() } };
- return {
- ExportNamedDeclaration(node) {
- const 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];
- }
- },
- AssignmentExpression(node) {
- if (node.left.type !== 'MemberExpression') {
- return;
- }
- const chain = accessorChain(node.left);
-
-
-
- if (chain[0] === 'module' && chain[1] === 'exports' && chain.length <= 3) {
- nodes.commonjs.set.add(node);
- return;
- }
-
- if (chain[0] === 'exports' && chain.length === 2) {
- nodes.commonjs.set.add(node);
- return;
- }
- },
- 'Program:exit': function onExit() {
-
- if (nodes.modules.set.size > 1) {
- nodes.modules.set.forEach(node => {
- context.report({
- node,
- message: errors[node.type] });
- });
- }
-
- (0, _arrayPrototype2.default)((0, _object2.default)(nodes.modules.sources).
- filter(nodesWithSource => Array.isArray(nodesWithSource) && nodesWithSource.length > 1)).
- forEach(node => {
- context.report({
- node,
- message: errors[node.type] });
- });
-
- if (nodes.types.set.size > 1) {
- nodes.types.set.forEach(node => {
- context.report({
- node,
- message: errors[node.type] });
- });
- }
-
- (0, _arrayPrototype2.default)((0, _object2.default)(nodes.types.sources).
- filter(nodesWithSource => Array.isArray(nodesWithSource) && nodesWithSource.length > 1)).
- forEach(node => {
- context.report({
- node,
- message: errors[node.type] });
- });
-
- if (nodes.commonjs.set.size > 1) {
- nodes.commonjs.set.forEach(node => {
- context.report({
- node,
- message: errors[node.type] });
- });
- }
- } };
- }
- module.exports = {
- meta,
- create };
|