prefer-default-export.js 9.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. 'use strict';
  2. var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { 'default': obj };}
  3. module.exports = {
  4. meta: {
  5. type: 'suggestion',
  6. docs: {
  7. url: (0, _docsUrl2['default'])('prefer-default-export') },
  8. schema: [] },
  9. create: function () {function create(context) {
  10. var specifierExportCount = 0;
  11. var hasDefaultExport = false;
  12. var hasStarExport = false;
  13. var hasTypeExport = false;
  14. var namedExportNode = null;
  15. function captureDeclaration(identifierOrPattern) {
  16. if (identifierOrPattern && identifierOrPattern.type === 'ObjectPattern') {
  17. // recursively capture
  18. identifierOrPattern.properties.
  19. forEach(function (property) {
  20. captureDeclaration(property.value);
  21. });
  22. } else if (identifierOrPattern && identifierOrPattern.type === 'ArrayPattern') {
  23. identifierOrPattern.elements.
  24. forEach(captureDeclaration);
  25. } else {
  26. // assume it's a single standard identifier
  27. specifierExportCount++;
  28. }
  29. }
  30. return {
  31. 'ExportDefaultSpecifier': function () {function ExportDefaultSpecifier() {
  32. hasDefaultExport = true;
  33. }return ExportDefaultSpecifier;}(),
  34. 'ExportSpecifier': function () {function ExportSpecifier(node) {
  35. if ((node.exported.name || node.exported.value) === 'default') {
  36. hasDefaultExport = true;
  37. } else {
  38. specifierExportCount++;
  39. namedExportNode = node;
  40. }
  41. }return ExportSpecifier;}(),
  42. 'ExportNamedDeclaration': function () {function ExportNamedDeclaration(node) {
  43. // if there are specifiers, node.declaration should be null
  44. if (!node.declaration) return;var
  45. type = node.declaration.type;
  46. if (
  47. type === 'TSTypeAliasDeclaration' ||
  48. type === 'TypeAlias' ||
  49. type === 'TSInterfaceDeclaration' ||
  50. type === 'InterfaceDeclaration')
  51. {
  52. specifierExportCount++;
  53. hasTypeExport = true;
  54. return;
  55. }
  56. if (node.declaration.declarations) {
  57. node.declaration.declarations.forEach(function (declaration) {
  58. captureDeclaration(declaration.id);
  59. });
  60. } else {
  61. // captures 'export function foo() {}' syntax
  62. specifierExportCount++;
  63. }
  64. namedExportNode = node;
  65. }return ExportNamedDeclaration;}(),
  66. 'ExportDefaultDeclaration': function () {function ExportDefaultDeclaration() {
  67. hasDefaultExport = true;
  68. }return ExportDefaultDeclaration;}(),
  69. 'ExportAllDeclaration': function () {function ExportAllDeclaration() {
  70. hasStarExport = true;
  71. }return ExportAllDeclaration;}(),
  72. 'Program:exit': function () {function ProgramExit() {
  73. if (specifierExportCount === 1 && !hasDefaultExport && !hasStarExport && !hasTypeExport) {
  74. context.report(namedExportNode, 'Prefer default export.');
  75. }
  76. }return ProgramExit;}() };
  77. }return create;}() };
  78. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9wcmVmZXItZGVmYXVsdC1leHBvcnQuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsImNvbnRleHQiLCJzcGVjaWZpZXJFeHBvcnRDb3VudCIsImhhc0RlZmF1bHRFeHBvcnQiLCJoYXNTdGFyRXhwb3J0IiwiaGFzVHlwZUV4cG9ydCIsIm5hbWVkRXhwb3J0Tm9kZSIsImNhcHR1cmVEZWNsYXJhdGlvbiIsImlkZW50aWZpZXJPclBhdHRlcm4iLCJwcm9wZXJ0aWVzIiwiZm9yRWFjaCIsInByb3BlcnR5IiwidmFsdWUiLCJlbGVtZW50cyIsIm5vZGUiLCJleHBvcnRlZCIsIm5hbWUiLCJkZWNsYXJhdGlvbiIsImRlY2xhcmF0aW9ucyIsImlkIiwicmVwb3J0Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQSxxQzs7QUFFQUEsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sWUFERjtBQUVKQyxVQUFNO0FBQ0pDLFdBQUssMEJBQVEsdUJBQVIsQ0FERCxFQUZGOztBQUtKQyxZQUFRLEVBTEosRUFEUzs7O0FBU2ZDLFFBVGUsK0JBU1JDLE9BVFEsRUFTQztBQUNkLFVBQUlDLHVCQUF1QixDQUEzQjtBQUNBLFVBQUlDLG1CQUFtQixLQUF2QjtBQUNBLFVBQUlDLGdCQUFnQixLQUFwQjtBQUNBLFVBQUlDLGdCQUFnQixLQUFwQjtBQUNBLFVBQUlDLGtCQUFrQixJQUF0Qjs7QUFFQSxlQUFTQyxrQkFBVCxDQUE0QkMsbUJBQTVCLEVBQWlEO0FBQy9DLFlBQUlBLHVCQUF1QkEsb0JBQW9CWixJQUFwQixLQUE2QixlQUF4RCxFQUF5RTtBQUN2RTtBQUNBWSw4QkFBb0JDLFVBQXBCO0FBQ0dDLGlCQURILENBQ1csVUFBVUMsUUFBVixFQUFvQjtBQUMzQkosK0JBQW1CSSxTQUFTQyxLQUE1QjtBQUNELFdBSEg7QUFJRCxTQU5ELE1BTU8sSUFBSUosdUJBQXVCQSxvQkFBb0JaLElBQXBCLEtBQTZCLGNBQXhELEVBQXdFO0FBQzdFWSw4QkFBb0JLLFFBQXBCO0FBQ0dILGlCQURILENBQ1dILGtCQURYO0FBRUQsU0FITSxNQUdDO0FBQ1I7QUFDRUw7QUFDRDtBQUNGOztBQUVELGFBQU87QUFDTCwrQ0FBMEIsa0NBQVk7QUFDcENDLCtCQUFtQixJQUFuQjtBQUNELFdBRkQsaUNBREs7O0FBS0wsd0NBQW1CLHlCQUFVVyxJQUFWLEVBQWdCO0FBQ2pDLGdCQUFJLENBQUNBLEtBQUtDLFFBQUwsQ0FBY0MsSUFBZCxJQUFzQkYsS0FBS0MsUUFBTCxDQUFjSCxLQUFyQyxNQUFnRCxTQUFwRCxFQUErRDtBQUM3RFQsaUNBQW1CLElBQW5CO0FBQ0QsYUFGRCxNQUVPO0FBQ0xEO0FBQ0FJLGdDQUFrQlEsSUFBbEI7QUFDRDtBQUNGLFdBUEQsMEJBTEs7O0FBY0wsK0NBQTBCLGdDQUFVQSxJQUFWLEVBQWdCO0FBQ3hDO0FBQ0EsZ0JBQUksQ0FBQ0EsS0FBS0csV0FBVixFQUF1QixPQUZpQjs7QUFJaENyQixnQkFKZ0MsR0FJdkJrQixLQUFLRyxXQUprQixDQUloQ3JCLElBSmdDOztBQU14QztBQUNFQSxxQkFBUyx3QkFBVDtBQUNBQSxxQkFBUyxXQURUO0FBRUFBLHFCQUFTLHdCQUZUO0FBR0FBLHFCQUFTLHNCQUpYO0FBS0U7QUFDQU07QUFDQUcsOEJBQWdCLElBQWhCO0FBQ0E7QUFDRDs7QUFFRCxnQkFBSVMsS0FBS0csV0FBTCxDQUFpQkMsWUFBckIsRUFBbUM7QUFDakNKLG1CQUFLRyxXQUFMLENBQWlCQyxZQUFqQixDQUE4QlIsT0FBOUIsQ0FBc0MsVUFBVU8sV0FBVixFQUF1QjtBQUMzRFYsbUNBQW1CVSxZQUFZRSxFQUEvQjtBQUNELGVBRkQ7QUFHRCxhQUpELE1BSU87QUFDTDtBQUNBakI7QUFDRDs7QUFFREksOEJBQWtCUSxJQUFsQjtBQUNELFdBM0JELGlDQWRLOztBQTJDTCxpREFBNEIsb0NBQVk7QUFDdENYLCtCQUFtQixJQUFuQjtBQUNELFdBRkQsbUNBM0NLOztBQStDTCw2Q0FBd0IsZ0NBQVk7QUFDbENDLDRCQUFnQixJQUFoQjtBQUNELFdBRkQsK0JBL0NLOztBQW1ETCxxQ0FBZ0IsdUJBQVk7QUFDMUIsZ0JBQUlGLHlCQUF5QixDQUF6QixJQUE4QixDQUFDQyxnQkFBL0IsSUFBbUQsQ0FBQ0MsYUFBcEQsSUFBcUUsQ0FBQ0MsYUFBMUUsRUFBeUY7QUFDdkZKLHNCQUFRbUIsTUFBUixDQUFlZCxlQUFmLEVBQWdDLHdCQUFoQztBQUNEO0FBQ0YsV0FKRCxzQkFuREssRUFBUDs7QUF5REQsS0F6RmMsbUJBQWpCIiwiZmlsZSI6InByZWZlci1kZWZhdWx0LWV4cG9ydC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgncHJlZmVyLWRlZmF1bHQtZXhwb3J0JyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZShjb250ZXh0KSB7XG4gICAgbGV0IHNwZWNpZmllckV4cG9ydENvdW50ID0gMDtcbiAgICBsZXQgaGFzRGVmYXVsdEV4cG9ydCA9IGZhbHNlO1xuICAgIGxldCBoYXNTdGFyRXhwb3J0ID0gZmFsc2U7XG4gICAgbGV0IGhhc1R5cGVFeHBvcnQgPSBmYWxzZTtcbiAgICBsZXQgbmFtZWRFeHBvcnROb2RlID0gbnVsbDtcblxuICAgIGZ1bmN0aW9uIGNhcHR1cmVEZWNsYXJhdGlvbihpZGVudGlmaWVyT3JQYXR0ZXJuKSB7XG4gICAgICBpZiAoaWRlbnRpZmllck9yUGF0dGVybiAmJiBpZGVudGlmaWVyT3JQYXR0ZXJuLnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJykge1xuICAgICAgICAvLyByZWN1cnNpdmVseSBjYXB0dXJlXG4gICAgICAgIGlkZW50aWZpZXJPclBhdHRlcm4ucHJvcGVydGllc1xuICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgICAgICAgY2FwdHVyZURlY2xhcmF0aW9uKHByb3BlcnR5LnZhbHVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpZmllck9yUGF0dGVybiAmJiBpZGVudGlmaWVyT3JQYXR0ZXJuLnR5cGUgPT09ICdBcnJheVBhdHRlcm4nKSB7XG4gICAgICAgIGlkZW50aWZpZXJPclBhdHRlcm4uZWxlbWVudHNcbiAgICAgICAgICAuZm9yRWFjaChjYXB0dXJlRGVjbGFyYXRpb24pO1xuICAgICAgfSBlbHNlICB7XG4gICAgICAvLyBhc3N1bWUgaXQncyBhIHNpbmdsZSBzdGFuZGFyZCBpZGVudGlmaWVyXG4gICAgICAgIHNwZWNpZmllckV4cG9ydENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICdFeHBvcnREZWZhdWx0U3BlY2lmaWVyJzogZnVuY3Rpb24gKCkge1xuICAgICAgICBoYXNEZWZhdWx0RXhwb3J0ID0gdHJ1ZTtcbiAgICAgIH0sXG5cbiAgICAgICdFeHBvcnRTcGVjaWZpZXInOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAoKG5vZGUuZXhwb3J0ZWQubmFtZSB8fCBub2RlLmV4cG9ydGVkLnZhbHVlKSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgaGFzRGVmYXVsdEV4cG9ydCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3BlY2lmaWVyRXhwb3J0Q291bnQrKztcbiAgICAgICAgICBuYW1lZEV4cG9ydE5vZGUgPSBub2RlO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbic6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBzcGVjaWZpZXJzLCBub2RlLmRlY2xhcmF0aW9uIHNob3VsZCBiZSBudWxsXG4gICAgICAgIGlmICghbm9kZS5kZWNsYXJhdGlvbikgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHsgdHlwZSB9ID0gbm9kZS5kZWNsYXJhdGlvbjtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZSA9PT0gJ1RTVHlwZUFsaWFzRGVjbGFyYXRpb24nIHx8XG4gICAgICAgICAgdHlwZSA9PT0gJ1R5cGVBbGlhcycgfHxcbiAgICAgICAgICB0eXBlID09PSAnVFNJbnRlcmZhY2VEZWNsYXJhdGlvbicgfHxcbiAgICAgICAgICB0eXBlID09PSAnSW50ZXJmYWNlRGVjbGFyYXRpb24nXG4gICAgICAgICkge1xuICAgICAgICAgIHNwZWNpZmllckV4cG9ydENvdW50Kys7XG4gICAgICAgICAgaGFzVHlwZUV4cG9ydCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb24uZGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgbm9kZS5kZWNsYXJhdGlvbi5kZWNsYXJhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoZGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIGNhcHR1cmVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbi5pZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY2FwdHVyZXMgJ2V4cG9ydCBmdW5jdGlvbiBmb28oKSB7fScgc3ludGF4XG4gICAgICAgICAgc3BlY2lmaWVyRXhwb3J0Q291bnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIG5hbWVkRXhwb3J0Tm9kZSA9IG5vZGU7XG4gICAgICB9LFxuXG4gICAgICAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJzogZnVuY3Rpb24gKCkge1xuICAgICAgICBoYXNEZWZhdWx0RXhwb3J0ID0gdHJ1ZTtcbiAgICAgIH0sXG5cbiAgICAgICdFeHBvcnRBbGxEZWNsYXJhdGlvbic6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaGFzU3RhckV4cG9ydCA9IHRydWU7XG4gICAgICB9LFxuXG4gICAgICAnUHJvZ3JhbTpleGl0JzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoc3BlY2lmaWVyRXhwb3J0Q291bnQgPT09IDEgJiYgIWhhc0RlZmF1bHRFeHBvcnQgJiYgIWhhc1N0YXJFeHBvcnQgJiYgIWhhc1R5cGVFeHBvcnQpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydChuYW1lZEV4cG9ydE5vZGUsICdQcmVmZXIgZGVmYXVsdCBleHBvcnQuJyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn07XG4iXX0=