webhook/node_modules/eslint-plugin-import/lib/rules/export.js

228 lines
30 KiB
JavaScript
Raw Normal View History

'use strict';var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}();var _ExportMap = require('../ExportMap');var _ExportMap2 = _interopRequireDefault(_ExportMap);
var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);
2022-11-10 11:43:16 +01:00
var _arrayIncludes = require('array-includes');var _arrayIncludes2 = _interopRequireDefault(_arrayIncludes);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { 'default': obj };}
/*
2022-11-10 11:43:16 +01:00
Notes on TypeScript namespaces aka TSModuleDeclaration:
There are two forms:
- active namespaces: namespace Foo {} / module Foo {}
- ambient modules; declare module "eslint-plugin-import" {}
active namespaces:
- cannot contain a default export
- cannot contain an export all
- cannot contain a multi name export (export { a, b })
- can have active namespaces nested within them
ambient namespaces:
- can only be defined in .d.ts files
- cannot be nested within active namespaces
- have no other restrictions
*/
var rootProgram = 'root';
var tsTypePrefix = 'type:';
/**
2022-11-10 11:43:16 +01:00
* Detect function overloads like:
* ```ts
* export function foo(a: number);
* export function foo(a: string);
* export function foo(a: number|string) { return a; }
* ```
* @param {Set<Object>} nodes
* @returns {boolean}
*/
function isTypescriptFunctionOverloads(nodes) {
2022-11-10 11:43:16 +01:00
var types = new Set(Array.from(nodes, function (node) {return node.parent.type;}));
return types.has('TSDeclareFunction') && (
2022-11-10 11:43:16 +01:00
types.size === 1 ||
types.size === 2 && types.has('FunctionDeclaration'));
2022-11-10 11:43:16 +01:00
}
/**
* Detect merging Namespaces with Classes, Functions, or Enums like:
* ```ts
* export class Foo { }
* export namespace Foo { }
* ```
* @param {Set<Object>} nodes
* @returns {boolean}
*/
function isTypescriptNamespaceMerging(nodes) {
var types = new Set(Array.from(nodes, function (node) {return node.parent.type;}));
var noNamespaceNodes = Array.from(nodes).filter(function (node) {return node.parent.type !== 'TSModuleDeclaration';});
return types.has('TSModuleDeclaration') && (
types.size === 1
// Merging with functions
|| types.size === 2 && (types.has('FunctionDeclaration') || types.has('TSDeclareFunction')) ||
types.size === 3 && types.has('FunctionDeclaration') && types.has('TSDeclareFunction')
// Merging with classes or enums
|| types.size === 2 && (types.has('ClassDeclaration') || types.has('TSEnumDeclaration')) && noNamespaceNodes.length === 1);
}
/**
* Detect if a typescript namespace node should be reported as multiple export:
* ```ts
* export class Foo { }
* export function Foo();
* export namespace Foo { }
* ```
* @param {Object} node
* @param {Set<Object>} nodes
* @returns {boolean}
*/
function shouldSkipTypescriptNamespace(node, nodes) {
var types = new Set(Array.from(nodes, function (node) {return node.parent.type;}));
return !isTypescriptNamespaceMerging(nodes) &&
node.parent.type === 'TSModuleDeclaration' && (
types.has('TSEnumDeclaration') ||
types.has('ClassDeclaration') ||
types.has('FunctionDeclaration') ||
types.has('TSDeclareFunction'));
}
module.exports = {
meta: {
type: 'problem',
docs: {
2022-11-10 11:43:16 +01:00
url: (0, _docsUrl2['default'])('export') },
schema: [] },
2022-11-10 11:43:16 +01:00
create: function () {function create(context) {
var namespace = new Map([[rootProgram, new Map()]]);
2022-11-10 11:43:16 +01:00
function addNamed(name, node, parent, isType) {
if (!namespace.has(parent)) {
namespace.set(parent, new Map());
}
var named = namespace.get(parent);
2022-11-10 11:43:16 +01:00
var key = isType ? '' + tsTypePrefix + String(name) : name;
var nodes = named.get(key);
if (nodes == null) {
nodes = new Set();
named.set(key, nodes);
}
2022-11-10 11:43:16 +01:00
nodes.add(node);
}
2022-11-10 11:43:16 +01:00
function getParent(node) {
if (node.parent && node.parent.type === 'TSModuleBlock') {
return node.parent.parent;
}
2022-11-10 11:43:16 +01:00
// just in case somehow a non-ts namespace export declaration isn't directly
// parented to the root Program node
return rootProgram;
}
2022-11-10 11:43:16 +01:00
return {
ExportDefaultDeclaration: function () {function ExportDefaultDeclaration(node) {
addNamed('default', node, getParent(node));
}return ExportDefaultDeclaration;}(),
2022-11-10 11:43:16 +01:00
ExportSpecifier: function () {function ExportSpecifier(node) {
addNamed(
node.exported.name || node.exported.value,
node.exported,
getParent(node.parent));
2022-11-10 11:43:16 +01:00
}return ExportSpecifier;}(),
2022-11-10 11:43:16 +01:00
ExportNamedDeclaration: function () {function ExportNamedDeclaration(node) {
if (node.declaration == null) return;
2022-11-10 11:43:16 +01:00
var parent = getParent(node);
// support for old TypeScript versions
var isTypeVariableDecl = node.declaration.kind === 'type';
2022-11-10 11:43:16 +01:00
if (node.declaration.id != null) {
if ((0, _arrayIncludes2['default'])([
'TSTypeAliasDeclaration',
'TSInterfaceDeclaration'],
node.declaration.type)) {
addNamed(node.declaration.id.name, node.declaration.id, parent, true);
} else {
addNamed(node.declaration.id.name, node.declaration.id, parent, isTypeVariableDecl);
}
}
2022-11-10 11:43:16 +01:00
if (node.declaration.declarations != null) {var _iteratorNormalCompletion = true;var _didIteratorError = false;var _iteratorError = undefined;try {
for (var _iterator = node.declaration.declarations[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {var declaration = _step.value;
(0, _ExportMap.recursivePatternCapture)(declaration.id, function (v) {return (
addNamed(v.name, v, parent, isTypeVariableDecl));});
}} catch (err) {_didIteratorError = true;_iteratorError = err;} finally {try {if (!_iteratorNormalCompletion && _iterator['return']) {_iterator['return']();}} finally {if (_didIteratorError) {throw _iteratorError;}}}
}
}return ExportNamedDeclaration;}(),
2022-11-10 11:43:16 +01:00
ExportAllDeclaration: function () {function ExportAllDeclaration(node) {
if (node.source == null) return; // not sure if this is ever true
2022-11-10 11:43:16 +01:00
// `export * as X from 'path'` does not conflict
if (node.exported && node.exported.name) return;
2022-11-10 11:43:16 +01:00
var remoteExports = _ExportMap2['default'].get(node.source.value, context);
if (remoteExports == null) return;
2022-11-10 11:43:16 +01:00
if (remoteExports.errors.length) {
remoteExports.reportErrors(context, node);
return;
}
var parent = getParent(node);
2022-11-10 11:43:16 +01:00
var any = false;
remoteExports.forEach(function (v, name) {
if (name !== 'default') {
any = true; // poor man's filter
addNamed(name, node, parent);
}
});
2022-11-10 11:43:16 +01:00
if (!any) {
context.report(
node.source, 'No named exports found in module \'' + String(
node.source.value) + '\'.');
2022-11-10 11:43:16 +01:00
}
}return ExportAllDeclaration;}(),
2022-11-10 11:43:16 +01:00
'Program:exit': function () {function ProgramExit() {var _iteratorNormalCompletion2 = true;var _didIteratorError2 = false;var _iteratorError2 = undefined;try {
for (var _iterator2 = namespace[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {var _ref = _step2.value;var _ref2 = _slicedToArray(_ref, 2);var named = _ref2[1];var _iteratorNormalCompletion3 = true;var _didIteratorError3 = false;var _iteratorError3 = undefined;try {
for (var _iterator3 = named[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {var _ref3 = _step3.value;var _ref4 = _slicedToArray(_ref3, 2);var name = _ref4[0];var nodes = _ref4[1];
if (nodes.size <= 1) continue;
2022-11-10 11:43:16 +01:00
if (isTypescriptFunctionOverloads(nodes) || isTypescriptNamespaceMerging(nodes)) continue;var _iteratorNormalCompletion4 = true;var _didIteratorError4 = false;var _iteratorError4 = undefined;try {
2022-11-10 11:43:16 +01:00
for (var _iterator4 = nodes[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {var node = _step4.value;
if (shouldSkipTypescriptNamespace(node, nodes)) continue;
2022-11-10 11:43:16 +01:00
if (name === 'default') {
context.report(node, 'Multiple default exports.');
} else {
context.report(
node, 'Multiple exports of name \'' + String(
name.replace(tsTypePrefix, '')) + '\'.');
2022-11-10 11:43:16 +01:00
}
}} catch (err) {_didIteratorError4 = true;_iteratorError4 = err;} finally {try {if (!_iteratorNormalCompletion4 && _iterator4['return']) {_iterator4['return']();}} finally {if (_didIteratorError4) {throw _iteratorError4;}}}
}} catch (err) {_didIteratorError3 = true;_iteratorError3 = err;} finally {try {if (!_iteratorNormalCompletion3 && _iterator3['return']) {_iterator3['return']();}} finally {if (_didIteratorError3) {throw _iteratorError3;}}}
}} catch (err) {_didIteratorError2 = true;_iteratorError2 = err;} finally {try {if (!_iteratorNormalCompletion2 && _iterator2['return']) {_iterator2['return']();}} finally {if (_didIteratorError2) {throw _iteratorError2;}}}
}return ProgramExit;}() };
2022-11-10 11:43:16 +01:00
}return create;}() };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9leHBvcnQuanMiXSwibmFtZXMiOlsicm9vdFByb2dyYW0iLCJ0c1R5cGVQcmVmaXgiLCJpc1R5cGVzY3JpcHRGdW5jdGlvbk92ZXJsb2FkcyIsIm5vZGVzIiwidHlwZXMiLCJTZXQiLCJBcnJheSIsImZyb20iLCJub2RlIiwicGFyZW50IiwidHlwZSIsImhhcyIsInNpemUiLCJpc1R5cGVzY3JpcHROYW1lc3BhY2VNZXJnaW5nIiwibm9OYW1lc3BhY2VOb2RlcyIsImZpbHRlciIsImxlbmd0aCIsInNob3VsZFNraXBUeXBlc2NyaXB0TmFtZXNwYWNlIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwiY3JlYXRlIiwiY29udGV4dCIsIm5hbWVzcGFjZSIsIk1hcCIsImFkZE5hbWVkIiwibmFtZSIsImlzVHlwZSIsInNldCIsIm5hbWVkIiwiZ2V0Iiwia2V5IiwiYWRkIiwiZ2V0UGFyZW50IiwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uIiwiRXhwb3J0U3BlY2lmaWVyIiwiZXhwb3J0ZWQiLCJ2YWx1ZSIsIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iLCJkZWNsYXJhdGlvbiIsImlzVHlwZVZhcmlhYmxlRGVjbCIsImtpbmQiLCJpZCIsImRlY2xhcmF0aW9ucyIsInYiLCJFeHBvcnRBbGxEZWNsYXJhdGlvbiIsInNvdXJjZSIsInJlbW90ZUV4cG9ydHMiLCJFeHBvcnRNYXAiLCJlcnJvcnMiLCJyZXBvcnRFcnJvcnMiLCJhbnkiLCJmb3JFYWNoIiwicmVwb3J0IiwicmVwbGFjZSJdLCJtYXBwaW5ncyI6InFvQkFBQSx5QztBQUNBLHFDO0FBQ0EsK0M7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkEsSUFBTUEsY0FBYyxNQUFwQjtBQUNBLElBQU1DLGVBQWUsT0FBckI7O0FBRUE7Ozs7Ozs7Ozs7QUFVQSxTQUFTQyw2QkFBVCxDQUF1Q0MsS0FBdkMsRUFBOEM7QUFDNUMsTUFBTUMsUUFB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