Skip to content

Commit 685627a

Browse files
authored
Turn vfile messages into Rollup logs (#2682)
During compilation, plugins may log vfile messages onto the vfile. Some integrations already handle these. The Rollup plugin did not. This change makes the Rollup plugin handle messages. Fatal messages are unhandled on purpose. They are supposed to be thrown. Even if they are not thrown, Rollup’s `this.error()` throws. So instead, those are treated as warnings.
1 parent a2edddc commit 685627a

2 files changed

Lines changed: 157 additions & 1 deletion

File tree

packages/rollup/lib/index.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* @import {FormatAwareProcessors} from '@mdx-js/mdx/internal-create-format-aware-processors'
33
* @import {CompileOptions} from '@mdx-js/mdx'
44
* @import {FilterPattern} from '@rollup/pluginutils'
5+
* @import {VFileMessage} from 'vfile-message'
56
* @import * as vite from 'vite'
67
*/
78

@@ -78,6 +79,15 @@ export function rollup(options) {
7879
formatAwareProcessors.extnames.includes(file.extname)
7980
) {
8081
const compiled = await formatAwareProcessors.process(file)
82+
83+
for (const message of compiled.messages) {
84+
if (message.fatal === undefined || message.fatal === null) {
85+
this.info(vfileToRollup(message))
86+
} else {
87+
this.warn(vfileToRollup(message))
88+
}
89+
}
90+
8191
const code = String(compiled.value)
8292
return {code, map: compiled.map}
8393
}
@@ -86,3 +96,47 @@ export function rollup(options) {
8696

8797
return plugin
8898
}
99+
100+
/**
101+
* Turn a vfile message into a Rollup log.
102+
*
103+
* @param {VFileMessage} message
104+
* Message.
105+
* @returns {vite.Rollup.RollupLog}
106+
* Log.
107+
*/
108+
function vfileToRollup(message) {
109+
/** @type {vite.Rollup.RollupLog} */
110+
const log = {
111+
message: message.reason,
112+
cause: message
113+
}
114+
115+
if (
116+
message.line !== undefined &&
117+
message.line !== null &&
118+
message.column !== undefined &&
119+
message.column !== null
120+
) {
121+
log.loc = {
122+
file: message.file,
123+
line: message.line,
124+
column: message.column
125+
}
126+
}
127+
128+
if (message.source || message.ruleId) {
129+
let pluginCode = message.source || ''
130+
if (message.ruleId) {
131+
if (pluginCode) {
132+
pluginCode += ':'
133+
}
134+
135+
pluginCode += message.ruleId
136+
}
137+
138+
log.pluginCode = pluginCode
139+
}
140+
141+
return log
142+
}

packages/rollup/test/index.js

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
/**
2+
* @import {Root} from 'mdast'
23
* @import {MDXModule} from 'mdx/types.js'
3-
* @import {RollupOutput} from 'rollup'
4+
* @import {RollupOutput, RollupLog} from 'rollup'
5+
* @import {VFileMessage} from 'vfile-message'
46
*/
57

68
import assert from 'node:assert/strict'
@@ -125,6 +127,106 @@ test('@mdx-js/rollup', async function (t) {
125127
assert.match(code, /jsxs?\(/)
126128
})
127129

130+
await t.test('should log vfile messages', async () => {
131+
/** @type {VFileMessage | undefined} */
132+
let info
133+
/** @type {VFileMessage | undefined} */
134+
let withRuleId
135+
/** @type {VFileMessage | undefined} */
136+
let withSource
137+
/** @type {VFileMessage | undefined} */
138+
let withSourceAndRuleId
139+
/** @type {RollupLog[]} */
140+
const logs = []
141+
const input = fileURLToPath(new URL('vite-entry.mdx', import.meta.url))
142+
143+
await rollup({
144+
external: ['react/jsx-runtime'],
145+
input,
146+
onLog(level, log) {
147+
logs.push(
148+
/** @type {RollupLog} */ (
149+
// Strip symbol keys
150+
Object.fromEntries(Object.entries(log))
151+
)
152+
)
153+
},
154+
plugins: [
155+
rollupMdx({
156+
remarkPlugins: [
157+
() =>
158+
/**
159+
* @param {Root} ast
160+
*/
161+
(ast, file) => {
162+
info = file.info('info with location', ast)
163+
withSource = file.message('warning with source', {
164+
source: 'source'
165+
})
166+
withRuleId = file.message('warning with ruleId', {
167+
ruleId: 'rule-id'
168+
})
169+
withSourceAndRuleId = file.message(
170+
'warning with source and ruleId',
171+
{
172+
source: 'source',
173+
ruleId: 'rule-id'
174+
}
175+
)
176+
}
177+
]
178+
})
179+
]
180+
})
181+
182+
assert.deepEqual(logs, [
183+
{
184+
cause: info,
185+
code: 'PLUGIN_LOG',
186+
hook: 'transform',
187+
id: input,
188+
loc: {
189+
column: 1,
190+
file: input,
191+
line: 1
192+
},
193+
message:
194+
'[plugin @mdx-js/rollup] test/vite-entry.mdx (1:1): info with location',
195+
plugin: '@mdx-js/rollup'
196+
},
197+
{
198+
cause: withSource,
199+
code: 'PLUGIN_WARNING',
200+
hook: 'transform',
201+
id: input,
202+
message:
203+
'[plugin @mdx-js/rollup] test/vite-entry.mdx: warning with source',
204+
plugin: '@mdx-js/rollup',
205+
pluginCode: 'source'
206+
},
207+
{
208+
cause: withRuleId,
209+
code: 'PLUGIN_WARNING',
210+
hook: 'transform',
211+
id: input,
212+
message:
213+
'[plugin @mdx-js/rollup] test/vite-entry.mdx: warning with ruleId',
214+
plugin: '@mdx-js/rollup',
215+
pluginCode: 'rule-id'
216+
},
217+
{
218+
cause: withSourceAndRuleId,
219+
code: 'PLUGIN_WARNING',
220+
hook: 'transform',
221+
id: input,
222+
message:
223+
'[plugin @mdx-js/rollup] test/vite-entry.mdx: warning with source and ruleId',
224+
plugin: '@mdx-js/rollup',
225+
pluginCode: 'source:rule-id'
226+
}
227+
])
228+
})
229+
128230
await t.test('should support the `?raw` query', async () => {
129231
const result = /** @type {Array<RollupOutput>} */ (
130232
await build({

0 commit comments

Comments
 (0)