+import * as os from 'node:os'
+import { env } from 'node:process'
+import { dts } from 'rollup-plugin-dts'
+import terser from '@rollup/plugin-terser'
+import typescript from '@rollup/plugin-typescript'
import analyze from 'rollup-plugin-analyzer'
import command from 'rollup-plugin-command'
import del from 'rollup-plugin-delete'
-import istanbul from 'rollup-plugin-istanbul'
-import { terser } from 'rollup-plugin-terser'
-import ts from 'rollup-plugin-ts'
+import { defineConfig } from 'rollup'
-const isDevelopmentBuild = process.env.BUILD === 'development'
-const isAnalyze = process.env.ANALYZE
-const isDocumentation = process.env.DOCUMENTATION
+const availableParallelism = () => {
+ let availableParallelism = 1
+ try {
+ availableParallelism = os.availableParallelism()
+ } catch {
+ const cpus = os.cpus()
+ if (Array.isArray(cpus) && cpus.length > 0) {
+ availableParallelism = cpus.length
+ }
+ }
+ return availableParallelism
+}
+
+const isDevelopmentBuild = env.BUILD === 'development'
+const isAnalyzeBuild = env.ANALYZE
+const isDocumentationBuild = env.DOCUMENTATION
+const sourcemap = env.SOURCEMAP !== 'false'
-export default {
- input: 'src/index.ts',
- output: {
- ...(isDevelopmentBuild ? { dir: 'lib' } : { file: 'lib/index.js' }),
- format: 'cjs',
- sourcemap: !!isDevelopmentBuild,
- ...(isDevelopmentBuild && { preserveModules: true }),
- ...(isDevelopmentBuild && { preserveModulesRoot: 'src' }),
- ...(!isDevelopmentBuild && { plugins: [terser({ numWorkers: 2 })] })
+const maxWorkers = Math.floor(availableParallelism() / 2)
+
+export default defineConfig([
+ {
+ input: './src/index.ts',
+ strictDeprecations: true,
+ output: [
+ {
+ format: 'cjs',
+ ...(isDevelopmentBuild && {
+ dir: './lib',
+ entryFileNames: '[name].cjs',
+ chunkFileNames: '[name]-[hash].cjs',
+ preserveModules: true,
+ preserveModulesRoot: './src'
+ }),
+ ...(!isDevelopmentBuild && {
+ file: './lib/index.cjs',
+ plugins: [terser({ maxWorkers })]
+ }),
+ ...(sourcemap && {
+ sourcemap
+ })
+ },
+ {
+ format: 'esm',
+ ...(isDevelopmentBuild && {
+ dir: './lib',
+ entryFileNames: '[name].mjs',
+ chunkFileNames: '[name]-[hash].mjs',
+ preserveModules: true,
+ preserveModulesRoot: './src'
+ }),
+ ...(!isDevelopmentBuild && {
+ file: './lib/index.mjs',
+ plugins: [terser({ maxWorkers })]
+ }),
+ ...(sourcemap && {
+ sourcemap
+ })
+ }
+ ],
+ external: [/^node:*/],
+ plugins: [
+ typescript({
+ tsconfig: './tsconfig.build.json',
+ compilerOptions: {
+ sourceMap: sourcemap
+ }
+ }),
+ del({
+ targets: ['./lib/*']
+ }),
+ Boolean(isAnalyzeBuild) && analyze(),
+ Boolean(isDocumentationBuild) && command('pnpm typedoc')
+ ]
},
- external: ['async_hooks', 'cluster', 'events', 'worker_threads'],
- plugins: [
- ts({
- tsconfig: isDevelopmentBuild
- ? 'tsconfig.development.json'
- : 'tsconfig.json',
- browserslist: false
- }),
- isDevelopmentBuild && istanbul(),
- del({
- targets: ['lib/*']
- }),
- isAnalyze && analyze(),
- isDocumentation && command('npm run typedoc')
- ]
-}
+ {
+ input: './lib/dts/index.d.ts',
+ output: [{ format: 'esm', file: './lib/index.d.ts' }],
+ external: [/^node:*/],
+ plugins: [
+ dts(),
+ del({
+ targets: ['./lib/dts'],
+ hook: 'buildEnd'
+ }),
+ Boolean(isAnalyzeBuild) && analyze()
+ ]
+ }
+])