vue3-yuanma/rollup.config.js

214 lines
6.0 KiB
JavaScript
Raw Normal View History

import fs from 'fs'
import path from 'path'
import ts from 'rollup-plugin-typescript2'
import replace from '@rollup/plugin-replace'
import json from '@rollup/plugin-json'
2018-09-19 23:35:38 +08:00
if (!process.env.TARGET) {
throw new Error('TARGET package must be specified via --environment flag.')
}
2019-12-11 07:24:59 +08:00
const masterVersion = require('./package.json').version
2018-09-19 23:35:38 +08:00
const packagesDir = path.resolve(__dirname, 'packages')
const packageDir = path.resolve(packagesDir, process.env.TARGET)
const name = path.basename(packageDir)
const resolve = p => path.resolve(packageDir, p)
const pkg = require(resolve(`package.json`))
const packageOptions = pkg.buildOptions || {}
const knownExternals = fs.readdirSync(packagesDir).filter(p => {
return p !== '@vue/shared'
2018-09-19 23:35:38 +08:00
})
// ensure TS checks only once for each build
let hasTSChecked = false
const outputConfigs = {
2019-12-11 11:14:02 +08:00
'esm-bundler': {
2018-09-20 00:46:55 +08:00
file: resolve(`dist/${name}.esm-bundler.js`),
2018-09-19 23:35:38 +08:00
format: `es`
},
// main "vue" package only
'esm-bundler-runtime': {
file: resolve(`dist/${name}.runtime.esm-bundler.js`),
format: `es`
},
2018-09-19 23:35:38 +08:00
cjs: {
file: resolve(`dist/${name}.cjs.js`),
format: `cjs`
},
2018-09-20 00:46:55 +08:00
global: {
file: resolve(`dist/${name}.global.js`),
format: `iife`
2018-09-19 23:35:38 +08:00
},
2019-12-11 11:14:02 +08:00
esm: {
file: resolve(`dist/${name}.esm.js`),
2018-09-19 23:35:38 +08:00
format: `es`
}
}
2019-12-11 11:14:02 +08:00
const defaultFormats = ['esm-bundler', 'cjs']
const inlineFormats = process.env.FORMATS && process.env.FORMATS.split(',')
const packageFormats = inlineFormats || packageOptions.formats || defaultFormats
2019-09-20 12:31:14 +08:00
const packageConfigs = process.env.PROD_ONLY
? []
: packageFormats.map(format => createConfig(format, outputConfigs[format]))
2018-09-19 23:35:38 +08:00
if (process.env.NODE_ENV === 'production') {
packageFormats.forEach(format => {
2019-11-07 10:58:15 +08:00
if (format === 'cjs' && packageOptions.prod !== false) {
2018-09-19 23:35:38 +08:00
packageConfigs.push(createProductionConfig(format))
}
2019-12-11 11:14:02 +08:00
if (format === 'global' || format === 'esm') {
2018-09-19 23:35:38 +08:00
packageConfigs.push(createMinifiedConfig(format))
}
})
}
export default packageConfigs
2018-09-19 23:35:38 +08:00
function createConfig(format, output, plugins = []) {
if (!output) {
console.log(require('chalk').yellow(`invalid format: "${format}"`))
process.exit(1)
}
output.sourcemap = !!process.env.SOURCE_MAP
output.externalLiveBindings = false
const isProductionBuild =
process.env.__DEV__ === 'false' || /\.prod\.js$/.test(output.file)
const isGlobalBuild = format === 'global'
const isRawESMBuild = format === 'esm'
2020-01-24 11:23:10 +08:00
const isNodeBuild = format === 'cjs'
const isBundlerESMBuild = /esm-bundler/.test(format)
const isRuntimeCompileBuild = /vue\./.test(output.file)
2018-09-20 00:46:55 +08:00
if (isGlobalBuild) {
2018-09-19 23:35:38 +08:00
output.name = packageOptions.name
}
const shouldEmitDeclarations =
process.env.TYPES != null &&
process.env.NODE_ENV === 'production' &&
!hasTSChecked
2018-09-19 23:35:38 +08:00
const tsPlugin = ts({
check: process.env.NODE_ENV === 'production' && !hasTSChecked,
tsconfig: path.resolve(__dirname, 'tsconfig.json'),
cacheRoot: path.resolve(__dirname, 'node_modules/.rts2_cache'),
tsconfigOverride: {
compilerOptions: {
sourceMap: output.sourcemap,
declaration: shouldEmitDeclarations,
declarationMap: shouldEmitDeclarations
},
exclude: ['**/__tests__', 'test-dts']
2018-09-19 23:35:38 +08:00
}
})
// we only need to check TS and generate declarations once for each build.
// it also seems to run into weird issues when checking multiple times
// during a single build.
hasTSChecked = true
const entryFile =
format === 'esm-bundler-runtime' ? `src/runtime.ts` : `src/index.ts`
2020-01-24 11:23:10 +08:00
const external =
isGlobalBuild || isRawESMBuild
? []
: knownExternals.concat(Object.keys(pkg.dependencies || []))
2018-09-19 23:35:38 +08:00
return {
input: resolve(entryFile),
2018-09-20 00:46:55 +08:00
// Global and Browser ESM builds inlines everything so that they can be
2018-09-19 23:35:38 +08:00
// used alone.
2020-01-24 11:23:10 +08:00
external,
2018-09-19 23:35:38 +08:00
plugins: [
json({
namedExports: false
}),
2018-09-19 23:35:38 +08:00
tsPlugin,
2019-09-04 08:51:42 +08:00
createReplacePlugin(
isProductionBuild,
isBundlerESMBuild,
2020-01-24 11:23:10 +08:00
// isBrowserBuild?
(isGlobalBuild || isRawESMBuild || isBundlerESMBuild) &&
!packageOptions.enableNonBrowserBranches,
2020-01-24 11:23:10 +08:00
isRuntimeCompileBuild,
isNodeBuild
2019-09-04 08:51:42 +08:00
),
2018-09-19 23:35:38 +08:00
...plugins
],
output,
onwarn: (msg, warn) => {
if (!/Circular/.test(msg)) {
warn(msg)
}
}
}
}
function createReplacePlugin(
isProduction,
isBundlerESMBuild,
isBrowserBuild,
2020-01-24 11:23:10 +08:00
isRuntimeCompileBuild,
isNodeBuild
) {
const replacements = {
__COMMIT__: `"${process.env.COMMIT}"`,
2019-12-11 07:24:59 +08:00
__VERSION__: `"${masterVersion}"`,
__DEV__: isBundlerESMBuild
2018-09-20 00:46:55 +08:00
? // preserve to be handled by bundlers
2019-11-05 00:24:22 +08:00
`(process.env.NODE_ENV !== 'production')`
2018-09-20 00:46:55 +08:00
: // hard coded dev/prod builds
!isProduction,
2019-11-05 00:24:22 +08:00
// this is only used during tests
__TEST__: isBundlerESMBuild ? `(process.env.NODE_ENV === 'test')` : false,
2019-12-11 11:14:02 +08:00
// If the build is expected to run directly in the browser (global / esm builds)
__BROWSER__: isBrowserBuild,
// is targeting bundlers?
__BUNDLER__: isBundlerESMBuild,
// support compile in browser?
__RUNTIME_COMPILE__: isRuntimeCompileBuild,
2020-01-24 11:23:10 +08:00
// is targeting Node (SSR)?
__NODE_JS__: isNodeBuild,
2019-09-04 08:51:42 +08:00
// support options?
// the lean build drops options related code with buildOptions.lean: true
__FEATURE_OPTIONS__: !packageOptions.lean && !process.env.LEAN,
2019-11-05 00:24:22 +08:00
__FEATURE_SUSPENSE__: true
}
// allow inline overrides like
//__RUNTIME_COMPILE__=true yarn build runtime-core
Object.keys(replacements).forEach(key => {
if (key in process.env) {
replacements[key] = process.env[key]
}
2018-09-19 23:35:38 +08:00
})
return replace(replacements)
2018-09-19 23:35:38 +08:00
}
function createProductionConfig(format) {
return createConfig(format, {
2018-09-19 23:35:38 +08:00
file: resolve(`dist/${name}.${format}.prod.js`),
format: outputConfigs[format].format
2018-09-19 23:35:38 +08:00
})
}
function createMinifiedConfig(format) {
const { terser } = require('rollup-plugin-terser')
return createConfig(
format,
2018-09-19 23:35:38 +08:00
{
file: resolve(`dist/${name}.${format}.prod.js`),
format: outputConfigs[format].format
2018-09-19 23:35:38 +08:00
},
[
terser({
2018-09-20 00:46:55 +08:00
module: /^esm/.test(format)
2018-09-19 23:35:38 +08:00
})
]
)
}