no-import-module-exports.js 12 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. 'use strict';var _minimatch = require('minimatch');var _minimatch2 = _interopRequireDefault(_minimatch);
  2. var _path = require('path');var _path2 = _interopRequireDefault(_path);
  3. var _pkgUp = require('eslint-module-utils/pkgUp');var _pkgUp2 = _interopRequireDefault(_pkgUp);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { 'default': obj };}
  4. function getEntryPoint(context) {
  5. var pkgPath = (0, _pkgUp2['default'])({ cwd: context.getPhysicalFilename ? context.getPhysicalFilename() : context.getFilename() });
  6. try {
  7. return require.resolve(_path2['default'].dirname(pkgPath));
  8. } catch (error) {
  9. // Assume the package has no entrypoint (e.g. CLI packages)
  10. // in which case require.resolve would throw.
  11. return null;
  12. }
  13. }
  14. function findScope(context, identifier) {var _context$getSourceCod =
  15. context.getSourceCode(),scopeManager = _context$getSourceCod.scopeManager;
  16. return scopeManager && scopeManager.scopes.slice().reverse().find(function (scope) {return scope.variables.some(function (variable) {return variable.identifiers.some(function (node) {return node.name === identifier;});});});
  17. }
  18. function findDefinition(objectScope, identifier) {
  19. var variable = objectScope.variables.find(function (variable) {return variable.name === identifier;});
  20. return variable.defs.find(function (def) {return def.name.name === identifier;});
  21. }
  22. module.exports = {
  23. meta: {
  24. type: 'problem',
  25. docs: {
  26. category: 'Module systems',
  27. description: 'Forbid import statements with CommonJS module.exports.',
  28. recommended: true },
  29. fixable: 'code',
  30. schema: [
  31. {
  32. 'type': 'object',
  33. 'properties': {
  34. 'exceptions': { 'type': 'array' } },
  35. 'additionalProperties': false }] },
  36. create: function () {function create(context) {
  37. var importDeclarations = [];
  38. var entryPoint = getEntryPoint(context);
  39. var options = context.options[0] || {};
  40. var alreadyReported = false;
  41. function report(node) {
  42. var fileName = context.getPhysicalFilename ? context.getPhysicalFilename() : context.getFilename();
  43. var isEntryPoint = entryPoint === fileName;
  44. var isIdentifier = node.object.type === 'Identifier';
  45. var hasKeywords = /^(module|exports)$/.test(node.object.name);
  46. var objectScope = hasKeywords && findScope(context, node.object.name);
  47. var variableDefinition = objectScope && findDefinition(objectScope, node.object.name);
  48. var isImportBinding = variableDefinition && variableDefinition.type === 'ImportBinding';
  49. var hasCJSExportReference = hasKeywords && (!objectScope || objectScope.type === 'module');
  50. var isException = !!options.exceptions && options.exceptions.some(function (glob) {return (0, _minimatch2['default'])(fileName, glob);});
  51. if (isIdentifier && hasCJSExportReference && !isEntryPoint && !isException && !isImportBinding) {
  52. importDeclarations.forEach(function (importDeclaration) {
  53. context.report({
  54. node: importDeclaration,
  55. message: 'Cannot use import declarations in modules that export using ' + 'CommonJS (module.exports = \'foo\' or exports.bar = \'hi\')' });
  56. });
  57. alreadyReported = true;
  58. }
  59. }
  60. return {
  61. ImportDeclaration: function () {function ImportDeclaration(node) {
  62. importDeclarations.push(node);
  63. }return ImportDeclaration;}(),
  64. MemberExpression: function () {function MemberExpression(node) {
  65. if (!alreadyReported) {
  66. report(node);
  67. }
  68. }return MemberExpression;}() };
  69. }return create;}() };
  70. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1pbXBvcnQtbW9kdWxlLWV4cG9ydHMuanMiXSwibmFtZXMiOlsiZ2V0RW50cnlQb2ludCIsImNvbnRleHQiLCJwa2dQYXRoIiwiY3dkIiwiZ2V0UGh5c2ljYWxGaWxlbmFtZSIsImdldEZpbGVuYW1lIiwicmVxdWlyZSIsInJlc29sdmUiLCJwYXRoIiwiZGlybmFtZSIsImVycm9yIiwiZmluZFNjb3BlIiwiaWRlbnRpZmllciIsImdldFNvdXJjZUNvZGUiLCJzY29wZU1hbmFnZXIiLCJzY29wZXMiLCJzbGljZSIsInJldmVyc2UiLCJmaW5kIiwic2NvcGUiLCJ2YXJpYWJsZXMiLCJzb21lIiwidmFyaWFibGUiLCJpZGVudGlmaWVycyIsIm5vZGUiLCJuYW1lIiwiZmluZERlZmluaXRpb24iLCJvYmplY3RTY29wZSIsImRlZnMiLCJkZWYiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwiY2F0ZWdvcnkiLCJkZXNjcmlwdGlvbiIsInJlY29tbWVuZGVkIiwiZml4YWJsZSIsInNjaGVtYSIsImNyZWF0ZSIsImltcG9ydERlY2xhcmF0aW9ucyIsImVudHJ5UG9pbnQiLCJvcHRpb25zIiwiYWxyZWFkeVJlcG9ydGVkIiwicmVwb3J0IiwiZmlsZU5hbWUiLCJpc0VudHJ5UG9pbnQiLCJpc0lkZW50aWZpZXIiLCJvYmplY3QiLCJoYXNLZXl3b3JkcyIsInRlc3QiLCJ2YXJpYWJsZURlZmluaXRpb24iLCJpc0ltcG9ydEJpbmRpbmciLCJoYXNDSlNFeHBvcnRSZWZlcmVuY2UiLCJpc0V4Y2VwdGlvbiIsImV4Y2VwdGlvbnMiLCJnbG9iIiwiZm9yRWFjaCIsImltcG9ydERlY2xhcmF0aW9uIiwibWVzc2FnZSIsIkltcG9ydERlY2xhcmF0aW9uIiwicHVzaCIsIk1lbWJlckV4cHJlc3Npb24iXSwibWFwcGluZ3MiOiJhQUFBLHNDO0FBQ0EsNEI7QUFDQSxrRDs7QUFFQSxTQUFTQSxhQUFULENBQXVCQyxPQUF2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QixRQUFyRCxDQUE5QjtBQUNBLFlBQU1zQixjQUFjLENBQUMsQ0FBQ1osUUFBUWEsVUFBVixJQUF3QmIsUUFBUWEsVUFBUixDQUFtQm5DLElBQW5CLENBQXdCLHdCQUFRLDRCQUFVeUIsUUFBVixFQUFvQlcsSUFBcEIsQ0FBUixFQUF4QixDQUE1Qzs7QUFFQSxZQUFJVCxnQkFBZ0JNLHFCQUFoQixJQUF5QyxDQUFDUCxZQUExQyxJQUEwRCxDQUFDUSxXQUEzRCxJQUEwRSxDQUFDRixlQUEvRSxFQUFnRztBQUM5RlosNkJBQW1CaUIsT0FBbkIsQ0FBMkIsNkJBQXFCO0FBQzlDekQsb0JBQVE0QyxNQUFSLENBQWU7QUFDYnJCLG9CQUFNbUMsaUJBRE87QUFFYkMsdUJBQVMsOEhBRkksRUFBZjs7O0FBS0QsV0FORDtBQU9BaEIsNEJBQWtCLElBQWxCO0FBQ0Q7QUFDRjs7QUFFRCxhQUFPO0FBQ0xpQix5QkFESywwQ0FDYXJDLElBRGIsRUFDbUI7QUFDdEJpQiwrQkFBbUJxQixJQUFuQixDQUF3QnRDLElBQXhCO0FBQ0QsV0FISTtBQUlMdUMsd0JBSksseUNBSVl2QyxJQUpaLEVBSWtCO0FBQ3JCLGdCQUFJLENBQUNvQixlQUFMLEVBQXNCO0FBQ3BCQyxxQkFBT3JCLElBQVA7QUFDRDtBQUNGLFdBUkksNkJBQVA7O0FBVUQsS0ExRGMsbUJBQWpCIiwiZmlsZSI6Im5vLWltcG9ydC1tb2R1bGUtZXhwb3J0cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtaW5pbWF0Y2ggZnJvbSAnbWluaW1hdGNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHBrZ1VwIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvcGtnVXAnO1xuXG5mdW5jdGlvbiBnZXRFbnRyeVBvaW50KGNvbnRleHQpIHtcbiAgY29uc3QgcGtnUGF0aCA9IHBrZ1VwKHsgY3dkOiBjb250ZXh0LmdldFBoeXNpY2FsRmlsZW5hbWUgPyBjb250ZXh0LmdldFBoeXNpY2FsRmlsZW5hbWUoKSA6IGNvbnRleHQuZ2V0RmlsZW5hbWUoKSB9KTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZS5yZXNvbHZlKHBhdGguZGlybmFtZShwa2dQYXRoKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQXNzdW1lIHRoZSBwYWNrYWdlIGhhcyBubyBlbnRyeXBvaW50IChlLmcuIENMSSBwYWNrYWdlcylcbiAgICAvLyBpbiB3aGljaCBjYXNlIHJlcXVpcmUucmVzb2x2ZSB3b3VsZCB0aHJvdy5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kU2NvcGUoY29udGV4dCwgaWRlbnRpZmllcikge1xuICBjb25zdCB7IHNjb3BlTWFuYWdlciB9ID0gY29udGV4dC5nZXRTb3VyY2VDb2RlKCk7XG5cbiAgcmV0dXJuIHNjb3BlTWFuYWdlciAmJiBzY29wZU1hbmFnZXIuc2NvcGVzLnNsaWNlKCkucmV2ZXJzZSgpLmZpbmQoKHNjb3BlKSA9PiBzY29wZS52YXJpYWJsZXMuc29tZSh2YXJpYWJsZSA9PiB2YXJpYWJsZS5pZGVudGlmaWVycy5zb21lKChub2RlKSA9PiBub2RlLm5hbWUgPT09IGlkZW50aWZpZXIpKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmREZWZpbml0aW9uKG9iamVjdFNjb3BlLCBpZGVudGlmaWVyKSB7XG4gIGNvbnN0IHZhcmlhYmxlID0gb2JqZWN0U2NvcGUudmFyaWFibGVzLmZpbmQodmFyaWFibGUgPT4gdmFyaWFibGUubmFtZSA9PT0gaWRlbnRpZmllcik7XG4gIHJldHVybiB2YXJpYWJsZS5kZWZzLmZpbmQoZGVmID0+IGRlZi5uYW1lLm5hbWUgPT09IGlkZW50aWZpZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICBkb2NzOiB7XG4gICAgICBjYXRlZ29yeTogJ01vZHVsZSBzeXN0ZW1zJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRm9yYmlkIGltcG9ydCBzdGF0ZW1lbnRzIHdpdGggQ29tbW9uSlMgbW9kdWxlLmV4cG9ydHMuJyxcbiAgICAgIHJlY29tbWVuZGVkOiB0cnVlLFxuICAgIH0sXG4gICAgZml4YWJsZTogJ2NvZGUnLFxuICAgIHNjaGVtYTogW1xuICAgICAge1xuICAgICAgICAndHlwZSc6ICdvYmplY3QnLFxuICAgICAgICAncHJvcGVydGllcyc6IHtcbiAgICAgICAgICAnZXhjZXB0aW9ucyc6IHsgJ3R5cGUnOiAnYXJyYXknIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdhZGRpdGlvbmFsUHJvcGVydGllcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBjcmVhdGUoY29udGV4dCkge1xuICAgIGNvbnN0IGltcG9ydERlY2xhcmF0aW9ucyA9IFtdO1xuICAgIGNvbnN0IGVudHJ5UG9pbnQgPSBnZXRFbnRyeVBvaW50KGNvbnRleHQpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnNbMF0gfHwge307XG4gICAgbGV0IGFscmVhZHlSZXBvcnRlZCA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gcmVwb3J0KG5vZGUpIHtcbiAgICAgIGNvbnN0IGZpbGVOYW1lID0gY29udGV4dC5nZXRQaHlzaWNhbEZpbGVuYW1lID8gY29udGV4dC5nZXRQaHlzaWNhbEZpbGVuYW1lKCkgOiBjb250ZXh0LmdldEZpbGVuYW1lKCk7XG4gICAgICBjb25zdCBpc0VudHJ5UG9pbnQgPSBlbnRyeVBvaW50ID09PSBmaWxlTmFtZTtcbiAgICAgIGNvbnN0IGlzSWRlbnRpZmllciA9IG5vZGUub2JqZWN0LnR5cGUgPT09ICdJZGVudGlmaWVyJztcbiAgICAgIGNvbnN0IGhhc0tleXdvcmRzID0gKC9eKG1vZHVsZXxleHBvcnRzKSQvKS50ZXN0KG5vZGUub2JqZWN0Lm5hbWUpO1xuICAgICAgY29uc3Qgb2JqZWN0U2NvcGUgPSBoYXNLZXl3b3JkcyAmJiBmaW5kU2NvcGUoY29udGV4dCwgbm9kZS5vYmplY3QubmFtZSk7XG4gICAgICBjb25zdCB2YXJpYWJsZURlZmluaXRpb24gPSBvYmplY3RTY29wZSAmJiBmaW5kRGVmaW5pdGlvbihvYmplY3RTY29wZSwgbm9kZS5vYmplY3QubmFtZSk7XG4gICAgICBjb25zdCBpc0ltcG9ydEJpbmRpbmcgPSB2YXJpYWJsZURlZmluaXRpb24gJiYgdmFyaWFibGVEZWZpbml0aW9uLnR5cGUgPT09ICdJbXBvcnRCaW5kaW5nJztcbiAgICAgIGNvbnN0IGhhc0NKU0V4cG9ydFJlZmVyZW5jZSA9IGhhc0tleXdvcmRzICYmICghb2JqZWN0U2NvcGUgfHwgb2JqZWN0U2NvcGUudHlwZSA9PT0gJ21vZHVsZScpO1xuICAgICAgY29uc3QgaXNFeGNlcHRpb24gPSAhIW9wdGlvbnMuZXhjZXB0aW9ucyAmJiBvcHRpb25zLmV4Y2VwdGlvbnMuc29tZShnbG9iID0+IG1pbmltYXRjaChmaWxlTmFtZSwgZ2xvYikpO1xuXG4gICAgICBpZiAoaXNJZGVudGlmaWVyICYmIGhhc0NKU0V4cG9ydFJlZmVyZW5jZSAmJiAhaXNFbnRyeVBvaW50ICYmICFpc0V4Y2VwdGlvbiAmJiAhaXNJbXBvcnRCaW5kaW5nKSB7XG4gICAgICAgIGltcG9ydERlY2xhcmF0aW9ucy5mb3JFYWNoKGltcG9ydERlY2xhcmF0aW9uID0+IHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlOiBpbXBvcnREZWNsYXJhdGlvbixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDYW5ub3QgdXNlIGltcG9ydCBkZWNsYXJhdGlvbnMgaW4gbW9kdWxlcyB0aGF0IGV4cG9ydCB1c2luZyBgICtcbiAgICAgICAgICAgICAgYENvbW1vbkpTIChtb2R1bGUuZXhwb3J0cyA9ICdmb28nIG9yIGV4cG9ydHMuYmFyID0gJ2hpJylgLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYWxyZWFkeVJlcG9ydGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgSW1wb3J0RGVjbGFyYXRpb24obm9kZSkge1xuICAgICAgICBpbXBvcnREZWNsYXJhdGlvbnMucHVzaChub2RlKTtcbiAgICAgIH0sXG4gICAgICBNZW1iZXJFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKCFhbHJlYWR5UmVwb3J0ZWQpIHtcbiAgICAgICAgICByZXBvcnQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn07XG4iXX0=