spaceBeforeGenericBracket.js.flow 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import {
  2. spacingFixers,
  3. } from '../utilities';
  4. const schema = [
  5. {
  6. enum: ['always', 'never'],
  7. type: 'string',
  8. },
  9. ];
  10. const create = (context) => {
  11. const never = (context.options[0] || 'never') === 'never';
  12. return {
  13. GenericTypeAnnotation(node) {
  14. const types = node.typeParameters;
  15. // Promise<foo>
  16. // ^^^^^^^^^^^^ GenericTypeAnnotation (with typeParameters)
  17. // ^^^ GenericTypeAnnotation (without typeParameters)
  18. if (!types) {
  19. return;
  20. }
  21. const spaceBefore = types.range[0] - node.id.range[1];
  22. if (never && spaceBefore) {
  23. context.report({
  24. data: { name: node.id.name },
  25. fix: spacingFixers.stripSpacesAfter(node.id, spaceBefore),
  26. message: 'There must be no space before "{{name}}" generic type annotation bracket',
  27. node,
  28. });
  29. }
  30. if (!never && !spaceBefore) {
  31. context.report({
  32. data: { name: node.id.name },
  33. fix: spacingFixers.addSpaceAfter(node.id),
  34. message: 'There must be a space before "{{name}}" generic type annotation bracket',
  35. node,
  36. });
  37. }
  38. if (!never && spaceBefore > 1) {
  39. context.report({
  40. data: { name: node.id.name },
  41. fix: spacingFixers.stripSpacesAfter(node.id, spaceBefore - 1),
  42. message: 'There must be one space before "{{name}}" generic type annotation bracket',
  43. node,
  44. });
  45. }
  46. },
  47. };
  48. };
  49. export default {
  50. create,
  51. meta: {
  52. fixable: 'code',
  53. },
  54. schema,
  55. };