Skip to content

Commit 149dc4b

Browse files
committed
fix: apply failOnWarn to rolldown logs
closes #759
1 parent 49cc5f9 commit 149dc4b

File tree

5 files changed

+51
-17
lines changed

5 files changed

+51
-17
lines changed

dts.snapshot.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@
102102
"Format": "type Format = ModuleFormat",
103103
"globalLogger": "Logger",
104104
"InlineConfig": "interface InlineConfig extends UserConfig {\n config?: boolean | string\n configLoader?: 'auto' | 'native' | 'unrun'\n filter?: RegExp | Arrayable<string>\n}",
105-
"Logger": "interface Logger {\n level: LogLevel\n info: (...args: any[]) => void\n warn: (...args: any[]) => void\n warnOnce: (...args: any[]) => void\n error: (...args: any[]) => void\n success: (...args: any[]) => void\n clearScreen: (_: LogType) => void\n}",
105+
"Logger": "interface Logger {\n level: LogLevel\n options?: LoggerOptions\n info: (...args: any[]) => void\n warn: (...args: any[]) => void\n warnOnce: (...args: any[]) => void\n error: (...args: any[]) => void\n success: (...args: any[]) => void\n clearScreen: (_: LogType) => void\n}",
106+
"LoggerOptions": "interface LoggerOptions {\n allowClearScreen?: boolean\n customLogger?: Logger\n console?: Console\n failOnWarn?: boolean\n}",
106107
"LogLevel": "type LogLevel = LogType | 'silent'",
107108
"LogType": "type LogType = 'error' | 'warn' | 'info'",
108109
"MarkPartial": "type MarkPartial<T, K extends keyof T> = Omit<Required<T>, K> & Partial<Pick<T, K>>",

src/features/rolldown.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -211,13 +211,14 @@ async function resolveInputOptions(
211211
plugins,
212212
moduleTypes: loader,
213213
logLevel: logger.level === 'error' ? 'silent' : logger.level,
214-
onLog: cjsDefault
215-
? (level, log, defaultHandler) => {
216-
// suppress mixed export warnings if cjsDefault is enabled
217-
if (log.code === 'MIXED_EXPORT') return
218-
defaultHandler(level, log)
219-
}
220-
: undefined,
214+
onLog(level, log, defaultHandler) {
215+
// suppress mixed export warnings if cjsDefault is enabled
216+
if (cjsDefault && log.code === 'MIXED_EXPORT') return
217+
if (logger.options?.failOnWarn && level === 'warn') {
218+
defaultHandler('error', log)
219+
}
220+
defaultHandler(level, log)
221+
},
221222
devtools: devtools || undefined,
222223
checks,
223224
},

src/utils/logger.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export const LogLevels: Record<LogLevel, number> = {
2323

2424
export interface Logger {
2525
level: LogLevel
26+
options?: LoggerOptions
2627
info: (...args: any[]) => void
2728
warn: (...args: any[]) => void
2829
warnOnce: (...args: any[]) => void
@@ -47,13 +48,18 @@ const warnedMessages = new Set<string>()
4748

4849
export function createLogger(
4950
level: LogLevel = 'info',
50-
{
51-
customLogger,
52-
console = globalThis.console,
53-
failOnWarn = false,
54-
allowClearScreen = true,
55-
}: LoggerOptions = {},
51+
options: LoggerOptions = {},
5652
): Logger {
53+
const resolvedOptions = {
54+
allowClearScreen: true,
55+
failOnWarn: false,
56+
console: globalThis.console,
57+
...options,
58+
}
59+
/// keep-sorted
60+
const { allowClearScreen, console, customLogger, failOnWarn } =
61+
resolvedOptions
62+
5763
if (customLogger) {
5864
return customLogger
5965
}
@@ -72,6 +78,7 @@ export function createLogger(
7278

7379
const logger: Logger = {
7480
level,
81+
options: resolvedOptions,
7582

7683
info(...msgs: any[]): void {
7784
output('info', `${blue`ℹ`} ${format(msgs)}`)

tests/e2e.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,3 +785,19 @@ test('externalize @types/foo', async (context) => {
785785
expect(fileMap['index.mjs']).toContain('1.0.0')
786786
expect(fileMap['index.d.mts']).toContain('from "foo"')
787787
})
788+
789+
test('failOnWarn', async (context) => {
790+
const files = {
791+
'index.ts': `import 'unresolved'`,
792+
}
793+
794+
await expect(
795+
testBuild({
796+
context,
797+
files,
798+
options: {
799+
failOnWarn: true,
800+
},
801+
}),
802+
).rejects.toThrow('Module not found')
803+
})

tests/utils.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { glob } from 'tinyglobby'
77
import { mergeUserOptions } from '../src/config/options.ts'
88
import { build } from '../src/index.ts'
99
import type { InlineConfig, TsdownBundle } from '../src/config/index.ts'
10-
import type { RollupLog } from 'rolldown'
10+
import type { LogOrStringHandler, RollupLog } from 'rolldown'
1111
import type { RunnerTask, TestContext } from 'vitest'
1212

1313
const dirname = path.dirname(fileURLToPath(import.meta.url))
@@ -144,17 +144,26 @@ export async function testBuild({
144144
dts: false,
145145
logLevel: 'silent',
146146
tsconfig: false,
147+
failOnWarn: false,
147148
...userOptions,
148149
async inputOptions(options, ...args) {
150+
const originalOnLog = options.onLog
149151
options = await mergeUserOptions(
150152
{
151153
...options,
152154
onLog(level, log, defaultHandler) {
153155
if (level === 'warn') {
154156
warnings.push(log)
155-
return
156157
}
157-
defaultHandler(level, log)
158+
const _defaultHandler: LogOrStringHandler = (level, ...args) => {
159+
if (level !== 'error') return
160+
defaultHandler(level, ...args)
161+
}
162+
if (originalOnLog) {
163+
originalOnLog(level, log, _defaultHandler)
164+
} else {
165+
_defaultHandler(level, log)
166+
}
158167
},
159168
logLevel: 'info',
160169
},

0 commit comments

Comments
 (0)