123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- 'use strict';
- var _minimatch = require('minimatch');var _minimatch2 = _interopRequireDefault(_minimatch);
- var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { 'default': obj };}
- module.exports = { meta: { type: 'suggestion',
- docs: {
- category: 'Style guide',
- description: 'Forbid namespace (a.k.a. "wildcard" `*`) imports.',
- url: (0, _docsUrl2['default'])('no-namespace') },
- fixable: 'code',
- schema: [{
- type: 'object',
- properties: {
- ignore: {
- type: 'array',
- items: {
- type: 'string' },
- uniqueItems: true } } }] },
- create: function () {function create(context) {
- var firstOption = context.options[0] || {};
- var ignoreGlobs = firstOption.ignore;
- return {
- ImportNamespaceSpecifier: function () {function ImportNamespaceSpecifier(node) {
- if (ignoreGlobs && ignoreGlobs.find(function (glob) {return (0, _minimatch2['default'])(node.parent.source.value, glob, { matchBase: true });})) {
- return;
- }
- var scopeVariables = context.getScope().variables;
- var namespaceVariable = scopeVariables.find(function (variable) {return variable.defs[0].node === node;});
- var namespaceReferences = namespaceVariable.references;
- var namespaceIdentifiers = namespaceReferences.map(function (reference) {return reference.identifier;});
- var canFix = namespaceIdentifiers.length > 0 && !usesNamespaceAsObject(namespaceIdentifiers);
- context.report({
- node: node,
- message: 'Unexpected namespace import.',
- fix: canFix && function (fixer) {
- var scopeManager = context.getSourceCode().scopeManager;
- var fixes = [];
-
-
- var importNameConflicts = {};
- namespaceIdentifiers.forEach(function (identifier) {
- var parent = identifier.parent;
- if (parent && parent.type === 'MemberExpression') {
- var importName = getMemberPropertyName(parent);
- var localConflicts = getVariableNamesInScope(scopeManager, parent);
- if (!importNameConflicts[importName]) {
- importNameConflicts[importName] = localConflicts;
- } else {
- localConflicts.forEach(function (c) {return importNameConflicts[importName].add(c);});
- }
- }
- });
-
- var importNames = Object.keys(importNameConflicts);
- var importLocalNames = generateLocalNames(
- importNames,
- importNameConflicts,
- namespaceVariable.name);
-
- var namedImportSpecifiers = importNames.map(function (importName) {return importName === importLocalNames[importName] ?
- importName : String(
- importName) + ' as ' + String(importLocalNames[importName]);});
- fixes.push(fixer.replaceText(node, '{ ' + String(namedImportSpecifiers.join(', ')) + ' }'));
-
- namespaceIdentifiers.forEach(function (identifier) {
- var parent = identifier.parent;
- if (parent && parent.type === 'MemberExpression') {
- var importName = getMemberPropertyName(parent);
- fixes.push(fixer.replaceText(parent, importLocalNames[importName]));
- }
- });
- return fixes;
- } });
- }return ImportNamespaceSpecifier;}() };
- }return create;}() };
- function usesNamespaceAsObject(namespaceIdentifiers) {
- return !namespaceIdentifiers.every(function (identifier) {
- var parent = identifier.parent;
-
- return (
- parent &&
- parent.type === 'MemberExpression' && (
- parent.property.type === 'Identifier' || parent.property.type === 'Literal'));
- });
- }
- function getMemberPropertyName(memberExpression) {
- return memberExpression.property.type === 'Identifier' ?
- memberExpression.property.name :
- memberExpression.property.value;
- }
- function getVariableNamesInScope(scopeManager, node) {
- var currentNode = node;
- var scope = scopeManager.acquire(currentNode);
- while (scope == null) {
- currentNode = currentNode.parent;
- scope = scopeManager.acquire(currentNode, true);
- }
- return new Set(scope.variables.concat(scope.upper.variables).map(function (variable) {return variable.name;}));
- }
- function generateLocalNames(names, nameConflicts, namespaceName) {
- var localNames = {};
- names.forEach(function (name) {
- var localName = void 0;
- if (!nameConflicts[name].has(name)) {
- localName = name;
- } else if (!nameConflicts[name].has(String(namespaceName) + '_' + String(name))) {
- localName = String(namespaceName) + '_' + String(name);
- } else {
- for (var i = 1; i < Infinity; i++) {
- if (!nameConflicts[name].has(String(namespaceName) + '_' + String(name) + '_' + String(i))) {
- localName = String(namespaceName) + '_' + String(name) + '_' + String(i);
- break;
- }
- }
- }
- localNames[name] = localName;
- });
- return localNames;
- }
|