blob: d7388368c91c74e2f34bba74d0f1c80a1981e756 [file] [edit]
#!/usr/bin/env node
/*!
* Script to build our plugins to use them separately.
* Copyright 2020-2026 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
import path from 'node:path'
import { fileURLToPath } from 'node:url'
import { globby } from 'globby'
import { rolldown } from 'rolldown'
import banner from './banner.mjs'
import browserTargets from './browser-targets.mjs'
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const sourcePath = path.resolve(__dirname, '../js/src/').replace(/\\/g, '/')
const distPath = path.resolve(__dirname, '../js/dist/').replace(/\\/g, '/')
const tsFiles = await globby(`${sourcePath}/**/*.ts`)
// Array which holds the resolved plugins. The package entry (js/src/index.ts)
// is built by the same loop; its type declarations come from `js-emit-types`.
const resolvedPlugins = []
for (const file of tsFiles) {
resolvedPlugins.push({
src: file,
dist: file.replace(sourcePath, distPath).replace(/\.ts$/, '.js'),
fileName: path.basename(file).replace(/\.ts$/, '.js')
})
}
const build = async plugin => {
const bundle = await rolldown({
input: plugin.src,
// Keep every import external, so each plugin file mirrors its source module
external: () => true,
resolve: {
// Map ESM-style `.js` specifiers to the `.ts` sources on disk
extensionAlias: { '.js': ['.ts', '.js'] }
},
transform: {
target: browserTargets
}
})
await bundle.write({
banner: banner(plugin.fileName),
format: 'esm',
sourcemap: true,
file: plugin.dist
})
await bundle.close()
console.log(`Built ${plugin.fileName}`)
}
(async () => {
try {
const basename = path.basename(__filename)
const timeLabel = `[${basename}] finished`
console.log('Building individual plugins...')
console.time(timeLabel)
await Promise.all(Object.values(resolvedPlugins).map(plugin => build(plugin)))
console.timeEnd(timeLabel)
} catch (error) {
console.error(error)
process.exit(1)
}
})()