118 lines
3.0 KiB
JavaScript
118 lines
3.0 KiB
JavaScript
/*
|
|
Produce prodcution builds and stitch toegether d.ts files.
|
|
|
|
To specific the package to build, simply pass its name and the desired build
|
|
formats to output (defaults to `buildOptions.formats` specified in that package,
|
|
or "esm,cjs"):
|
|
|
|
```
|
|
# name supports fuzzy match. will build all packages with name containing "dom":
|
|
yarn build dom
|
|
|
|
# specify the format to output
|
|
yarn build core --formats cjs
|
|
```
|
|
*/
|
|
|
|
const fs = require('fs-extra')
|
|
const path = require('path')
|
|
const zlib = require('zlib')
|
|
const chalk = require('chalk')
|
|
const execa = require('execa')
|
|
const { targets, fuzzyMatchTarget } = require('./utils')
|
|
|
|
const args = require('minimist')(process.argv.slice(2))
|
|
const target = args._[0]
|
|
const formats = args.formats || args.f
|
|
const buildAllMatching = args.all || args.a
|
|
;(async () => {
|
|
if (!target) {
|
|
await buildAll(targets)
|
|
checkAllSizes(targets)
|
|
} else {
|
|
await buildAll(fuzzyMatchTarget(target, buildAllMatching))
|
|
checkAllSizes(fuzzyMatchTarget(target, buildAllMatching))
|
|
}
|
|
})()
|
|
|
|
async function buildAll(targets) {
|
|
for (const target of targets) {
|
|
await build(target)
|
|
}
|
|
}
|
|
|
|
async function build(target) {
|
|
const pkgDir = path.resolve(`packages/${target}`)
|
|
const pkg = require(`${pkgDir}/package.json`)
|
|
|
|
await fs.remove(`${pkgDir}/dist`)
|
|
|
|
await execa(
|
|
'rollup',
|
|
[
|
|
'-c',
|
|
'--environment',
|
|
`NODE_ENV:production,` +
|
|
`TARGET:${target}` +
|
|
(formats ? `,FORMATS:${formats}` : ``) +
|
|
(args.types ? `,TYPES:true` : ``)
|
|
],
|
|
{ stdio: 'inherit' }
|
|
)
|
|
|
|
if (args.types && pkg.types) {
|
|
console.log()
|
|
console.log(
|
|
chalk.bold(chalk.yellow(`Rolling up type definitions for ${target}...`))
|
|
)
|
|
|
|
// build types
|
|
const { Extractor, ExtractorConfig } = require('@microsoft/api-extractor')
|
|
|
|
const extractorConfigPath = path.resolve(pkgDir, `api-extractor.json`)
|
|
const extractorConfig = ExtractorConfig.loadFileAndPrepare(
|
|
extractorConfigPath
|
|
)
|
|
const result = Extractor.invoke(extractorConfig, {
|
|
localBuild: true,
|
|
showVerboseMessages: true
|
|
})
|
|
|
|
if (result.succeeded) {
|
|
console.log(
|
|
chalk.bold(chalk.green(`API Extractor completed successfully.`))
|
|
)
|
|
} else {
|
|
console.error(
|
|
`API Extractor completed with ${extractorResult.errorCount} errors` +
|
|
` and ${extractorResult.warningCount} warnings`
|
|
)
|
|
process.exitCode = 1
|
|
}
|
|
|
|
await fs.remove(`${pkgDir}/dist/packages`)
|
|
}
|
|
}
|
|
|
|
function checkAllSizes(targets) {
|
|
console.log()
|
|
for (const target of targets) {
|
|
checkSize(target)
|
|
}
|
|
console.log()
|
|
}
|
|
|
|
function checkSize(target) {
|
|
const pkgDir = path.resolve(`packages/${target}`)
|
|
const esmProdBuild = `${pkgDir}/dist/${target}.esm-browser.prod.js`
|
|
if (fs.existsSync(esmProdBuild)) {
|
|
const file = fs.readFileSync(esmProdBuild)
|
|
const minSize = (file.length / 1024).toFixed(2) + 'kb'
|
|
const gzipped = zlib.gzipSync(file)
|
|
const gzipSize = (gzipped.length / 1024).toFixed(2) + 'kb'
|
|
console.log(
|
|
`${chalk.gray(chalk.bold(target))} min:${minSize} / gzip:${gzipSize}`
|
|
)
|
|
}
|
|
}
|