diff --git a/.babelrc.js b/.babelrc.js index ab2b8606efd4..8035e082456e 100644 --- a/.babelrc.js +++ b/.babelrc.js @@ -11,6 +11,7 @@ module.exports = { ], plugins: [ process.env.ROLLUP && 'external-helpers', - process.env.PLUGINS && 'transform-es2015-modules-strip' + process.env.PLUGINS && 'transform-es2015-modules-strip', + '@babel/proposal-object-rest-spread' ].filter(Boolean) }; diff --git a/build/rollup.config.js b/build/rollup.config.js index 44ffac71002d..99bf637c0d89 100644 --- a/build/rollup.config.js +++ b/build/rollup.config.js @@ -15,7 +15,8 @@ const plugins = [ externalHelpersWhitelist: [ // include only required helpers 'defineProperties', 'createClass', - 'inheritsLoose' + 'inheritsLoose', + 'extends' ] }) ] diff --git a/js/src/carousel.js b/js/src/carousel.js index 10ed2203edeb..ea443f189f06 100644 --- a/js/src/carousel.js +++ b/js/src/carousel.js @@ -223,7 +223,10 @@ const Carousel = (($) => { // private _getConfig(config) { - config = $.extend({}, Default, config) + config = { + ...Default, + ...config + } Util.typeCheckConfig(NAME, config, DefaultType) return config } @@ -428,10 +431,16 @@ const Carousel = (($) => { static _jQueryInterface(config) { return this.each(function () { let data = $(this).data(DATA_KEY) - const _config = $.extend({}, Default, $(this).data()) + let _config = { + ...Default, + ...$(this).data() + } if (typeof config === 'object') { - $.extend(_config, config) + _config = { + ..._config, + ...config + } } const action = typeof config === 'string' ? config : _config.slide @@ -468,7 +477,10 @@ const Carousel = (($) => { return } - const config = $.extend({}, $(target).data(), $(this).data()) + const config = { + ...$(target).data(), + ...$(this).data() + } const slideIndex = this.getAttribute('data-slide-to') if (slideIndex) { diff --git a/js/src/collapse.js b/js/src/collapse.js index f907aec54d82..1456294f43e1 100644 --- a/js/src/collapse.js +++ b/js/src/collapse.js @@ -277,7 +277,10 @@ const Collapse = (($) => { // private _getConfig(config) { - config = $.extend({}, Default, config) + config = { + ...Default, + ...config + } config.toggle = Boolean(config.toggle) // coerce string values Util.typeCheckConfig(NAME, config, DefaultType) return config @@ -338,12 +341,11 @@ const Collapse = (($) => { return this.each(function () { const $this = $(this) let data = $this.data(DATA_KEY) - const _config = $.extend( - {}, - Default, - $this.data(), - typeof config === 'object' && config - ) + const _config = { + ...Default, + ...$this.data(), + ...typeof config === 'object' && config + } if (!data && _config.toggle && /show|hide/.test(config)) { _config.toggle = false diff --git a/js/src/dropdown.js b/js/src/dropdown.js index 57ee10ebdddf..8affedc6ce9e 100644 --- a/js/src/dropdown.js +++ b/js/src/dropdown.js @@ -210,12 +210,11 @@ const Dropdown = (($) => { } _getConfig(config) { - config = $.extend( - {}, - this.constructor.Default, - $(this._element).data(), - config - ) + config = { + ...this.constructor.Default, + ...$(this._element).data(), + ...config + } Util.typeCheckConfig( NAME, @@ -262,7 +261,10 @@ const Dropdown = (($) => { const offsetConf = {} if (typeof this._config.offset === 'function') { offsetConf.fn = (data) => { - data.offsets = $.extend({}, data.offsets, this._config.offset(data.offsets) || {}) + data.offsets = { + ...data.offsets, + ...this._config.offset(data.offsets) || {} + } return data } } else { diff --git a/js/src/modal.js b/js/src/modal.js index 95565aabcceb..be3105fa150c 100644 --- a/js/src/modal.js +++ b/js/src/modal.js @@ -227,7 +227,10 @@ const Modal = (($) => { // private _getConfig(config) { - config = $.extend({}, Default, config) + config = { + ...Default, + ...config + } Util.typeCheckConfig(NAME, config, DefaultType) return config } @@ -506,12 +509,11 @@ const Modal = (($) => { static _jQueryInterface(config, relatedTarget) { return this.each(function () { let data = $(this).data(DATA_KEY) - const _config = $.extend( - {}, - Modal.Default, - $(this).data(), - typeof config === 'object' && config - ) + const _config = { + ...Modal.Default, + ...$(this).data(), + ...typeof config === 'object' && config + } if (!data) { data = new Modal(this, _config) @@ -547,7 +549,10 @@ const Modal = (($) => { } const config = $(target).data(DATA_KEY) ? - 'toggle' : $.extend({}, $(target).data(), $(this).data()) + 'toggle' : { + ...$(target).data(), + ...$(this).data() + } if (this.tagName === 'A' || this.tagName === 'AREA') { event.preventDefault() diff --git a/js/src/popover.js b/js/src/popover.js index 4fb96a792e7d..1bd3b198eb3e 100644 --- a/js/src/popover.js +++ b/js/src/popover.js @@ -26,19 +26,25 @@ const Popover = (($) => { const CLASS_PREFIX = 'bs-popover' const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g') - const Default = $.extend({}, Tooltip.Default, { - placement : 'right', - trigger : 'click', - content : '', - template : '' - }) - - const DefaultType = $.extend({}, Tooltip.DefaultType, { - content : '(string|element|function)' - }) + const Default = { + ...Tooltip.Default, + ...{ + placement : 'right', + trigger : 'click', + content : '', + template : '' + } + } + + const DefaultType = { + ...Tooltip.DefaultType, + ...{ + content : '(string|element|function)' + } + } const ClassName = { FADE : 'fade', diff --git a/js/src/scrollspy.js b/js/src/scrollspy.js index 3a13d954ac57..fd5197e383fd 100644 --- a/js/src/scrollspy.js +++ b/js/src/scrollspy.js @@ -171,7 +171,10 @@ const ScrollSpy = (($) => { // private _getConfig(config) { - config = $.extend({}, Default, config) + config = { + ...Default, + ...config + } if (typeof config.target !== 'string') { let id = $(config.target).attr('id') diff --git a/js/src/tooltip.js b/js/src/tooltip.js index 7cefd0be6aa1..002dea429835 100644 --- a/js/src/tooltip.js +++ b/js/src/tooltip.js @@ -501,10 +501,13 @@ const Tooltip = (($) => { }) if (this.config.selector) { - this.config = $.extend({}, this.config, { - trigger : 'manual', - selector : '' - }) + this.config = { + ...this.config, + ...{ + trigger : 'manual', + selector : '' + } + } } else { this._fixTitle() } @@ -613,12 +616,11 @@ const Tooltip = (($) => { } _getConfig(config) { - config = $.extend( - {}, - this.constructor.Default, - $(this.element).data(), - config - ) + config = { + ...this.constructor.Default, + ...$(this.element).data(), + ...config + } if (typeof config.delay === 'number') { config.delay = { diff --git a/package-lock.json b/package-lock.json index f73bcd33e267..bdc5fa2e0795 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,21 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.5.tgz", + "integrity": "sha512-P0JS8FMo1qoBTChGuHPCEf2iPaZicZVDGbJwqiho/zwY0aA/QLbFk+kSvCbSugJ402oDnefekDTCiEVr0xYTIQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-object-rest-spread": "7.0.0-beta.5" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.5.tgz", + "integrity": "sha512-E7dwmPLRkewpMx4R7fOoig1WgH9uA9AEpCe83B+OJpAGxP1CmnUAcnaJzYyiN5PjsB9pSaJ4dAlLVRTup2xLOg==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -416,7 +431,7 @@ "babel-types": "7.0.0-beta.0", "babylon": "7.0.0-beta.22", "debug": "3.1.0", - "globals": "10.2.0", + "globals": "10.3.0", "invariant": "2.2.2", "lodash": "4.17.4" } @@ -1110,7 +1125,7 @@ "babel-types": "7.0.0-beta.2", "babylon": "7.0.0-beta.25", "debug": "3.1.0", - "globals": "10.2.0", + "globals": "10.3.0", "invariant": "2.2.2", "lodash": "4.17.4" } @@ -2070,9 +2085,9 @@ } }, "eslint-plugin-compat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-2.0.1.tgz", - "integrity": "sha512-6LtsFQsrFyPGLBVJMnQEmUEY1Sc0Trpz56i/y3qTCA5JKc1KePKS5q5Xcc8LoGgPyeDw3IfnyYqS4Q7vR1Ffeg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-2.1.0.tgz", + "integrity": "sha512-ml+CAjn9c6E4Vi1U/CBLtm9GBEtWw1rNtoPxCf9kj/FVyDhlOlffYAzZ1J1yQ1eeN4JqZ3gVSoKnKcuk/80oWA==", "dev": true, "requires": { "babel-runtime": "6.26.0", @@ -2746,9 +2761,9 @@ } }, "globals": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-10.2.0.tgz", - "integrity": "sha512-Kqkw0LTOBKEwtVuBiw52QwD6qI1TkJZQKdIYUfVEitfPbSiSmclVicQV0hPS3oqVBkr+O/TPpKk7+dRn1h5Hog==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-10.3.0.tgz", + "integrity": "sha512-1g6qO5vMbiPHbRTDtR9JVjRkAhkgH4nSANYGyx1eOfqgxcMnYMMD+7MjmjfzXjwFpVUE/7/NzF+jQxYE7P4r7A==", "dev": true }, "globby": { @@ -4290,9 +4305,9 @@ "dev": true }, "node-sass": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.5.3.tgz", - "integrity": "sha1-0JydEXlkEjnRuX/8YjH9zsU+FWg=", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.6.0.tgz", + "integrity": "sha512-rh0CvkxpYdQdbWx4EQfunmG0+99BVyVwQHlFE+yUzc6lteF5K3WUcJ0bdmv9E9CqQA1RfuMyvmpDP99cmBObow==", "dev": true, "requires": { "async-foreach": "0.1.3", @@ -6465,7 +6480,7 @@ "specificity": "0.3.2", "string-width": "2.1.1", "style-search": "0.1.0", - "sugarss": "1.0.0", + "sugarss": "1.0.1", "svg-tags": "1.0.0", "table": "4.0.2" }, @@ -6590,9 +6605,9 @@ } }, "sugarss": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-1.0.0.tgz", - "integrity": "sha1-ZeUbOVhDL7cNVFGmi7M+MtDPHvc=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-1.0.1.tgz", + "integrity": "sha512-3qgLZytikQQEVn1/FrhY7B68gPUUGY3R1Q1vTiD5xT+Ti1DP/8iZuwFet9ONs5+bmL8pZoDQ6JrQHVgrNlK6mA==", "dev": true, "requires": { "postcss": "6.0.14" @@ -6765,9 +6780,9 @@ "dev": true }, "uglify-js": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.6.tgz", - "integrity": "sha512-/rseyxEKEVMBo8279lqpoJgD6C/i/CIi+9TJDvWmb+Xo6mqMKwjA8Io3IMHlcXQzj99feR6zrN8m3wqqvm/nYA==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.7.tgz", + "integrity": "sha512-ZRs/A6LJhLac7SN3Hv22LXEtndFliqTkfTilYSx84cxHXoC2bbhdSOsUZqRvfwEAjlIE4AK8pLd47+RxINCTjg==", "dev": true, "requires": { "commander": "2.11.0", diff --git a/package.json b/package.json index 4f0efda65dd3..1e3971ec53e2 100644 --- a/package.json +++ b/package.json @@ -80,6 +80,7 @@ "popper.js": "^1.12.6" }, "devDependencies": { + "@babel/plugin-proposal-object-rest-spread": "7.0.0-beta.5", "autoprefixer": "^7.1.2", "babel-cli": "7.0.0-beta.2", "babel-eslint": "^8.0.0",