bigint-mod-arith/build/rollup.config.js

242 lines
6.2 KiB
JavaScript
Raw Normal View History

2020-04-06 22:49:13 +00:00
'use strict'
2023-04-13 16:30:48 +00:00
import commonjs from '@rollup/plugin-commonjs'
import inject from '@rollup/plugin-inject'
2023-04-13 16:30:48 +00:00
import json from '@rollup/plugin-json'
import { nodeResolve as resolve } from '@rollup/plugin-node-resolve'
import replace from '@rollup/plugin-replace'
import terser from '@rollup/plugin-terser'
2023-04-13 16:30:48 +00:00
import rollupPluginTs from '@rollup/plugin-typescript'
import { existsSync, readFileSync } from 'fs'
2023-04-13 16:30:48 +00:00
import { dirname, join } from 'path'
import dts from 'rollup-plugin-dts'
import { compile } from './rollup-plugin-dts.js'
2023-04-13 16:30:48 +00:00
import { builtinModules } from 'module'
2020-04-06 22:49:13 +00:00
import * as url from 'url'
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
const rootDir = join(__dirname, '..')
const pkgJson = JSON.parse(readFileSync(join(rootDir, 'package.json')))
2023-04-13 16:30:48 +00:00
const pkgJsonLock = JSON.parse(readFileSync(join(rootDir, 'package-lock.json')))
const srcDir = join(rootDir, 'src', 'ts')
2020-04-06 22:49:13 +00:00
2023-04-13 16:30:48 +00:00
const tsConfigPath = join(rootDir, 'tsconfig.json')
2020-04-06 22:49:13 +00:00
function camelise (str) {
return str.replace(/-([a-z])/g,
function (m, w) {
return w.toUpperCase()
})
}
2023-04-13 16:30:48 +00:00
function isDevDependency (moduleName) {
const packageEntry = pkgJsonLock.packages['node_modules/' + moduleName]
return (packageEntry ?? {}).dev === true
}
const regex = /^(?:(?<scope>@.*?)\/)?(?<name>.*)/ // We are going to take only the package name part if there is a scope, e.g. @my-org/package-name
const { name } = pkgJson.name.match(regex).groups
const pkgCamelisedName = camelise(name)
2020-04-06 22:49:13 +00:00
const input = join(srcDir, 'index.ts')
if (existsSync(input) !== true) throw new Error('The entry point should be index.ts')
2023-04-13 16:30:48 +00:00
const tsPluginOptions = {
tsconfig: tsConfigPath,
outDir: undefined,
include: ['src/ts/**/*', 'build/typings/is-browser.d.ts'],
exclude: ['src/**/*.spec.ts']
}
const sourcemapOutputOptions = {
sourcemap: 'inline',
sourcemapExcludeSources: true
}
2020-04-06 22:49:13 +00:00
2023-04-13 16:30:48 +00:00
function compileDts (outDir) {
return {
name: 'compile-dts',
closeBundle () {
2023-04-13 16:30:48 +00:00
compile(outDir)
}
}
}
2023-04-13 16:30:48 +00:00
function resolveOnly (module) { // if a dev dependency is imported we will resolve it so that the dist modules always work
const moduleNameMatch = module.match(/^(?:@[a-z0-9_-]+\/)?(?:node:)?[a-z0-9_-]+/)
if (moduleNameMatch === null || moduleNameMatch.length !== 1) {
return false
}
const moduleName = moduleNameMatch[0].replace(/^node:/, '')
// don't resolve if it is a native module
if (builtinModules.includes(moduleName)) {
return false
}
if (isDevDependency(moduleName)) {
console.warn(`\x1b[33m⚠ WARM: dev dependency \x1b[0m${module}\x1b[33m being bundled. Should it be a dependency instead?\x1b[0m`)
return true
}
return false
}
const tmpDeclarationsDir = join(rootDir, '.types')
export default [
2023-04-13 16:30:48 +00:00
{ // Browser ESM
input,
2020-04-06 22:49:13 +00:00
output: [
{
2023-04-13 16:30:48 +00:00
file: join(rootDir, pkgJson.exports['.'].default.default),
...sourcemapOutputOptions,
2023-04-13 16:30:48 +00:00
format: 'es',
plugins: [
terser()
]
2020-04-06 22:49:13 +00:00
}
],
plugins: [
replace({
IS_BROWSER: true,
_MODULE_TYPE: "'ESM'",
preventAssignment: true
}),
2023-04-13 16:30:48 +00:00
rollupPluginTs(tsPluginOptions),
commonjs({ extensions: ['.js', '.cjs', '.jsx', '.cjsx'] }),
json(),
resolve({
browser: true,
exportConditions: ['browser', 'default'],
mainFields: ['browser', 'module', 'main'],
resolveOnly
})
2022-10-03 15:35:35 +00:00
]
},
{ // Browser bundles
input,
2022-10-03 15:35:35 +00:00
output: [
{
file: join(rootDir, pkgJson.exports['./esm-browser-bundle-nomin']),
format: 'es'
},
{
file: join(rootDir, pkgJson.exports['./esm-browser-bundle']),
format: 'es',
plugins: [terser()]
},
{
file: join(rootDir, pkgJson.exports['./iife-browser-bundle']),
format: 'iife',
name: pkgCamelisedName,
plugins: [terser()]
},
{
file: join(rootDir, pkgJson.exports['./umd-browser-bundle']),
format: 'umd',
name: pkgCamelisedName,
plugins: [terser()]
2022-10-03 15:35:35 +00:00
}
],
2022-10-03 15:35:35 +00:00
plugins: [
replace({
IS_BROWSER: true,
_MODULE_TYPE: "'BUNDLE'",
2022-10-03 15:35:35 +00:00
preventAssignment: true
}),
2023-04-13 16:30:48 +00:00
rollupPluginTs({
...tsPluginOptions,
sourceMap: false
}),
2023-04-13 16:30:48 +00:00
commonjs({ extensions: ['.js', '.cjs', '.jsx', '.cjsx'] }),
json(),
resolve({ browser: true })
2022-10-03 15:35:35 +00:00
]
2020-04-06 22:49:13 +00:00
},
{ // Node CJS
input,
2020-04-06 22:49:13 +00:00
output: [
{
file: join(rootDir, pkgJson.exports['.'].node.require.default),
2022-10-03 15:35:35 +00:00
...sourcemapOutputOptions,
format: 'cjs',
exports: 'auto',
plugins: [
terser()
]
2020-04-06 22:49:13 +00:00
}
],
plugins: [
2023-04-13 16:30:48 +00:00
replace({
'await import(': 'require(',
delimiters: ['', ''],
preventAssignment: true
}),
2020-04-06 22:49:13 +00:00
replace({
IS_BROWSER: false,
_MODULE_TYPE: "'CJS'",
preventAssignment: true
2020-04-06 22:49:13 +00:00
}),
2023-04-13 16:30:48 +00:00
rollupPluginTs(tsPluginOptions),
inject({
crypto: ['crypto', 'webcrypto']
}),
2023-04-13 16:30:48 +00:00
commonjs({ extensions: ['.js', '.cjs', '.jsx', '.cjsx'] }),
json(),
resolve({
exportConditions: ['node'],
resolveOnly
})
]
},
{ // Node ESM and type declarations
input,
output: [
{
file: join(rootDir, pkgJson.exports['.'].node.import.default),
...sourcemapOutputOptions,
format: 'es',
plugins: [
terser()
]
}
],
2020-04-06 22:49:13 +00:00
plugins: [
replace({
IS_BROWSER: false,
_MODULE_TYPE: "'ESM'",
__filename: `'${pkgJson.exports['.'].node.import.default}'`,
__dirname: `'${dirname(pkgJson.exports['.'].node.import.default)}'`,
preventAssignment: true
}),
2023-04-13 16:30:48 +00:00
rollupPluginTs(tsPluginOptions),
compileDts(tmpDeclarationsDir),
inject({
crypto: ['crypto', 'webcrypto']
2022-10-03 15:35:35 +00:00
}),
2023-04-13 16:30:48 +00:00
commonjs({ extensions: ['.js', '.cjs', '.jsx', '.cjsx'] }),
json(),
resolve({
exportConditions: ['node'],
resolveOnly
})
2022-10-03 15:35:35 +00:00
]
2023-04-13 16:30:48 +00:00
},
{
input: join(tmpDeclarationsDir, 'index.d.ts'),
output: [{ file: 'dist/index.d.ts', format: 'es' }],
plugins: [
dts({
respectExternal: true
})
],
external: (module) => {
if (/^[./]/.test(module)) {
return false
}
return !resolveOnly(module)
}
2020-04-06 22:49:13 +00:00
}
]