@@ -67,6 +67,12 @@ describe("ESLint", () => {
67
67
}
68
68
} ;
69
69
const examplePreprocessorName = "eslint-plugin-processor" ;
70
+ const patternProcessor = require ( "../../fixtures/processors/pattern-processor" ) ;
71
+ const exampleMarkdownPlugin = {
72
+ processors : {
73
+ markdown : patternProcessor . defineProcessor ( / ` ` ` ( \w + ) \n ( .+ ?) \n ` ` ` (?: \n | $ ) / gsu)
74
+ }
75
+ } ;
70
76
const originalDir = process . cwd ( ) ;
71
77
const fixtureDir = path . resolve ( fs . realpathSync ( os . tmpdir ( ) ) , "eslint/fixtures" ) ;
72
78
@@ -3761,6 +3767,178 @@ describe("ESLint", () => {
3761
3767
assert ( ! Object . hasOwn ( results [ 0 ] , "output" ) ) ;
3762
3768
} ) ;
3763
3769
} ) ;
3770
+
3771
+ describe ( "matching and ignoring code blocks" , ( ) => {
3772
+ const pluginConfig = {
3773
+ files : [ "**/*.md" ] ,
3774
+ plugins : {
3775
+ markdown : exampleMarkdownPlugin
3776
+ } ,
3777
+ processor : "markdown/markdown"
3778
+ } ;
3779
+ const text = unIndent `
3780
+ \`\`\`js
3781
+ foo_js
3782
+ \`\`\`
3783
+
3784
+ \`\`\`ts
3785
+ foo_ts
3786
+ \`\`\`
3787
+
3788
+ \`\`\`cjs
3789
+ foo_cjs
3790
+ \`\`\`
3791
+
3792
+ \`\`\`mjs
3793
+ foo_mjs
3794
+ \`\`\`
3795
+ ` ;
3796
+
3797
+ it ( "should by default lint only .js, .mjs, and .cjs virtual files" , async ( ) => {
3798
+ eslint = new ESLint ( {
3799
+ overrideConfigFile : true ,
3800
+ overrideConfig : [
3801
+ pluginConfig ,
3802
+ {
3803
+ rules : {
3804
+ "no-undef" : 2
3805
+ }
3806
+ }
3807
+ ]
3808
+ } ) ;
3809
+ const [ result ] = await eslint . lintText ( text , { filePath : "foo.md" } ) ;
3810
+
3811
+ assert . strictEqual ( result . messages . length , 3 ) ;
3812
+ assert . strictEqual ( result . messages [ 0 ] . ruleId , "no-undef" ) ;
3813
+ assert . match ( result . messages [ 0 ] . message , / f o o _ j s / u) ;
3814
+ assert . strictEqual ( result . messages [ 0 ] . line , 2 ) ;
3815
+ assert . strictEqual ( result . messages [ 1 ] . ruleId , "no-undef" ) ;
3816
+ assert . match ( result . messages [ 1 ] . message , / f o o _ c j s / u) ;
3817
+ assert . strictEqual ( result . messages [ 1 ] . line , 10 ) ;
3818
+ assert . strictEqual ( result . messages [ 2 ] . ruleId , "no-undef" ) ;
3819
+ assert . match ( result . messages [ 2 ] . message , / f o o _ m j s / u) ;
3820
+ assert . strictEqual ( result . messages [ 2 ] . line , 14 ) ;
3821
+ } ) ;
3822
+
3823
+ it ( "should lint additional virtual files that match non-universal patterns" , async ( ) => {
3824
+ eslint = new ESLint ( {
3825
+ overrideConfigFile : true ,
3826
+ overrideConfig : [
3827
+ pluginConfig ,
3828
+ {
3829
+ rules : {
3830
+ "no-undef" : 2
3831
+ }
3832
+ } ,
3833
+ {
3834
+ files : [ "**/*.ts" ]
3835
+ }
3836
+ ]
3837
+ } ) ;
3838
+ const [ result ] = await eslint . lintText ( text , { filePath : "foo.md" } ) ;
3839
+
3840
+ assert . strictEqual ( result . messages . length , 4 ) ;
3841
+ assert . strictEqual ( result . messages [ 0 ] . ruleId , "no-undef" ) ;
3842
+ assert . match ( result . messages [ 0 ] . message , / f o o _ j s / u) ;
3843
+ assert . strictEqual ( result . messages [ 0 ] . line , 2 ) ;
3844
+ assert . strictEqual ( result . messages [ 1 ] . ruleId , "no-undef" ) ;
3845
+ assert . match ( result . messages [ 1 ] . message , / f o o _ t s / u) ;
3846
+ assert . strictEqual ( result . messages [ 1 ] . line , 6 ) ;
3847
+ assert . strictEqual ( result . messages [ 2 ] . ruleId , "no-undef" ) ;
3848
+ assert . match ( result . messages [ 2 ] . message , / f o o _ c j s / u) ;
3849
+ assert . strictEqual ( result . messages [ 2 ] . line , 10 ) ;
3850
+ assert . strictEqual ( result . messages [ 3 ] . ruleId , "no-undef" ) ;
3851
+ assert . match ( result . messages [ 3 ] . message , / f o o _ m j s / u) ;
3852
+ assert . strictEqual ( result . messages [ 3 ] . line , 14 ) ;
3853
+ } ) ;
3854
+
3855
+ // https://github.com/eslint/eslint/issues/18493
3856
+ it ( "should silently skip virtual files that match only universal patterns" , async ( ) => {
3857
+ eslint = new ESLint ( {
3858
+ overrideConfigFile : true ,
3859
+ overrideConfig : [
3860
+ pluginConfig ,
3861
+ {
3862
+ files : [ "**/*" ] ,
3863
+ rules : {
3864
+ "no-undef" : 2
3865
+ }
3866
+ }
3867
+ ]
3868
+ } ) ;
3869
+ const [ result ] = await eslint . lintText ( text , { filePath : "foo.md" } ) ;
3870
+
3871
+ assert . strictEqual ( result . messages . length , 3 ) ;
3872
+ assert . strictEqual ( result . messages [ 0 ] . ruleId , "no-undef" ) ;
3873
+ assert . match ( result . messages [ 0 ] . message , / f o o _ j s / u) ;
3874
+ assert . strictEqual ( result . messages [ 0 ] . line , 2 ) ;
3875
+ assert . strictEqual ( result . messages [ 1 ] . ruleId , "no-undef" ) ;
3876
+ assert . match ( result . messages [ 1 ] . message , / f o o _ c j s / u) ;
3877
+ assert . strictEqual ( result . messages [ 1 ] . line , 10 ) ;
3878
+ assert . strictEqual ( result . messages [ 2 ] . ruleId , "no-undef" ) ;
3879
+ assert . match ( result . messages [ 2 ] . message , / f o o _ m j s / u) ;
3880
+ assert . strictEqual ( result . messages [ 2 ] . line , 14 ) ;
3881
+ } ) ;
3882
+
3883
+ it ( "should silently skip virtual files that are ignored by global ignores" , async ( ) => {
3884
+ eslint = new ESLint ( {
3885
+ overrideConfigFile : true ,
3886
+ overrideConfig : [
3887
+ pluginConfig ,
3888
+ {
3889
+ rules : {
3890
+ "no-undef" : 2
3891
+ }
3892
+ } ,
3893
+ {
3894
+ ignores : [ "**/*.cjs" ]
3895
+ }
3896
+ ]
3897
+ } ) ;
3898
+ const [ result ] = await eslint . lintText ( text , { filePath : "foo.md" } ) ;
3899
+
3900
+ assert . strictEqual ( result . messages . length , 2 ) ;
3901
+ assert . strictEqual ( result . messages [ 0 ] . ruleId , "no-undef" ) ;
3902
+ assert . match ( result . messages [ 0 ] . message , / f o o _ j s / u) ;
3903
+ assert . strictEqual ( result . messages [ 0 ] . line , 2 ) ;
3904
+ assert . strictEqual ( result . messages [ 1 ] . ruleId , "no-undef" ) ;
3905
+ assert . match ( result . messages [ 1 ] . message , / f o o _ m j s / u) ;
3906
+ assert . strictEqual ( result . messages [ 1 ] . line , 14 ) ;
3907
+ } ) ;
3908
+
3909
+ // https://github.com/eslint/eslint/issues/15949
3910
+ it ( "should silently skip virtual files that are ignored by global ignores even if they match non-universal patterns" , async ( ) => {
3911
+ eslint = new ESLint ( {
3912
+ overrideConfigFile : true ,
3913
+ overrideConfig : [
3914
+ pluginConfig ,
3915
+ {
3916
+ rules : {
3917
+ "no-undef" : 2
3918
+ }
3919
+ } ,
3920
+ {
3921
+ files : [ "**/*.ts" ]
3922
+ } ,
3923
+ {
3924
+ ignores : [ "**/*.md/*.ts" ]
3925
+ }
3926
+ ]
3927
+ } ) ;
3928
+ const [ result ] = await eslint . lintText ( text , { filePath : "foo.md" } ) ;
3929
+
3930
+ assert . strictEqual ( result . messages . length , 3 ) ;
3931
+ assert . strictEqual ( result . messages [ 0 ] . ruleId , "no-undef" ) ;
3932
+ assert . match ( result . messages [ 0 ] . message , / f o o _ j s / u) ;
3933
+ assert . strictEqual ( result . messages [ 0 ] . line , 2 ) ;
3934
+ assert . strictEqual ( result . messages [ 1 ] . ruleId , "no-undef" ) ;
3935
+ assert . match ( result . messages [ 1 ] . message , / f o o _ c j s / u) ;
3936
+ assert . strictEqual ( result . messages [ 1 ] . line , 10 ) ;
3937
+ assert . strictEqual ( result . messages [ 2 ] . ruleId , "no-undef" ) ;
3938
+ assert . match ( result . messages [ 2 ] . message , / f o o _ m j s / u) ;
3939
+ assert . strictEqual ( result . messages [ 2 ] . line , 14 ) ;
3940
+ } ) ;
3941
+ } ) ;
3764
3942
} ) ;
3765
3943
3766
3944
describe ( "Patterns which match no file should throw errors." , ( ) => {
0 commit comments