@samual/rolldown-config
Version:
My Rolldown config
95 lines (94 loc) • 3 kB
JavaScript
import { parseAsync, traverse } from "@babel/core"
import babelPluginSyntaxTypescript from "@babel/plugin-syntax-typescript"
import babelPresetEnv from "@babel/preset-env"
import babelPresetTypescript from "@babel/preset-typescript"
import { babel } from "@rollup/plugin-babel"
import terser from "@rollup/plugin-terser"
import { expect } from "@samual/assert"
import { babelPluginHere } from "babel-plugin-here"
import { babelPluginVitest } from "babel-plugin-vitest"
import { defu } from "defu"
import { readdir } from "fs/promises"
import { cpus } from "os"
import * as Path from "path"
import prettier from "rollup-plugin-prettier"
const rolldownConfig = async ({
sourcePath = "src",
rolldownOptions,
babelOptions,
terserOptions,
prettierOptions,
experimental
} = {}) =>
defu(rolldownOptions, {
external: source => !(Path.isAbsolute(source) || source.startsWith(".")),
input: Object.fromEntries(
(await readdir(sourcePath, { withFileTypes: !0, recursive: !0 }))
.filter(dirent => dirent.isFile())
.map(dirent => Path.join((dirent => dirent.parentPath ?? dirent.path)(dirent), dirent.name))
.filter(
path =>
(path.endsWith(".js") && !path.endsWith(".test.js")) ||
(path.endsWith(".ts") && !path.endsWith(".d.ts") && !path.endsWith(".test.ts"))
)
.map(path => [path.slice(sourcePath.length + 1, -3), path])
),
output: { dir: "dist" },
plugins: [
babel(
defu(babelOptions, {
babelHelpers: "bundled",
extensions: [".ts"],
presets: [
[babelPresetEnv, { targets: { node: "20.10" } }],
[babelPresetTypescript, { allowDeclareFields: !0, optimizeConstEnums: !0 }]
],
plugins: [babelPluginHere(), babelPluginVitest()]
})
),
terser(
defu(terserOptions, {
compress: { passes: Infinity, unsafe: !0, sequences: !1, keep_infinity: !0 },
maxWorkers: Math.floor(cpus().length / 2),
mangle: !1,
ecma: 2020
})
),
experimental?.noSideEffects && {
name: "no-side-effects",
async renderChunk(code) {
const ast = expect(await parseAsync(code, { plugins: [babelPluginSyntaxTypescript] })),
indexes = []
traverse(ast, {
Function(path) {
!path.node.loc ||
path.node.type.endsWith("Method") ||
(path.isExpression() && "VariableDeclarator" != path.parentPath.node.type) ||
!path.isPure() ||
indexes.push(path.node.loc.start.index)
}
})
indexes.sort((a, b) => b - a)
for (const index of indexes)
code = `${code.slice(0, index)}/*@__NO_SIDE_EFFECTS__*/${code.slice(index)}`
return code
}
},
experimental?.disablePrettier
? void 0
: prettier(
defu(prettierOptions, {
parser: "espree",
useTabs: !0,
tabWidth: 4,
arrowParens: "avoid",
printWidth: 120,
semi: !1,
trailingComma: "none"
})
)
],
preserveEntrySignatures: "strict",
treeshake: { moduleSideEffects: !1 }
})
export { rolldownConfig }