@@ -171,3 +171,208 @@ test.snapshot({
171171 ` ,
172172 ] . map ( testCase => withTypescriptParser ( testCase ) ) ,
173173} ) ;
174+
175+ test ( {
176+ valid : [ ] ,
177+ invalid : [
178+ {
179+ code : '@foo export @bar @baz class Foo {}' ,
180+ output : '@foo @bar @baz export class Foo {}' ,
181+ options : [ 'before' ] ,
182+ errors : [
183+ {
184+ messageId : 'consistent-export-decorator-position' ,
185+ line : 1 ,
186+ column : 13 ,
187+ endColumn : 17 ,
188+ } ,
189+ ] ,
190+ } ,
191+ {
192+ code : 'export default @foo(class {}) class Foo {}' ,
193+ output : '@foo(class {})\nexport default class Foo {}' ,
194+ errors : [
195+ {
196+ messageId : 'consistent-export-decorator-position' ,
197+ line : 1 ,
198+ column : 16 ,
199+ endColumn : 30 ,
200+ } ,
201+ ] ,
202+ } ,
203+ {
204+ code : 'export @foo(class {}) class Foo {}' ,
205+ output : '@foo(class {}) export class Foo {}' ,
206+ options : [ 'before' ] ,
207+ errors : [
208+ {
209+ messageId : 'consistent-export-decorator-position' ,
210+ line : 1 ,
211+ column : 8 ,
212+ endColumn : 22 ,
213+ } ,
214+ ] ,
215+ } ,
216+ {
217+ code : '@foo(class {})\nexport class Foo {}' ,
218+ output : 'export @foo(class {}) class Foo {}' ,
219+ options : [ 'after' ] ,
220+ errors : [
221+ {
222+ messageId : 'consistent-export-decorator-position' ,
223+ line : 1 ,
224+ column : 1 ,
225+ endColumn : 15 ,
226+ } ,
227+ ] ,
228+ } ,
229+ {
230+ code : '@foo(class {})\nexport default class Foo {}' ,
231+ output : 'export default @foo(class {}) class Foo {}' ,
232+ options : [ 'after' ] ,
233+ errors : [
234+ {
235+ messageId : 'consistent-export-decorator-position' ,
236+ line : 1 ,
237+ column : 1 ,
238+ endColumn : 15 ,
239+ } ,
240+ ] ,
241+ } ,
242+ {
243+ code : '@foo\nexport @bar class Foo {}' ,
244+ output : '@foo\n@bar\nexport class Foo {}' ,
245+ errors : [
246+ {
247+ messageId : 'consistent-export-decorator-position' ,
248+ line : 2 ,
249+ column : 8 ,
250+ endColumn : 12 ,
251+ } ,
252+ ] ,
253+ } ,
254+ {
255+ code : '@foo\nexport @bar class Foo {}' ,
256+ output : '@foo @bar export class Foo {}' ,
257+ options : [ 'before' ] ,
258+ errors : [
259+ {
260+ messageId : 'consistent-export-decorator-position' ,
261+ line : 1 ,
262+ column : 1 ,
263+ endColumn : 5 ,
264+ } ,
265+ ] ,
266+ } ,
267+ {
268+ code : '@foo\nexport @bar class Foo {}' ,
269+ output : 'export @foo @bar class Foo {}' ,
270+ options : [ 'after' ] ,
271+ errors : [
272+ {
273+ messageId : 'consistent-export-decorator-position' ,
274+ line : 1 ,
275+ column : 1 ,
276+ endColumn : 5 ,
277+ } ,
278+ ] ,
279+ } ,
280+ {
281+ code : '@foo /* comment */ export @bar class Foo {}' ,
282+ options : [ 'before' ] ,
283+ errors : [
284+ {
285+ messageId : 'consistent-export-decorator-position' ,
286+ line : 1 ,
287+ column : 27 ,
288+ endColumn : 31 ,
289+ } ,
290+ ] ,
291+ } ,
292+ {
293+ code : '@foo /* keep */ @bar export class Foo {}' ,
294+ errors : [
295+ {
296+ messageId : 'consistent-export-decorator-position' ,
297+ line : 1 ,
298+ column : 1 ,
299+ endColumn : 5 ,
300+ } ,
301+ ] ,
302+ } ,
303+ {
304+ code : '/* comment */ @decorator export class Foo {}' ,
305+ output : '/* comment */ @decorator\nexport class Foo {}' ,
306+ errors : [
307+ {
308+ messageId : 'consistent-export-decorator-position' ,
309+ line : 1 ,
310+ column : 15 ,
311+ endColumn : 25 ,
312+ } ,
313+ ] ,
314+ } ,
315+ {
316+ code : 'foo(); @decorator export class Foo {}' ,
317+ output : 'foo(); @decorator\nexport class Foo {}' ,
318+ errors : [
319+ {
320+ messageId : 'consistent-export-decorator-position' ,
321+ line : 1 ,
322+ column : 8 ,
323+ endColumn : 18 ,
324+ } ,
325+ ] ,
326+ } ,
327+ {
328+ code : 'namespace N { const value = 1; @decorator export class Foo {} }' ,
329+ output : 'namespace N { const value = 1; @decorator\nexport class Foo {} }' ,
330+ errors : [
331+ {
332+ messageId : 'consistent-export-decorator-position' ,
333+ line : 1 ,
334+ column : 32 ,
335+ endColumn : 42 ,
336+ } ,
337+ ] ,
338+ } ,
339+ {
340+ code : 'namespace N { @decorator export class Bar {} }' ,
341+ output : 'namespace N { @decorator\nexport class Bar {} }' ,
342+ errors : [
343+ {
344+ messageId : 'consistent-export-decorator-position' ,
345+ line : 1 ,
346+ column : 15 ,
347+ endColumn : 25 ,
348+ } ,
349+ ] ,
350+ } ,
351+ {
352+ code : 'namespace N {\n\t@decorator export class Foo {}\n}' ,
353+ output : 'namespace N {\n\texport @decorator class Foo {}\n}' ,
354+ options : [ 'after' ] ,
355+ errors : [
356+ {
357+ messageId : 'consistent-export-decorator-position' ,
358+ line : 2 ,
359+ column : 2 ,
360+ endColumn : 12 ,
361+ } ,
362+ ] ,
363+ } ,
364+ {
365+ code : 'namespace N { @decorator export default class Foo {} }' ,
366+ output : 'namespace N { export default @decorator class Foo {} }' ,
367+ options : [ 'after' ] ,
368+ errors : [
369+ {
370+ messageId : 'consistent-export-decorator-position' ,
371+ line : 1 ,
372+ column : 15 ,
373+ endColumn : 25 ,
374+ } ,
375+ ] ,
376+ } ,
377+ ] . map ( testCase => withTypescriptParser ( testCase ) ) ,
378+ } ) ;
0 commit comments