Skip to content

Commit ec8d5d3

Browse files
committed
feat(rolldown): write config for debugging
1 parent 392042f commit ec8d5d3

File tree

2 files changed

+93
-7
lines changed

2 files changed

+93
-7
lines changed

src/features/rolldown.ts

Lines changed: 78 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
1+
import { mkdtemp, writeFile } from 'node:fs/promises'
2+
import { tmpdir } from 'node:os'
3+
import { join } from 'node:path'
4+
import util, { type InspectOptionsStylized } from 'node:util'
15
import Debug from 'debug'
6+
import {
7+
VERSION as rolldownVersion,
8+
type BuildOptions,
9+
type InputOptions,
10+
type OutputOptions,
11+
type RolldownPluginOption,
12+
} from 'rolldown'
213
import { importGlobPlugin } from 'rolldown/experimental'
14+
import { version } from '../../package.json'
315
import {
416
mergeUserOptions,
517
type DtsOptions,
@@ -15,12 +27,6 @@ import { resolveChunkAddon, resolveChunkFilename } from './output'
1527
import { ReportPlugin } from './report'
1628
import { ShebangPlugin } from './shebang'
1729
import { getShimsInject } from './shims'
18-
import type {
19-
BuildOptions,
20-
InputOptions,
21-
OutputOptions,
22-
RolldownPluginOption,
23-
} from 'rolldown'
2430

2531
const debug = Debug('tsdown:rolldown')
2632

@@ -234,3 +240,69 @@ export async function resolveOutputOptions(
234240
)
235241
return outputOptions
236242
}
243+
244+
export async function getDebugRolldownDir(): Promise<string | undefined> {
245+
if (!debug.enabled) return
246+
return await mkdtemp(join(tmpdir(), 'tsdown-config-'))
247+
}
248+
249+
export async function debugBuildOptions(
250+
dir: string,
251+
name: string | undefined,
252+
format: NormalizedFormat,
253+
buildOptions: BuildOptions,
254+
): Promise<void> {
255+
const outFile = join(dir, `tsdown.config.${format}.js`)
256+
257+
handlePluginInspect(buildOptions.plugins)
258+
const serialized = util.formatWithOptions(
259+
{
260+
depth: null,
261+
maxArrayLength: null,
262+
maxStringLength: null,
263+
},
264+
buildOptions,
265+
)
266+
const code = `/*
267+
Auto-generated rolldown config for tsdown debug purposes
268+
tsdown v${version}, rolldown v${rolldownVersion}
269+
Generated on ${new Date().toISOString()}
270+
Package name: ${name || 'not specified'}
271+
*/
272+
273+
export default ${serialized}\n`
274+
await writeFile(outFile, code)
275+
debug(
276+
'Wrote debug rolldown config for "%s" (%s) -> %s',
277+
name || 'default name',
278+
format,
279+
outFile,
280+
)
281+
}
282+
283+
function handlePluginInspect(plugins: RolldownPluginOption) {
284+
if (Array.isArray(plugins)) {
285+
for (const plugin of plugins) {
286+
handlePluginInspect(plugin)
287+
}
288+
} else if (
289+
typeof plugins === 'object' &&
290+
plugins !== null &&
291+
'name' in plugins
292+
) {
293+
;(plugins as any)[util.inspect.custom] = function (
294+
depth: number,
295+
options: InspectOptionsStylized,
296+
inspect: typeof util.inspect,
297+
) {
298+
if ('_options' in plugins) {
299+
return inspect(
300+
{ name: plugins.name, options: (plugins as any)._options },
301+
options,
302+
)
303+
} else {
304+
return `"rolldown plugin: ${plugins.name}"`
305+
}
306+
}
307+
}
308+
}

src/index.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ import { copy } from './features/copy'
1212
import { writeExports, type TsdownChunks } from './features/exports'
1313
import { createHooks } from './features/hooks'
1414
import { publint } from './features/publint'
15-
import { getBuildOptions } from './features/rolldown'
15+
import {
16+
debugBuildOptions,
17+
getBuildOptions,
18+
getDebugRolldownDir,
19+
} from './features/rolldown'
1620
import { shortcuts } from './features/shortcuts'
1721
import { watchBuild } from './features/watch'
1822
import { resolveOptions, type Options, type ResolvedOptions } from './options'
@@ -104,6 +108,8 @@ export async function buildSingle(
104108
let hasErrors = false
105109
const isMultiFormat = formats.length > 1
106110
const chunks: TsdownChunks = {}
111+
const debugRolldownDir = await getDebugRolldownDir()
112+
107113
await Promise.all(
108114
formats.map(async (format) => {
109115
try {
@@ -117,6 +123,14 @@ export async function buildSingle(
117123
...context,
118124
buildOptions,
119125
})
126+
if (debugRolldownDir) {
127+
await debugBuildOptions(
128+
debugRolldownDir,
129+
config.name,
130+
format,
131+
buildOptions,
132+
)
133+
}
120134
const { output } = await rolldownBuild(buildOptions)
121135
chunks[format] = output
122136
if (format === 'cjs' && dts) {

0 commit comments

Comments
 (0)