Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
epidemian
GitHub Repository: epidemian/eslint-plugin-import
Path: blob/main/tests/src/rules/dynamic-import-chunkname.js
829 views
1
import { SYNTAX_CASES, getTSParsers } from '../utils';
2
import { RuleTester } from 'eslint';
3
import semver from 'semver';
4
5
const rule = require('rules/dynamic-import-chunkname');
6
const ruleTester = new RuleTester();
7
8
const commentFormat = '[0-9a-zA-Z-_/.]+';
9
const pickyCommentFormat = '[a-zA-Z-_/.]+';
10
const options = [{ importFunctions: ['dynamicImport'] }];
11
const pickyCommentOptions = [{
12
importFunctions: ['dynamicImport'],
13
webpackChunknameFormat: pickyCommentFormat,
14
}];
15
const multipleImportFunctionOptions = [{
16
importFunctions: ['dynamicImport', 'definitelyNotStaticImport'],
17
}];
18
const parser = require.resolve('babel-eslint');
19
20
const noLeadingCommentError = 'dynamic imports require a leading comment with the webpack chunkname';
21
const nonBlockCommentError = 'dynamic imports require a /* foo */ style comment, not a // foo comment';
22
const noPaddingCommentError = 'dynamic imports require a block comment padded with spaces - /* foo */';
23
const invalidSyntaxCommentError = 'dynamic imports require a "webpack" comment with valid syntax';
24
const commentFormatError = `dynamic imports require a leading comment in the form /* webpackChunkName: ["']${commentFormat}["'],? */`;
25
const pickyCommentFormatError = `dynamic imports require a leading comment in the form /* webpackChunkName: ["']${pickyCommentFormat}["'],? */`;
26
27
ruleTester.run('dynamic-import-chunkname', rule, {
28
valid: [
29
{
30
code: `dynamicImport(
31
/* webpackChunkName: "someModule" */
32
'test'
33
)`,
34
options,
35
},
36
{
37
code: `dynamicImport(
38
/* webpackChunkName: "Some_Other_Module" */
39
"test"
40
)`,
41
options,
42
},
43
{
44
code: `dynamicImport(
45
/* webpackChunkName: "SomeModule123" */
46
"test"
47
)`,
48
options,
49
},
50
{
51
code: `dynamicImport(
52
/* webpackChunkName: "someModule" */
53
'someModule'
54
)`,
55
options: pickyCommentOptions,
56
errors: [{
57
message: pickyCommentFormatError,
58
type: 'CallExpression',
59
}],
60
},
61
{
62
code: `import(
63
/* webpackChunkName: "someModule" */
64
'test'
65
)`,
66
options,
67
parser,
68
},
69
{
70
code: `import(
71
/* webpackChunkName: "Some_Other_Module" */
72
"test"
73
)`,
74
options,
75
parser,
76
},
77
{
78
code: `import(
79
/* webpackChunkName: "SomeModule123" */
80
"test"
81
)`,
82
options,
83
parser,
84
},
85
{
86
code: `import(
87
/* webpackChunkName: "someModule", webpackPrefetch: true */
88
'test'
89
)`,
90
options,
91
parser,
92
},
93
{
94
code: `import(
95
/* webpackChunkName: "someModule", webpackPrefetch: true, */
96
'test'
97
)`,
98
options,
99
parser,
100
},
101
{
102
code: `import(
103
/* webpackPrefetch: true, webpackChunkName: "someModule" */
104
'test'
105
)`,
106
options,
107
parser,
108
},
109
{
110
code: `import(
111
/* webpackPrefetch: true, webpackChunkName: "someModule", */
112
'test'
113
)`,
114
options,
115
parser,
116
},
117
{
118
code: `import(
119
/* webpackPrefetch: true */
120
/* webpackChunkName: "someModule" */
121
'test'
122
)`,
123
options,
124
parser,
125
},
126
{
127
code: `import(
128
/* webpackChunkName: "someModule" */
129
/* webpackPrefetch: true */
130
'test'
131
)`,
132
options,
133
parser,
134
},
135
{
136
code: `import(
137
/* webpackChunkName: 'someModule' */
138
'someModule'
139
)`,
140
options,
141
parser,
142
},
143
{
144
code: `import(
145
/* webpackChunkName: "someModule" */
146
'someModule'
147
)`,
148
options: pickyCommentOptions,
149
parser,
150
errors: [{
151
message: pickyCommentFormatError,
152
type: 'CallExpression',
153
}],
154
},
155
...SYNTAX_CASES,
156
],
157
158
invalid: [
159
{
160
code: `import(
161
// webpackChunkName: "someModule"
162
'someModule'
163
)`,
164
options,
165
parser,
166
output: `import(
167
// webpackChunkName: "someModule"
168
'someModule'
169
)`,
170
errors: [{
171
message: nonBlockCommentError,
172
type: 'CallExpression',
173
}],
174
},
175
{
176
code: 'import(\'test\')',
177
options,
178
parser,
179
output: 'import(\'test\')',
180
errors: [{
181
message: noLeadingCommentError,
182
type: 'CallExpression',
183
}],
184
},
185
{
186
code: `import(
187
/* webpackChunkName: someModule */
188
'someModule'
189
)`,
190
options,
191
parser,
192
output: `import(
193
/* webpackChunkName: someModule */
194
'someModule'
195
)`,
196
errors: [{
197
message: invalidSyntaxCommentError,
198
type: 'CallExpression',
199
}],
200
},
201
{
202
code: `import(
203
/* webpackChunkName: "someModule' */
204
'someModule'
205
)`,
206
options,
207
parser,
208
output: `import(
209
/* webpackChunkName: "someModule' */
210
'someModule'
211
)`,
212
errors: [{
213
message: invalidSyntaxCommentError,
214
type: 'CallExpression',
215
}],
216
},
217
{
218
code: `import(
219
/* webpackChunkName: 'someModule" */
220
'someModule'
221
)`,
222
options,
223
parser,
224
output: `import(
225
/* webpackChunkName: 'someModule" */
226
'someModule'
227
)`,
228
errors: [{
229
message: invalidSyntaxCommentError,
230
type: 'CallExpression',
231
}],
232
},
233
{
234
code: `import(
235
/* webpackChunkName "someModule" */
236
'someModule'
237
)`,
238
options,
239
parser,
240
output: `import(
241
/* webpackChunkName "someModule" */
242
'someModule'
243
)`,
244
errors: [{
245
message: invalidSyntaxCommentError,
246
type: 'CallExpression',
247
}],
248
},
249
{
250
code: `import(
251
/* webpackChunkName:"someModule" */
252
'someModule'
253
)`,
254
options,
255
parser,
256
output: `import(
257
/* webpackChunkName:"someModule" */
258
'someModule'
259
)`,
260
errors: [{
261
message: commentFormatError,
262
type: 'CallExpression',
263
}],
264
},
265
{
266
code: `import(
267
/*webpackChunkName: "someModule"*/
268
'someModule'
269
)`,
270
options,
271
parser,
272
output: `import(
273
/*webpackChunkName: "someModule"*/
274
'someModule'
275
)`,
276
errors: [{
277
message: noPaddingCommentError,
278
type: 'CallExpression',
279
}],
280
},
281
{
282
code: `import(
283
/* webpackChunkName : "someModule" */
284
'someModule'
285
)`,
286
options,
287
parser,
288
output: `import(
289
/* webpackChunkName : "someModule" */
290
'someModule'
291
)`,
292
errors: [{
293
message: commentFormatError,
294
type: 'CallExpression',
295
}],
296
},
297
{
298
code: `import(
299
/* webpackChunkName: "someModule" ; */
300
'someModule'
301
)`,
302
options,
303
parser,
304
output: `import(
305
/* webpackChunkName: "someModule" ; */
306
'someModule'
307
)`,
308
errors: [{
309
message: invalidSyntaxCommentError,
310
type: 'CallExpression',
311
}],
312
},
313
{
314
code: `import(
315
/* totally not webpackChunkName: "someModule" */
316
'someModule'
317
)`,
318
options,
319
parser,
320
output: `import(
321
/* totally not webpackChunkName: "someModule" */
322
'someModule'
323
)`,
324
errors: [{
325
message: invalidSyntaxCommentError,
326
type: 'CallExpression',
327
}],
328
},
329
{
330
code: `import(
331
/* webpackPrefetch: true */
332
/* webpackChunk: "someModule" */
333
'someModule'
334
)`,
335
options,
336
parser,
337
output: `import(
338
/* webpackPrefetch: true */
339
/* webpackChunk: "someModule" */
340
'someModule'
341
)`,
342
errors: [{
343
message: commentFormatError,
344
type: 'CallExpression',
345
}],
346
},
347
{
348
code: `import(
349
/* webpackPrefetch: true, webpackChunk: "someModule" */
350
'someModule'
351
)`,
352
options,
353
parser,
354
output: `import(
355
/* webpackPrefetch: true, webpackChunk: "someModule" */
356
'someModule'
357
)`,
358
errors: [{
359
message: commentFormatError,
360
type: 'CallExpression',
361
}],
362
},
363
{
364
code: `import(
365
/* webpackChunkName: "someModule123" */
366
'someModule'
367
)`,
368
options: pickyCommentOptions,
369
parser,
370
output: `import(
371
/* webpackChunkName: "someModule123" */
372
'someModule'
373
)`,
374
errors: [{
375
message: pickyCommentFormatError,
376
type: 'CallExpression',
377
}],
378
},
379
{
380
code: `dynamicImport(
381
/* webpackChunkName "someModule" */
382
'someModule'
383
)`,
384
options: multipleImportFunctionOptions,
385
output: `dynamicImport(
386
/* webpackChunkName "someModule" */
387
'someModule'
388
)`,
389
errors: [{
390
message: invalidSyntaxCommentError,
391
type: 'CallExpression',
392
}],
393
},
394
{
395
code: `definitelyNotStaticImport(
396
/* webpackChunkName "someModule" */
397
'someModule'
398
)`,
399
options: multipleImportFunctionOptions,
400
output: `definitelyNotStaticImport(
401
/* webpackChunkName "someModule" */
402
'someModule'
403
)`,
404
errors: [{
405
message: invalidSyntaxCommentError,
406
type: 'CallExpression',
407
}],
408
},
409
{
410
code: `dynamicImport(
411
// webpackChunkName: "someModule"
412
'someModule'
413
)`,
414
options,
415
output: `dynamicImport(
416
// webpackChunkName: "someModule"
417
'someModule'
418
)`,
419
errors: [{
420
message: nonBlockCommentError,
421
type: 'CallExpression',
422
}],
423
},
424
{
425
code: 'dynamicImport(\'test\')',
426
options,
427
output: 'dynamicImport(\'test\')',
428
errors: [{
429
message: noLeadingCommentError,
430
type: 'CallExpression',
431
}],
432
},
433
{
434
code: `dynamicImport(
435
/* webpackChunkName: someModule */
436
'someModule'
437
)`,
438
options,
439
output: `dynamicImport(
440
/* webpackChunkName: someModule */
441
'someModule'
442
)`,
443
errors: [{
444
message: invalidSyntaxCommentError,
445
type: 'CallExpression',
446
}],
447
},
448
{
449
code: `dynamicImport(
450
/* webpackChunkName "someModule" */
451
'someModule'
452
)`,
453
options,
454
output: `dynamicImport(
455
/* webpackChunkName "someModule" */
456
'someModule'
457
)`,
458
errors: [{
459
message: invalidSyntaxCommentError,
460
type: 'CallExpression',
461
}],
462
},
463
{
464
code: `dynamicImport(
465
/* webpackChunkName:"someModule" */
466
'someModule'
467
)`,
468
options,
469
output: `dynamicImport(
470
/* webpackChunkName:"someModule" */
471
'someModule'
472
)`,
473
errors: [{
474
message: commentFormatError,
475
type: 'CallExpression',
476
}],
477
},
478
{
479
code: `dynamicImport(
480
/* webpackChunkName: "someModule123" */
481
'someModule'
482
)`,
483
options: pickyCommentOptions,
484
output: `dynamicImport(
485
/* webpackChunkName: "someModule123" */
486
'someModule'
487
)`,
488
errors: [{
489
message: pickyCommentFormatError,
490
type: 'CallExpression',
491
}],
492
},
493
],
494
});
495
496
context('TypeScript', () => {
497
getTSParsers().forEach((typescriptParser) => {
498
const nodeType = typescriptParser.includes('typescript-eslint-parser') || (typescriptParser.includes('@typescript-eslint/parser') && semver.satisfies(require('@typescript-eslint/parser/package.json').version, '^2'))
499
? 'CallExpression'
500
: 'ImportExpression';
501
502
ruleTester.run('dynamic-import-chunkname', rule, {
503
valid: [
504
{
505
code: `import(
506
/* webpackChunkName: "someModule" */
507
'test'
508
)`,
509
options,
510
parser: typescriptParser,
511
},
512
{
513
code: `import(
514
/* webpackChunkName: "Some_Other_Module" */
515
"test"
516
)`,
517
options,
518
parser: typescriptParser,
519
},
520
{
521
code: `import(
522
/* webpackChunkName: "SomeModule123" */
523
"test"
524
)`,
525
options,
526
parser: typescriptParser,
527
},
528
{
529
code: `import(
530
/* webpackChunkName: "someModule", webpackPrefetch: true */
531
'test'
532
)`,
533
options,
534
parser: typescriptParser,
535
},
536
{
537
code: `import(
538
/* webpackChunkName: "someModule", webpackPrefetch: true, */
539
'test'
540
)`,
541
options,
542
parser: typescriptParser,
543
},
544
{
545
code: `import(
546
/* webpackPrefetch: true, webpackChunkName: "someModule" */
547
'test'
548
)`,
549
options,
550
parser: typescriptParser,
551
},
552
{
553
code: `import(
554
/* webpackPrefetch: true, webpackChunkName: "someModule", */
555
'test'
556
)`,
557
options,
558
parser: typescriptParser,
559
},
560
{
561
code: `import(
562
/* webpackPrefetch: true */
563
/* webpackChunkName: "someModule" */
564
'test'
565
)`,
566
options,
567
parser: typescriptParser,
568
},
569
{
570
code: `import(
571
/* webpackChunkName: "someModule" */
572
/* webpackPrefetch: true */
573
'test'
574
)`,
575
options,
576
parser: typescriptParser,
577
},
578
{
579
code: `import(
580
/* webpackChunkName: "someModule" */
581
'someModule'
582
)`,
583
options: pickyCommentOptions,
584
parser: typescriptParser,
585
errors: [{
586
message: pickyCommentFormatError,
587
type: nodeType,
588
}],
589
},
590
{
591
code: `import(
592
/* webpackChunkName: 'someModule' */
593
'test'
594
)`,
595
options,
596
parser: typescriptParser,
597
},
598
],
599
invalid: [
600
{
601
code: `import(
602
// webpackChunkName: "someModule"
603
'someModule'
604
)`,
605
options,
606
parser: typescriptParser,
607
output: `import(
608
// webpackChunkName: "someModule"
609
'someModule'
610
)`,
611
errors: [{
612
message: nonBlockCommentError,
613
type: nodeType,
614
}],
615
},
616
{
617
code: 'import(\'test\')',
618
options,
619
parser: typescriptParser,
620
output: 'import(\'test\')',
621
errors: [{
622
message: noLeadingCommentError,
623
type: nodeType,
624
}],
625
},
626
{
627
code: `import(
628
/* webpackChunkName: someModule */
629
'someModule'
630
)`,
631
options,
632
parser: typescriptParser,
633
output: `import(
634
/* webpackChunkName: someModule */
635
'someModule'
636
)`,
637
errors: [{
638
message: invalidSyntaxCommentError,
639
type: nodeType,
640
}],
641
},
642
{
643
code: `import(
644
/* webpackChunkName "someModule' */
645
'someModule'
646
)`,
647
options,
648
parser: typescriptParser,
649
output: `import(
650
/* webpackChunkName "someModule' */
651
'someModule'
652
)`,
653
errors: [{
654
message: invalidSyntaxCommentError,
655
type: nodeType,
656
}],
657
},
658
{
659
code: `import(
660
/* webpackChunkName 'someModule" */
661
'someModule'
662
)`,
663
options,
664
parser: typescriptParser,
665
output: `import(
666
/* webpackChunkName 'someModule" */
667
'someModule'
668
)`,
669
errors: [{
670
message: invalidSyntaxCommentError,
671
type: nodeType,
672
}],
673
},
674
{
675
code: `import(
676
/* webpackChunkName "someModule" */
677
'someModule'
678
)`,
679
options,
680
parser: typescriptParser,
681
output: `import(
682
/* webpackChunkName "someModule" */
683
'someModule'
684
)`,
685
errors: [{
686
message: invalidSyntaxCommentError,
687
type: nodeType,
688
}],
689
},
690
{
691
code: `import(
692
/* webpackChunkName:"someModule" */
693
'someModule'
694
)`,
695
options,
696
parser: typescriptParser,
697
output: `import(
698
/* webpackChunkName:"someModule" */
699
'someModule'
700
)`,
701
errors: [{
702
message: commentFormatError,
703
type: nodeType,
704
}],
705
},
706
{
707
code: `import(
708
/*webpackChunkName: "someModule"*/
709
'someModule'
710
)`,
711
options,
712
parser: typescriptParser,
713
output: `import(
714
/*webpackChunkName: "someModule"*/
715
'someModule'
716
)`,
717
errors: [{
718
message: noPaddingCommentError,
719
type: nodeType,
720
}],
721
},
722
{
723
code: `import(
724
/* webpackChunkName : "someModule" */
725
'someModule'
726
)`,
727
options,
728
parser: typescriptParser,
729
output: `import(
730
/* webpackChunkName : "someModule" */
731
'someModule'
732
)`,
733
errors: [{
734
message: commentFormatError,
735
type: nodeType,
736
}],
737
},
738
{
739
code: `import(
740
/* webpackChunkName: "someModule" ; */
741
'someModule'
742
)`,
743
options,
744
parser: typescriptParser,
745
output: `import(
746
/* webpackChunkName: "someModule" ; */
747
'someModule'
748
)`,
749
errors: [{
750
message: invalidSyntaxCommentError,
751
type: nodeType,
752
}],
753
},
754
{
755
code: `import(
756
/* totally not webpackChunkName: "someModule" */
757
'someModule'
758
)`,
759
options,
760
parser: typescriptParser,
761
output: `import(
762
/* totally not webpackChunkName: "someModule" */
763
'someModule'
764
)`,
765
errors: [{
766
message: invalidSyntaxCommentError,
767
type: nodeType,
768
}],
769
},
770
{
771
code: `import(
772
/* webpackPrefetch: true */
773
/* webpackChunk: "someModule" */
774
'someModule'
775
)`,
776
options,
777
parser: typescriptParser,
778
output: `import(
779
/* webpackPrefetch: true */
780
/* webpackChunk: "someModule" */
781
'someModule'
782
)`,
783
errors: [{
784
message: commentFormatError,
785
type: nodeType,
786
}],
787
},
788
{
789
code: `import(
790
/* webpackPrefetch: true, webpackChunk: "someModule" */
791
'someModule'
792
)`,
793
options,
794
parser: typescriptParser,
795
output: `import(
796
/* webpackPrefetch: true, webpackChunk: "someModule" */
797
'someModule'
798
)`,
799
errors: [{
800
message: commentFormatError,
801
type: nodeType,
802
}],
803
},
804
{
805
code: `import(
806
/* webpackChunkName: "someModule123" */
807
'someModule'
808
)`,
809
options: pickyCommentOptions,
810
parser: typescriptParser,
811
output: `import(
812
/* webpackChunkName: "someModule123" */
813
'someModule'
814
)`,
815
errors: [{
816
message: pickyCommentFormatError,
817
type: nodeType,
818
}],
819
},
820
],
821
});
822
});
823
});
824
825