jsx-first-prop-new-line.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. /**
  2. * @fileoverview Ensure proper position of the first property in JSX
  3. * @author Joachim Seminck
  4. */
  5. 'use strict';
  6. // -----------------------------------------------------------------------------
  7. // Requirements
  8. // -----------------------------------------------------------------------------
  9. const rule = require('../../../lib/rules/jsx-first-prop-new-line');
  10. const RuleTester = require('eslint').RuleTester;
  11. const parserOptions = {
  12. ecmaVersion: 2018,
  13. sourceType: 'module',
  14. ecmaFeatures: {
  15. jsx: true
  16. }
  17. };
  18. // -----------------------------------------------------------------------------
  19. // Tests
  20. // -----------------------------------------------------------------------------
  21. const ruleTester = new RuleTester({parserOptions});
  22. ruleTester.run('jsx-first-prop-new-line', rule, {
  23. valid: [
  24. {
  25. code: '<Foo />',
  26. options: ['never'],
  27. parser: 'babel-eslint'
  28. },
  29. {
  30. code: '<Foo prop="bar" />',
  31. options: ['never'],
  32. parser: 'babel-eslint'
  33. },
  34. {
  35. code: '<Foo {...this.props} />',
  36. options: ['never'],
  37. parser: 'babel-eslint'
  38. },
  39. {
  40. code: '<Foo a a a />',
  41. options: ['never'],
  42. parser: 'babel-eslint'
  43. },
  44. {
  45. code: [
  46. '<Foo a',
  47. ' b ',
  48. '/>'
  49. ].join('\n'),
  50. options: ['never'],
  51. parser: 'babel-eslint'
  52. },
  53. {
  54. code: '<Foo />',
  55. options: ['multiline'],
  56. parser: 'babel-eslint'
  57. },
  58. {
  59. code: '<Foo prop="one" />',
  60. options: ['multiline'],
  61. parser: 'babel-eslint'
  62. },
  63. {
  64. code: '<Foo {...this.props} />',
  65. options: ['multiline'],
  66. parser: 'babel-eslint'
  67. },
  68. {
  69. code: '<Foo a a a />',
  70. options: ['multiline'],
  71. parser: 'babel-eslint'
  72. },
  73. {
  74. code: [
  75. '<Foo',
  76. ' propOne="one"',
  77. ' propTwo="two"',
  78. '/>'
  79. ].join('\n'),
  80. options: ['multiline'],
  81. parser: 'babel-eslint'
  82. },
  83. {
  84. code: [
  85. '<Foo',
  86. ' {...this.props}',
  87. ' propTwo="two"',
  88. '/>'
  89. ].join('\n'),
  90. options: ['multiline'],
  91. parser: 'babel-eslint'
  92. },
  93. {
  94. code: [
  95. '<Foo bar />'
  96. ].join('\n'),
  97. options: ['multiline-multiprop'],
  98. parser: 'babel-eslint'
  99. },
  100. {
  101. code: [
  102. '<Foo bar baz />'
  103. ].join('\n'),
  104. options: ['multiline-multiprop'],
  105. parser: 'babel-eslint'
  106. },
  107. {
  108. code: [
  109. '<Foo prop={{',
  110. '}} />'
  111. ].join('\n'),
  112. options: ['multiline-multiprop'],
  113. parser: 'babel-eslint'
  114. },
  115. {
  116. code: [
  117. '<Foo ',
  118. ' foo={{',
  119. ' }}',
  120. ' bar',
  121. '/>'
  122. ].join('\n'),
  123. options: ['multiline-multiprop'],
  124. parser: 'babel-eslint'
  125. },
  126. {
  127. code: '<Foo />',
  128. options: ['always'],
  129. parser: 'babel-eslint'
  130. },
  131. {
  132. code: [
  133. '<Foo',
  134. ' propOne="one"',
  135. ' propTwo="two"',
  136. '/>'
  137. ].join('\n'),
  138. options: ['always'],
  139. parser: 'babel-eslint'
  140. },
  141. {
  142. code: [
  143. '<Foo',
  144. ' {...this.props}',
  145. ' propTwo="two"',
  146. '/>'
  147. ].join('\n'),
  148. options: ['always'],
  149. parser: 'babel-eslint'
  150. }
  151. ],
  152. invalid: [
  153. {
  154. code: '<Foo propOne="one" propTwo="two" />',
  155. output: [
  156. '<Foo',
  157. 'propOne="one" propTwo="two" />'
  158. ].join('\n'),
  159. options: ['always'],
  160. errors: [{message: 'Property should be placed on a new line'}],
  161. parser: 'babel-eslint'
  162. },
  163. {
  164. code: [
  165. '<Foo propOne="one"',
  166. ' propTwo="two"',
  167. '/>'
  168. ].join('\n'),
  169. output: [
  170. '<Foo',
  171. 'propOne="one"',
  172. ' propTwo="two"',
  173. '/>'
  174. ].join('\n'),
  175. options: ['always'],
  176. errors: [{message: 'Property should be placed on a new line'}],
  177. parser: 'babel-eslint'
  178. },
  179. {
  180. code: [
  181. '<Foo',
  182. ' propOne="one"',
  183. ' propTwo="two"',
  184. '/>'
  185. ].join('\n'),
  186. output: [
  187. '<Foo propOne="one"',
  188. ' propTwo="two"',
  189. '/>'
  190. ].join('\n'),
  191. options: ['never'],
  192. errors: [{message: 'Property should be placed on the same line as the component declaration'}],
  193. parser: 'babel-eslint'
  194. },
  195. {
  196. code: [
  197. '<Foo prop={{',
  198. '}} />'
  199. ].join('\n'),
  200. output: [
  201. '<Foo',
  202. 'prop={{',
  203. '}} />'
  204. ].join('\n'),
  205. options: ['multiline'],
  206. errors: [{message: 'Property should be placed on a new line'}],
  207. parser: 'babel-eslint'
  208. },
  209. {
  210. code: [
  211. '<Foo bar={{',
  212. '}} baz />'
  213. ].join('\n'),
  214. output: [
  215. '<Foo',
  216. 'bar={{',
  217. '}} baz />'
  218. ].join('\n'),
  219. options: ['multiline-multiprop'],
  220. errors: [{message: 'Property should be placed on a new line'}],
  221. parser: 'babel-eslint'
  222. }
  223. ]
  224. });