0
0
mirror of https://github.com/twbs/bootstrap.git synced 2024-12-01 13:24:25 +01:00
Bootstrap/build/build-plugins.js

190 lines
4.8 KiB
JavaScript
Raw Normal View History

#!/usr/bin/env node
/*!
* Script to build our plugins to use them separately.
2021-01-07 11:12:53 +01:00
* Copyright 2020-2021 The Bootstrap Authors
* Copyright 2020-2021 Twitter, Inc.
2020-06-16 20:41:47 +02:00
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
'use strict'
2019-02-26 12:20:34 +01:00
const path = require('path')
const rollup = require('rollup')
const { babel } = require('@rollup/plugin-babel')
2019-02-26 12:20:34 +01:00
const banner = require('./banner.js')
2020-06-19 10:17:01 +02:00
const rootPath = path.resolve(__dirname, '../js/dist/')
const plugins = [
babel({
2019-02-26 12:20:34 +01:00
// Only transpile our source code
exclude: 'node_modules/**',
// Include the helpers in each file, at most one copy of each
babelHelpers: 'bundled'
})
]
const bsPlugins = {
2018-07-25 11:29:16 +02:00
Data: path.resolve(__dirname, '../js/src/dom/data.js'),
EventHandler: path.resolve(__dirname, '../js/src/dom/event-handler.js'),
2018-07-25 11:29:16 +02:00
Manipulator: path.resolve(__dirname, '../js/src/dom/manipulator.js'),
SelectorEngine: path.resolve(__dirname, '../js/src/dom/selector-engine.js'),
Alert: path.resolve(__dirname, '../js/src/alert.js'),
Base: path.resolve(__dirname, '../js/src/base-component.js'),
Button: path.resolve(__dirname, '../js/src/button.js'),
Carousel: path.resolve(__dirname, '../js/src/carousel.js'),
Collapse: path.resolve(__dirname, '../js/src/collapse.js'),
Dropdown: path.resolve(__dirname, '../js/src/dropdown.js'),
Modal: path.resolve(__dirname, '../js/src/modal.js'),
Offcanvas as component (#29017) * Add a new offcanvas component * offcanvas.js: switch to string constants and `event.key` * Remove unneeded code * Sass optimizations * Fixes Make sure the element is hidden and not offscreen when inactive fix close icon negative margins Add content in right & bottom examples Re-fix bottom offcanvas height not to cover all viewport * Wording tweaks * update tests and offcanvas class * separate scrollbar functionality and use it in offcanvas * Update .bundlewatch.config.json * fix focus * update btn-close / fix focus on close * add aria-modal and role return focus on trigger when offcanvas is closed change body scrolling timings * move common code to reusable functions * add aria-labelledby * Replace lorem ipsum text * fix focus when offcanvas is closed * updates * revert modal, add tests for scrollbar * show backdrop by default * Update offcanvas.md * Update offcanvas CSS to better match modals - Add background-clip for borders - Move from outline to border (less clever, more consistent) - Add scss-docs in vars * Revamp offcanvas docs - Add static example to show and explain the components - Split live examples and rename them - Simplify example content - Expand docs notes elsewhere - Add sass docs * Add .offcanvas-title instead of .modal-title * Rename offcanvas example to offcanvas-navbar to reflect it's purpose * labelledby references title and not header * Add default shadow to offcanvas * enable offcanvas-body to fill all the remaining wrapper area * Be more descriptive, on Accessibility area * remove redundant classes * ensure in case of an already open offcanvas, not to open another one * bring back backdrop|scroll combinations * bring back toggling class * refactor scrollbar method, plus tests * add check if element is not full-width, according to #30621 * revert all in modal * use documentElement innerWidth * Rename classes to -start and -end Also copyedit some docs wording * omit some things on scrollbar * PASS BrowserStack tests -- IOS devices, Android devices and Browsers on Mac, hide scrollbar by default and appear it, only while scrolling. * Rename '_handleClosing' to '_addEventListeners' * change pipe usage to comma * change Data.getData to Data.get Co-authored-by: XhmikosR <xhmikosr@gmail.com> Co-authored-by: Martijn Cuppens <martijn.cuppens@gmail.com> Co-authored-by: Mark Otto <markdotto@gmail.com>
2021-03-02 18:10:10 +01:00
OffCanvas: path.resolve(__dirname, '../js/src/offcanvas.js'),
Popover: path.resolve(__dirname, '../js/src/popover.js'),
ScrollSpy: path.resolve(__dirname, '../js/src/scrollspy.js'),
Tab: path.resolve(__dirname, '../js/src/tab.js'),
Toast: path.resolve(__dirname, '../js/src/toast.js'),
Tooltip: path.resolve(__dirname, '../js/src/tooltip.js')
}
2018-07-25 11:29:16 +02:00
const defaultPluginConfig = {
external: [
bsPlugins.Data,
bsPlugins.Base,
2018-07-25 11:29:16 +02:00
bsPlugins.EventHandler,
bsPlugins.SelectorEngine
2018-07-25 11:29:16 +02:00
],
globals: {
[bsPlugins.Data]: 'Data',
[bsPlugins.Base]: 'Base',
2018-07-25 11:29:16 +02:00
[bsPlugins.EventHandler]: 'EventHandler',
[bsPlugins.SelectorEngine]: 'SelectorEngine'
2018-07-25 11:29:16 +02:00
}
}
const getConfigByPluginKey = pluginKey => {
2018-07-25 11:29:16 +02:00
if (
pluginKey === 'Data' ||
pluginKey === 'Manipulator' ||
2019-03-16 15:10:23 +01:00
pluginKey === 'EventHandler' ||
pluginKey === 'SelectorEngine' ||
pluginKey === 'Util' ||
pluginKey === 'Sanitizer'
2018-07-25 11:29:16 +02:00
) {
return {
2020-10-26 15:39:23 +01:00
external: []
2018-07-25 11:29:16 +02:00
}
}
Offcanvas as component (#29017) * Add a new offcanvas component * offcanvas.js: switch to string constants and `event.key` * Remove unneeded code * Sass optimizations * Fixes Make sure the element is hidden and not offscreen when inactive fix close icon negative margins Add content in right & bottom examples Re-fix bottom offcanvas height not to cover all viewport * Wording tweaks * update tests and offcanvas class * separate scrollbar functionality and use it in offcanvas * Update .bundlewatch.config.json * fix focus * update btn-close / fix focus on close * add aria-modal and role return focus on trigger when offcanvas is closed change body scrolling timings * move common code to reusable functions * add aria-labelledby * Replace lorem ipsum text * fix focus when offcanvas is closed * updates * revert modal, add tests for scrollbar * show backdrop by default * Update offcanvas.md * Update offcanvas CSS to better match modals - Add background-clip for borders - Move from outline to border (less clever, more consistent) - Add scss-docs in vars * Revamp offcanvas docs - Add static example to show and explain the components - Split live examples and rename them - Simplify example content - Expand docs notes elsewhere - Add sass docs * Add .offcanvas-title instead of .modal-title * Rename offcanvas example to offcanvas-navbar to reflect it's purpose * labelledby references title and not header * Add default shadow to offcanvas * enable offcanvas-body to fill all the remaining wrapper area * Be more descriptive, on Accessibility area * remove redundant classes * ensure in case of an already open offcanvas, not to open another one * bring back backdrop|scroll combinations * bring back toggling class * refactor scrollbar method, plus tests * add check if element is not full-width, according to #30621 * revert all in modal * use documentElement innerWidth * Rename classes to -start and -end Also copyedit some docs wording * omit some things on scrollbar * PASS BrowserStack tests -- IOS devices, Android devices and Browsers on Mac, hide scrollbar by default and appear it, only while scrolling. * Rename '_handleClosing' to '_addEventListeners' * change pipe usage to comma * change Data.getData to Data.get Co-authored-by: XhmikosR <xhmikosr@gmail.com> Co-authored-by: Martijn Cuppens <martijn.cuppens@gmail.com> Co-authored-by: Mark Otto <markdotto@gmail.com>
2021-03-02 18:10:10 +01:00
if (pluginKey === 'Alert' || pluginKey === 'Tab' || pluginKey === 'OffCanvas') {
2018-07-25 11:29:16 +02:00
return defaultPluginConfig
}
2018-07-25 11:29:16 +02:00
if (
pluginKey === 'Base' ||
2018-07-25 11:29:16 +02:00
pluginKey === 'Button' ||
pluginKey === 'Carousel' ||
pluginKey === 'Collapse' ||
pluginKey === 'Modal' ||
pluginKey === 'ScrollSpy'
) {
const config = Object.assign(defaultPluginConfig)
config.external.push(bsPlugins.Manipulator)
config.globals[bsPlugins.Manipulator] = 'Manipulator'
return config
2018-09-26 15:05:27 +02:00
}
2018-07-25 11:29:16 +02:00
if (pluginKey === 'Dropdown' || pluginKey === 'Tooltip') {
const config = Object.assign(defaultPluginConfig)
2020-06-19 10:17:01 +02:00
config.external.push(bsPlugins.Manipulator, '@popperjs/core')
2018-07-25 11:29:16 +02:00
config.globals[bsPlugins.Manipulator] = 'Manipulator'
2020-06-19 10:17:01 +02:00
config.globals['@popperjs/core'] = 'Popper'
2018-07-25 11:29:16 +02:00
return config
2018-09-26 15:05:27 +02:00
}
2018-07-25 11:29:16 +02:00
if (pluginKey === 'Popover') {
return {
external: [
bsPlugins.Data,
bsPlugins.SelectorEngine,
bsPlugins.Tooltip
2018-07-25 11:29:16 +02:00
],
globals: {
[bsPlugins.Data]: 'Data',
[bsPlugins.SelectorEngine]: 'SelectorEngine',
[bsPlugins.Tooltip]: 'Tooltip'
2018-07-25 11:29:16 +02:00
}
}
2018-09-26 15:05:27 +02:00
}
2018-11-14 12:02:18 +01:00
if (pluginKey === 'Toast') {
return {
external: [
bsPlugins.Data,
bsPlugins.Base,
2018-11-14 12:02:18 +01:00
bsPlugins.EventHandler,
bsPlugins.Manipulator
2018-11-14 12:02:18 +01:00
],
globals: {
[bsPlugins.Data]: 'Data',
[bsPlugins.Base]: 'Base',
2018-11-14 12:02:18 +01:00
[bsPlugins.EventHandler]: 'EventHandler',
[bsPlugins.Manipulator]: 'Manipulator'
2018-11-14 12:02:18 +01:00
}
}
}
2018-07-25 11:29:16 +02:00
}
2020-05-02 15:56:23 +02:00
const utilObjects = new Set([
'Util',
'Sanitizer'
2020-05-02 15:56:23 +02:00
])
2020-05-02 15:56:23 +02:00
const domObjects = new Set([
'Data',
'EventHandler',
'Manipulator',
'SelectorEngine'
2020-05-02 15:56:23 +02:00
])
const build = async plugin => {
2018-07-25 11:29:16 +02:00
console.log(`Building ${plugin} plugin...`)
2019-02-26 12:20:34 +01:00
const { external, globals } = getConfigByPluginKey(plugin)
const pluginFilename = path.basename(bsPlugins[plugin])
let pluginPath = rootPath
2020-05-02 15:56:23 +02:00
if (utilObjects.has(plugin)) {
pluginPath = `${rootPath}/util/`
}
2020-05-02 15:56:23 +02:00
if (domObjects.has(plugin)) {
pluginPath = `${rootPath}/dom/`
}
const bundle = await rollup.rollup({
2018-09-26 15:05:27 +02:00
input: bsPlugins[plugin],
plugins,
external
})
await bundle.write({
banner: banner(pluginFilename),
format: 'umd',
name: plugin,
sourcemap: true,
globals,
file: path.resolve(__dirname, `${pluginPath}/${pluginFilename}`)
})
console.log(`Building ${plugin} plugin... Done!`)
}
const main = async () => {
try {
await Promise.all(Object.keys(bsPlugins).map(plugin => build(plugin)))
} catch (error) {
console.error(error)
process.exit(1)
}
2018-09-26 15:05:27 +02:00
}
main()