mirror of
https://github.com/joelwmale/webhook-action.git
synced 2024-11-26 09:25:24 +01:00
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 };}
|
||
|
|
||
|
const meta = {
|
||
|
type: 'suggestion',
|
||
|
docs: {
|
||
|
url: (0, _docsUrl2.default)('group-exports') }
|
||
|
|
||
|
|
||
|
/* eslint-disable max-len */ };
|
||
|
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`'
|
||
|
|
||
|
/* 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) {
|
||
|
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) {
|
||
|
let 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);
|
||
|
|
||
|
// 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;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
'Program:exit': function onExit() {
|
||
|
// Report multiple `export` declarations (ES2015 modules)
|
||
|
if (nodes.modules.set.size > 1) {
|
||
|
nodes.modules.set.forEach(node => {
|
||
|
context.report({
|
||
|
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(nodesWithSource => Array.isArray(nodesWithSource) && nodesWithSource.length > 1)).
|
||
|
forEach(node => {
|
||
|
context.report({
|
||
|
node,
|
||
|
message: errors[node.type] });
|
||
|
|
||
|
});
|
||
|
|
||
|
// Report multiple `export type` declarations (FLOW ES2015 modules)
|
||
|
if (nodes.types.set.size > 1) {
|
||
|
nodes.types.set.forEach(node => {
|
||
|
context.report({
|
||
|
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(nodesWithSource => Array.isArray(nodesWithSource) && nodesWithSource.length > 1)).
|
||
|
forEach(node => {
|
||
|
context.report({
|
||
|
node,
|
||
|
message: errors[node.type] });
|
||
|
|
||
|
});
|
||
|
|
||
|
// Report multiple `module.exports` assignments (CommonJS)
|
||
|
if (nodes.commonjs.set.size > 1) {
|
||
|
nodes.commonjs.set.forEach(node => {
|
||
|
context.report({
|
||
|
node,
|
||
|
message: errors[node.type] });
|
||
|
|
||
|
});
|
||
|
}
|
||
|
} };
|
||
|
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
meta,
|
||
|
create };
|
||
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9ncm91cC1leHBvcnRzLmpzIl0sIm5hbWVzIjpbIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsImVycm9ycyIsIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iLCJBc3NpZ25tZW50RXhwcmVzc2lvbiIsImFjY2Vzc29yQ2hhaW4iLCJub2RlIiwiY2hhaW4iLCJ1bnNoaWZ0IiwicHJvcGVydHkiLCJuYW1lIiwib2JqZWN0IiwiY3JlYXRlIiwiY29udGV4dCIsIm5vZGVzIiwibW9kdWxlcyIsInNldCIsIlNldCIsInNvdXJjZXMiLCJ0eXBlcyIsImNvbW1vbmpzIiwidGFyZ2V0IiwiZXhwb3J0S2luZCIsInNvdXJjZSIsImFkZCIsIkFycmF5IiwiaXNBcnJheSIsInZhbHVlIiwicHVzaCIsImxlZnQiLCJsZW5ndGgiLCJvbkV4aXQiLCJzaXplIiwiZm9yRWFjaCIsInJlcG9ydCIsIm1lc3NhZ2UiLCJmaWx0ZXIiLCJub2Rlc1dpdGhTb3VyY2UiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiYUFBQSxxQztBQUNBLHVDO0FBQ0Esc0Q7O0FBRUEsTUFBTUEsT0FBTztBQUNYQyxRQUFNLFlBREs7QUFFWEMsUUFBTTtBQUNKQyxTQUFLLHVCQUFRLGVBQVIsQ0FERDs7O0FBSVIsOEJBTmEsRUFBYjtBQU9BLE1BQU1DLFNBQVM7QUFDYkMsMEJBQXdCLG9HQURYO0FBRWJDLHdCQUFzQjs7QUFFeEI7O0FBRUE7Ozs7Ozs7Ozs7O2lDQU5lLEVBQWY7QUFrQkEsU0FBU0MsYUFBVCxDQUF1QkMsSUFBdkIsRUFBNkI7QUFDM0IsUUFBTUMsUUFBUSxFQUFkOztBQUVBLEtBQUc7QUFDREEsVUFBTUMsT0FBTixDQUFjRixLQUFLRyxRQUFMLENBQWNDLElBQTVCOztBQUVBLFFBQUlKLEtBQUtLLE1BQUwsQ0FBWVosSUFBWixLQUFxQixZQUF6QixFQUF1QztBQUNyQ1EsWUFBTUMsT0FBTixDQUFjRixLQUFLSyxNQUFMLENBQVlELElBQTFCO0FB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
|