@@ -5,12 +5,20 @@ import type { ParserOptions } from 'eslint-mdx'
55import { DEFAULT_EXTENSIONS , MARKDOWN_EXTENSIONS } from 'eslint-mdx'
66import { createSyncFn } from 'synckit'
77import type { FrozenProcessor } from 'unified'
8+ import type { VFile , VFileOptions } from 'vfile'
89import vfile from 'vfile'
910
1011import { getPhysicalFilename , getRemarkProcessor } from './helpers'
11- import type { ProcessSync , RemarkLintMessage } from './types'
12+ import type { RemarkLintMessage } from './types'
1213
13- const processSync = createSyncFn ( require . resolve ( '../worker' ) ) as ProcessSync
14+ const processSync = createSyncFn ( require . resolve ( '../worker' ) ) as (
15+ fileOptions : VFileOptions ,
16+ physicalFilename : string ,
17+ isFile : boolean ,
18+ ) => {
19+ messages : VFile [ 'messages' ]
20+ content : string
21+ }
1422
1523const brokenCache = new WeakMap < FrozenProcessor , true > ( )
1624
@@ -54,12 +62,18 @@ export const remark: Rule.RuleModule = {
5462 }
5563
5664 const file = vfile ( fileOptions )
65+ let fixedText : string
5766
5867 let broken = brokenCache . get ( remarkProcessor )
5968
6069 if ( broken ) {
61- const { messages } = processSync ( fileOptions , physicalFilename , isMdx )
70+ const { messages, content } = processSync (
71+ fileOptions ,
72+ physicalFilename ,
73+ isMdx ,
74+ )
6275 file . messages = messages
76+ fixedText = content
6377 } else {
6478 try {
6579 remarkProcessor . processSync ( file )
@@ -70,20 +84,30 @@ export const remark: Rule.RuleModule = {
7084 '`processSync` finished async. Use `process` instead'
7185 ) {
7286 brokenCache . set ( remarkProcessor , ( broken = true ) )
73- const { messages } = processSync (
87+ const { messages, content } = processSync (
7488 fileOptions ,
7589 physicalFilename ,
7690 isMdx ,
7791 )
7892 file . messages = messages
79- } else {
80- if ( ! file . messages . includes ( err ) ) {
81- file . message ( err ) . fatal = true
82- }
93+ fixedText = content
94+ } else if ( ! file . messages . includes ( err ) ) {
95+ file . message ( err ) . fatal = true
8396 }
8497 }
8598 }
8699
100+ if ( ! broken ) {
101+ fixedText = file . toString ( )
102+ }
103+
104+ fixedText =
105+ filename === physicalFilename || sourceText . endsWith ( '\n' )
106+ ? fixedText
107+ : fixedText . slice ( 0 , - 1 )
108+
109+ let fixed = 0
110+
87111 for ( const {
88112 source,
89113 reason,
@@ -120,27 +144,16 @@ export const remark: Rule.RuleModule = {
120144 } ,
121145 } ,
122146 node,
123- fix ( fixer ) {
124- /* istanbul ignore if */
125- if ( start . offset == null ) {
126- return null
127- }
128- const range : [ number , number ] = [
129- start . offset ,
130- /* istanbul ignore next */
131- end . offset == null ? start . offset + 1 : end . offset ,
132- ]
133- const partialText = sourceText . slice ( ...range )
134- const fixed = broken
135- ? processSync ( partialText , physicalFilename , isMdx )
136- : remarkProcessor . processSync ( partialText ) . toString ( )
137- return fixer . replaceTextRange (
138- range ,
139- partialText . endsWith ( '\n' )
140- ? /* istanbul ignore next */ fixed
141- : fixed . slice ( 0 , - 1 ) , // remove redundant new line
142- )
143- } ,
147+ fix :
148+ fixedText === sourceText
149+ ? null
150+ : ( ) =>
151+ fixed ++
152+ ? null
153+ : {
154+ range : [ 0 , sourceText . length ] ,
155+ text : fixedText ,
156+ } ,
144157 } )
145158 }
146159 } ,
0 commit comments