From c3a79b1a8c2fa8d7fc8edcd3e626dad8b45d5dc3 Mon Sep 17 00:00:00 2001 From: fat Date: Thu, 7 May 2015 16:34:28 -0700 Subject: [PATCH] change the export pattern to protect against leaking globals --- js/dist/alert.js | 320 +++++++++++++++++++++--------------------- js/dist/alert.js.map | Bin 6686 -> 7082 bytes js/dist/util.js | 175 ++++++++++++----------- js/dist/util.js.map | Bin 5049 -> 5162 bytes js/script-compiled.js | 305 ++++++++++++++++++++++++++++++++++++++++ js/src/alert.js | 278 ++++++++++++++++++------------------ js/src/util.js | 180 ++++++++++++------------ 7 files changed, 792 insertions(+), 466 deletions(-) create mode 100644 js/script-compiled.js diff --git a/js/dist/alert.js b/js/dist/alert.js index 0dbfe767b..76b280a0c 100644 --- a/js/dist/alert.js +++ b/js/dist/alert.js @@ -4,167 +4,173 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -/** - * -------------------------------------------------------------------------- - * Constants - * -------------------------------------------------------------------------- - */ - -var NAME = 'alert'; -var VERSION = '4.0.0'; -var DATA_KEY = 'bs.alert'; -var JQUERY_NO_CONFLICT = $.fn[NAME]; -var TRANSITION_DURATION = 150; - -var Selector = { - DISMISS: '[data-dismiss="alert"]' -}; - -var Event = { - CLOSE: 'close.bs.alert', - CLOSED: 'closed.bs.alert', - CLICK: 'click.bs.alert.data-api' -}; - -var ClassName = { - ALERT: 'alert', - FADE: 'fade', - IN: 'in' -}; - -/** - * -------------------------------------------------------------------------- - * Class Definition - * -------------------------------------------------------------------------- - */ - -var Alert = (function () { - function Alert(element) { - _classCallCheck(this, Alert); - - if (element) { - this.element = element; - } - } - - _createClass(Alert, [{ - key: 'close', - - // public - - value: function close(element) { - var rootElement = this._getRootElement(element); - var customEvent = this._triggerCloseEvent(rootElement); - - if (customEvent.isDefaultPrevented()) { - return; - } - - this._removeElement(rootElement); - } - }, { - key: '_getRootElement', - - // private - - value: function _getRootElement(element) { - var parent = false; - var selector = Util.getSelectorFromElement(element); - - if (selector) { - parent = $(selector)[0]; - } - - if (!parent) { - parent = $(element).closest('.' + ClassName.ALERT)[0]; - } - - return parent; - } - }, { - key: '_triggerCloseEvent', - value: function _triggerCloseEvent(element) { - var closeEvent = $.Event(Event.CLOSE); - $(element).trigger(closeEvent); - return closeEvent; - } - }, { - key: '_removeElement', - value: function _removeElement(element) { - $(element).removeClass(ClassName.IN); - - if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) { - this._destroyElement(element); - return; - } - - $(element).one(Util.TRANSITION_END, this._destroyElement.bind(this, element)).emulateTransitionEnd(TRANSITION_DURATION); - } - }, { - key: '_destroyElement', - value: function _destroyElement(element) { - $(element).detach().trigger(Event.CLOSED).remove(); - } - }], [{ - key: '_jQueryInterface', - - // static - - value: function _jQueryInterface(config) { - return this.each(function () { - var $element = $(this); - var data = $element.data(DATA_KEY); - - if (!data) { - data = new Alert(this); - $element.data(DATA_KEY, data); - } - - if (config === 'close') { - data[config](this); - } - }); - } - }, { - key: '_handleDismiss', - value: function _handleDismiss(alertInstance) { - return function (event) { - if (event) { - event.preventDefault(); - } - - alertInstance.close(this); - }; - } - }]); - - return Alert; -})(); - -/** - * -------------------------------------------------------------------------- - * Data Api implementation - * -------------------------------------------------------------------------- - */ - -$(document).on(Event.CLICK, Selector.DISMISS, Alert._handleDismiss(new Alert())); - -/** - * -------------------------------------------------------------------------- - * jQuery - * -------------------------------------------------------------------------- - */ - -$.fn[NAME] = Alert._jQueryInterface; -$.fn[NAME].Constructor = Alert; -$.fn[NAME].noConflict = function () { - $.fn[NAME] = Alert._JQUERY_NO_CONFLICT; - return Alert._jQueryInterface; -}; /** * -------------------------------------------------------------------------- * Bootstrap (v4.0.0): alert.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ + +var Alert = (function () { + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'alert'; + var VERSION = '4.0.0'; + var DATA_KEY = 'bs.alert'; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var TRANSITION_DURATION = 150; + + var Selector = { + DISMISS: '[data-dismiss="alert"]' + }; + + var Event = { + CLOSE: 'close.bs.alert', + CLOSED: 'closed.bs.alert', + CLICK: 'click.bs.alert.data-api' + }; + + var ClassName = { + ALERT: 'alert', + FADE: 'fade', + IN: 'in' + }; + + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Alert = (function () { + function Alert(element) { + _classCallCheck(this, Alert); + + if (element) { + this.element = element; + } + } + + _createClass(Alert, [{ + key: 'close', + + // public + + value: function close(element) { + var rootElement = this._getRootElement(element); + var customEvent = this._triggerCloseEvent(rootElement); + + if (customEvent.isDefaultPrevented()) { + return; + } + + this._removeElement(rootElement); + } + }, { + key: '_getRootElement', + + // private + + value: function _getRootElement(element) { + var parent = false; + var selector = Util.getSelectorFromElement(element); + + if (selector) { + parent = $(selector)[0]; + } + + if (!parent) { + parent = $(element).closest('.' + ClassName.ALERT)[0]; + } + + return parent; + } + }, { + key: '_triggerCloseEvent', + value: function _triggerCloseEvent(element) { + var closeEvent = $.Event(Event.CLOSE); + $(element).trigger(closeEvent); + return closeEvent; + } + }, { + key: '_removeElement', + value: function _removeElement(element) { + $(element).removeClass(ClassName.IN); + + if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) { + this._destroyElement(element); + return; + } + + $(element).one(Util.TRANSITION_END, this._destroyElement.bind(this, element)).emulateTransitionEnd(TRANSITION_DURATION); + } + }, { + key: '_destroyElement', + value: function _destroyElement(element) { + $(element).detach().trigger(Event.CLOSED).remove(); + } + }], [{ + key: '_jQueryInterface', + + // static + + value: function _jQueryInterface(config) { + return this.each(function () { + var $element = $(this); + var data = $element.data(DATA_KEY); + + if (!data) { + data = new Alert(this); + $element.data(DATA_KEY, data); + } + + if (config === 'close') { + data[config](this); + } + }); + } + }, { + key: '_handleDismiss', + value: function _handleDismiss(alertInstance) { + return function (event) { + if (event) { + event.preventDefault(); + } + + alertInstance.close(this); + }; + } + }]); + + return Alert; + })(); + + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + $(document).on(Event.CLICK, Selector.DISMISS, Alert._handleDismiss(new Alert())); + + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME] = Alert._jQueryInterface; + $.fn[NAME].Constructor = Alert; + $.fn[NAME].noConflict = function () { + $.fn[NAME] = Alert._JQUERY_NO_CONFLICT; + return Alert._jQueryInterface; + }; + + return Alert; +})(); //# sourceMappingURL=alert.js.map \ No newline at end of file diff --git a/js/dist/alert.js.map b/js/dist/alert.js.map index d2d9be6b6d2d7caa3f2c30a1e916deed7a6cd5fd..f3bc7ad7fcb0e300cd27e3737628201b4be8429e 100644 GIT binary patch literal 7082 zcmcIoZExE~68OBgwYpa}wJyC~9TXkw}%KoTP33d*@}B zOHtC{KEx{EP~3TWX6BjMQU7YasJuwBv~}{6(<-uc9;>2ta@%??Iz=9LqJ_#!_qk}@ zJFPTY(iuE1qtz-&A3?I!t$(DvmQE<;z&V%l-04f%cYG;*=L5Vmf>MrC&l#W;h=wTj z$#X_hj!;&1K|b~QoL<7Y+I@T}qrk?d#VK2aI^1yCY;i$YalsA8d=3nZ zbcmWE)^AHs(}xH`=k!#SwCvSf(veocAUPG_VC6el#6fo~{R?7{RwIoVxl2zC2ateg zpA#R+^Vq?PHzI!V*grKAkd%v4MYht%6;Zj_$XNl_3U6mlu(+v)NUEk}ABm#_PA*xY zKO|$nZahg0`ir*}H6b>3-|x1&Q7Rod8K-unKSXqTM{Tv?nkuZz3?Ry$1_4|caVvtj z>_VDn#Hk?h93XBp$Ix{|R2na45NO-h>8>X-5B72&`&O&$4a$r!jTjVu^^oMF+F%2$ z3&R^RQ(vdbn73&0d0tXOy;tL;nMKz~4D{_u#>KqCJa%^aKXMqHK? z)|<6v3jf7-;%W#$tb2PD{B5<+?wtA;HF{c);3hWc&D60DtsFg3S{ecQkov&MAPt$0 zU0)C;1;nIZuwkJ(`?_^6=Bgi{9R5{x)%j+;0)0qCd-HRB2N6_wN!~wJ(*ipCn5bOY zh1ynxYJ^KRq39n_<|mI!VrPa4(63Do@(9vExEKpa7NI#tc&%JArK}hGj`WabaLbY+ zywG+r5(F@zVL&TEpY7V-vL?w81HhW>c1g);=-gl$^dukzlp%6K6*n*-GQ5!W1y#?z z0Zh;d2iQzK9CT;3W`bV*jmZFn!HvLoA}OQlR)GCRRozYgYpw~|#>)vcz&SgBW6fsc zAFfJFYtLDOr--HY<_(a-R3lYD3HNLFM*ezMyI_$=uwL}vV=w7(vQb2zdkMJuvBpph z7_N3Jtdojch{Z$r!M`qj6{ty{ztB?E|2qtmy`DOlyCbKG{IkXvXG05sYY6zpbz3t;n3 z+QTcx%E~TmWK%lEO7ZgAa$56bp z`sdm}5`U`BT|yMCl5Gh7A}Wd@{5H2RiYGs~0KC0YDZ*{vD>ik=h317Z8R(do)u6K z-OqSyxsW~6;%9Jy8C)Pm^)`;V-bQ&NUhNHLOuIV2J-#%`$zUQV3t&gu$K2Wf%RvF-7HmY0$sb3f??0mEwky(ohA?n z;&9A#IjYhvgsYb81+>g&+%?1IuG2b}A)9Whpe#LhVxOrpil5qb1cnYZ*7WMGe?JVSP;^Fynt@5uSOq+Zj#i|XXd7eDhnn=@(s-qCke4WO4YX~U0zPPd8 zI06nd$zVJjP#$a8@EosDl*Mx`O4n-JEFmCoi$_h3DjR+TTR9b}`pj!y)05a^+#$^x zq^dv&iKa0HFHTQk0iwP-+~N9`Q*_^S3)avMTtV7JW!~iaDN1Jx)#Ih6O`AbTTVt$h zesscZniXCKH35A?ZoL(PB;6HXANn#eWFTbq^ltd)skj-E4oHVV|6qu(wwCme9deZj z`0c~(4}^W)?c|_6%i=ZNM=&bdTtU-Zum|cD&D>+I-ca>x+G^Z~&9Yir^6Vf=ziQsN zg$esBEpc|oCxV+lr`&&TbBG`mtK$0j(}=e{XnaaqLn6&UW)7PgtQN3YY!4V~%~)_B pwttRL3iOurKcHzs>ps(X?$U2Z*eZ9a`a-|FXS|CUysi6h{{SJ1h;{$~ delta 2007 zcmZ`&&rcgi6xISJ81u`&jR|HAHW+8Ip+Ti!C1iG4yN)p~F)jf?)5TsAr^W_*ApwMt zdPu7tBBFO}RkczMRiyp_jZ{UswN;fKqh2aSs@k4e7^jQQ<00V+E>5rm?h2mq{vk&CnZTza+^n2~;rEKPxPf zIAL1^$=4Y&av7}AqRU6z2hk&?TE1ik>atKO6GD#7M5Ei zi#G)op=T4?v!-J;xrZKL~7;%L*ojR)f zhUE+FDsoX2#<6GTYGY4xFkm8F29BEg;UkmtGGjmyxf6yG7DYE?g$>d<1`XSbxgPl4 z6dq>Ualj4r6)>=0$=MVoCK>D z9=>n&u~jdaEPcjGw0OA$o?hj$@R`MH!lyPV!mpOgrf4|4QU-rl3LdomU@LBHR;n7G z(~2d2y;|Aehu~7%nnkLVYnoElY6etpx5678eUR-4!d^!R9^?N-$ABYGaeP)Ssd=qZ z<*)Gjm|*S-0T zTCc+2)~L0rYTH#-#-M;}wvhh}S+%&MXsXV3>$a-hs8lp~-{EnURE^(Ms?;YQomy8) zHH5))+cY%T-Oyw2HQXY0FRa>Q#_mhI(^x&T2jMsSC9pdJUR?;Er*fJ1CzpanhadJF z0(|8Nz)Qy{n4Q7@(apJBuR*$0DSHC+E^Qq zuucoF+!3&P{4nlu!K}x};JcnaOTA`0{?qEeYH5otCl zrP#0?4{&5AnN26NSq#EA-9c`c&REOc`E9kjiy?e8mQ%#=*gFO7%g5Z2mp4DoMFa1$qSo=Zdh^U{x^7>!zvYS|$+(9LI^bv7F$n zNeK$Qa78Mb69*263#!BkaR3SRz=cC7H^dRdfddCr1P5-+ytiwIwY}W!AnA{(yhdcLKL|ngu&M_mUk{8svVuLg3miQxk|aax)8g%%+6!-k$HvLwEA`atKq@T+%DTL*1~?x~R#kEKI<#7tF%VHfgi!dS_d@upf} zx0OMkrz7##Dm1b{o3=wG4DX&1%cTKB8-8Zk*;MjLnYr$8( z%N!dX8M33>=l>AMz=f#8#OPVA0#`@pv@+C3MV-`FW=LDyo?B{a`IAIiQ6fsl(l8{u zP4bjfqMU~$qbc6tRrquC6+aSdBQZGdPfnA%%6W;2oHksx@RmQWHQ~^oLQWt1FCo7Z z|Gc&afBB0Kaemv(D-qR_ppOO8uQXgFiF8jcOH&y~`(f!ae%~OTs}vV}2jhlP-(|bW ztF()90;vHW7z(8%KKgcJSvn$*2kJP~FCyB3?jTET)@V!@c}eFrxTjr1w?5P+Jv%zA zYqRj3Hb<|&X*bg-&^rYOOLoECsHnBUx!a0=0YS>1B!b-c+?*#p+>&>({o77^3){;D zwQ+^uN6+MK%-lzWBAF+NlaB>XMSWRh4#W7rLJ>|IWC(LZp3^kNFKf@0wR6qA?t#r} zw$)+FES=7<5>&%4KhM~)lk|RgAYw7OgHOL!W73eUs8;d3w@$w49VdQuju z97LcO`Eb#mMC0&9BzT1}Yn!DH5oPc2LZ#NV?933{X|~x%15zp$w8mR$|*O&v8&S>cr8sv=Q?9q^k%1J*Gh%-ey_D{J#eS^eC!hZJhq4; zIBKe6*^(V|M}%Y`17_elJPagoJ#Gcg!Z(2lI0@W1wE&Ue8C;q{2@g(z5zL1)F!LYchSX~S delta 1537 zcmZ8gO>7%g5Z2mBY{h@IlR6m=T+NPvPX;Hiilor<3DAhK|bp>-o!!t4PXed1Xu}Z3xmRX$g5|xzQZw+y3 zi&P*w=FDzVS`ir)E7uBC?Qnda+=TDP=EF!*WK31UB){~Zg{NcjB#$D1i&VL|AZ?$n zT=6BOHq?Aq(*hFYE`OQsw;{1=ShvFE+OL5iH@VPaD_3v#|VU5 zq|T_Y+xOMujt&$)sBNa89T%MBFDop_N2>A4Iw?_F;^mBfAM*gxx}?J+Nt>^51JU_) zHdWUeY3(Y^rUbEe|c7=CZxTup@w=(~AswqeOx8J?Xf#k2AUgO+Ku<+@{-GVK|sQp*ji zVeL0-VC0HkAg|~JeYyI!5sV@jJP0wCD%?WSq!9XThvSv320`1Qr( zuwxGpgH##8)z_U3 { -/** - * -------------------------------------------------------------------------- - * Constants - * -------------------------------------------------------------------------- - */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ -const NAME = 'alert' -const VERSION = '4.0.0' -const DATA_KEY = 'bs.alert' -const JQUERY_NO_CONFLICT = $.fn[NAME] -const TRANSITION_DURATION = 150 + const NAME = 'alert' + const VERSION = '4.0.0' + const DATA_KEY = 'bs.alert' + const JQUERY_NO_CONFLICT = $.fn[NAME] + const TRANSITION_DURATION = 150 -const Selector = { - DISMISS : '[data-dismiss="alert"]' -} + const Selector = { + DISMISS : '[data-dismiss="alert"]' + } -const Event = { - CLOSE : 'close.bs.alert', - CLOSED : 'closed.bs.alert', - CLICK : 'click.bs.alert.data-api' -} + const Event = { + CLOSE : 'close.bs.alert', + CLOSED : 'closed.bs.alert', + CLICK : 'click.bs.alert.data-api' + } -const ClassName = { - ALERT : 'alert', - FADE : 'fade', - IN : 'in' -} - - -/** - * -------------------------------------------------------------------------- - * Class Definition - * -------------------------------------------------------------------------- - */ - -export class Alert { - - constructor(element) { - if (element) { - this.element = element - } + const ClassName = { + ALERT : 'alert', + FADE : 'fade', + IN : 'in' } - // public + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ - close(element) { - let rootElement = this._getRootElement(element) - let customEvent = this._triggerCloseEvent(rootElement) + class Alert { - if (customEvent.isDefaultPrevented()) { - return + constructor(element) { + if (element) { + this.element = element + } } - this._removeElement(rootElement) - } + // public - // private + close(element) { + let rootElement = this._getRootElement(element) + let customEvent = this._triggerCloseEvent(rootElement) - _getRootElement(element) { - let parent = false - let selector = Util.getSelectorFromElement(element) - - if (selector) { - parent = $(selector)[0] - } - - if (!parent) { - parent = $(element).closest('.' + ClassName.ALERT)[0] - } - - return parent - } - - _triggerCloseEvent(element) { - var closeEvent = $.Event(Event.CLOSE) - $(element).trigger(closeEvent) - return closeEvent - } - - _removeElement(element) { - $(element).removeClass(ClassName.IN) - - if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) { - this._destroyElement(element) - return - } - - $(element) - .one(Util.TRANSITION_END, this._destroyElement.bind(this, element)) - .emulateTransitionEnd(TRANSITION_DURATION) - } - - _destroyElement(element) { - $(element) - .detach() - .trigger(Event.CLOSED) - .remove() - } - - - // static - - static _jQueryInterface(config) { - return this.each(function () { - let $element = $(this) - let data = $element.data(DATA_KEY) - - if (!data) { - data = new Alert(this) - $element.data(DATA_KEY, data) + if (customEvent.isDefaultPrevented()) { + return } - if (config === 'close') { - data[config](this) - } - }) - } - - static _handleDismiss(alertInstance) { - return function (event) { - if (event) { - event.preventDefault() - } - - alertInstance.close(this) + this._removeElement(rootElement) } + + + // private + + _getRootElement(element) { + let parent = false + let selector = Util.getSelectorFromElement(element) + + if (selector) { + parent = $(selector)[0] + } + + if (!parent) { + parent = $(element).closest('.' + ClassName.ALERT)[0] + } + + return parent + } + + _triggerCloseEvent(element) { + var closeEvent = $.Event(Event.CLOSE) + $(element).trigger(closeEvent) + return closeEvent + } + + _removeElement(element) { + $(element).removeClass(ClassName.IN) + + if (!Util.supportsTransitionEnd() || + !$(element).hasClass(ClassName.FADE)) { + this._destroyElement(element) + return + } + + $(element) + .one(Util.TRANSITION_END, this._destroyElement.bind(this, element)) + .emulateTransitionEnd(TRANSITION_DURATION) + } + + _destroyElement(element) { + $(element) + .detach() + .trigger(Event.CLOSED) + .remove() + } + + + // static + + static _jQueryInterface(config) { + return this.each(function () { + let $element = $(this) + let data = $element.data(DATA_KEY) + + if (!data) { + data = new Alert(this) + $element.data(DATA_KEY, data) + } + + if (config === 'close') { + data[config](this) + } + }) + } + + static _handleDismiss(alertInstance) { + return function (event) { + if (event) { + event.preventDefault() + } + + alertInstance.close(this) + } + } + } -} + + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + $(document).on( + Event.CLICK, + Selector.DISMISS, + Alert._handleDismiss(new Alert()) + ) -/** - * -------------------------------------------------------------------------- - * Data Api implementation - * -------------------------------------------------------------------------- - */ + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ -$(document).on( - Event.CLICK, - Selector.DISMISS, - Alert._handleDismiss(new Alert()) -) + $.fn[NAME] = Alert._jQueryInterface + $.fn[NAME].Constructor = Alert + $.fn[NAME].noConflict = function () { + $.fn[NAME] = Alert._JQUERY_NO_CONFLICT + return Alert._jQueryInterface + } + return Alert -/** - * -------------------------------------------------------------------------- - * jQuery - * -------------------------------------------------------------------------- - */ +})() -$.fn[NAME] = Alert._jQueryInterface -$.fn[NAME].Constructor = Alert -$.fn[NAME].noConflict = function () { - $.fn[NAME] = Alert._JQUERY_NO_CONFLICT - return Alert._jQueryInterface -} +export default Alert diff --git a/js/src/util.js b/js/src/util.js index e9542149e..68205edef 100644 --- a/js/src/util.js +++ b/js/src/util.js @@ -5,114 +5,120 @@ * -------------------------------------------------------------------------- */ +const Util = (() => { -/** - * -------------------------------------------------------------------------- - * Public Util Api - * -------------------------------------------------------------------------- - */ -var Util = { + /** + * ------------------------------------------------------------------------ + * Private TransitionEnd Helpers + * ------------------------------------------------------------------------ + */ - TRANSITION_END: 'bsTransitionEnd', + let transition = false - getUID(prefix) { - do prefix += ~~(Math.random() * 1000000) - while (document.getElementById(prefix)) - return prefix - }, - - getSelectorFromElement(element) { - let selector = element.getAttribute('data-target') - - if (!selector) { - selector = element.getAttribute('href') || '' - selector = /^#[a-z]/i.test(selector) ? selector : null - } - - return selector - }, - - reflow(element) { - new Function('bs', 'return bs')(element.offsetHeight) - }, - - supportsTransitionEnd() { - return !!transition + const TransitionEndEvent = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' } -} - -export default Util - - -/** - * -------------------------------------------------------------------------- - * Private TransitionEnd Helpers - * -------------------------------------------------------------------------- - */ - -let transition = false - -const TransitionEndEvent = { - WebkitTransition : 'webkitTransitionEnd', - MozTransition : 'transitionend', - OTransition : 'oTransitionEnd otransitionend', - transition : 'transitionend' -} - -function getSpecialTransitionEndEvent() { - return { - bindType: transition.end, - delegateType: transition.end, - handle: function (event) { - if ($(event.target).is(this)) { - return event.handleObj.handler.apply(this, arguments) + function getSpecialTransitionEndEvent() { + return { + bindType: transition.end, + delegateType: transition.end, + handle: function (event) { + if ($(event.target).is(this)) { + return event.handleObj.handler.apply(this, arguments) + } } } } -} -function transitionEndTest() { - if (window.QUnit) { + function transitionEndTest() { + if (window.QUnit) { + return false + } + + let el = document.createElement('bootstrap') + + for (var name in TransitionEndEvent) { + if (el.style[name] !== undefined) { + return { end: TransitionEndEvent[name] } + } + } + return false } - let el = document.createElement('bootstrap') + function transitionEndEmulator(duration) { + let called = false - for (var name in TransitionEndEvent) { - if (el.style[name] !== undefined) { - return { end: TransitionEndEvent[name] } + $(this).one(Util.TRANSITION_END, function () { + called = true + }) + + setTimeout(() => { + if (!called) { + $(this).trigger(transition.end) + } + }, duration) + + return this + } + + function setTransitionEndSupport() { + transition = transitionEndTest() + + $.fn.emulateTransitionEnd = transitionEndEmulator + + if (Util.supportsTransitionEnd()) { + $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent() } } - return false -} -function transitionEndEmulator(duration) { - let called = false + /** + * -------------------------------------------------------------------------- + * Public Util Api + * -------------------------------------------------------------------------- + */ - $(this).one(Util.TRANSITION_END, function () { - called = true - }) + let Util = { - setTimeout(() => { - if (!called) { - $(this).trigger(transition.end) + TRANSITION_END: 'bsTransitionEnd', + + getUID(prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + }, + + getSelectorFromElement(element) { + let selector = element.getAttribute('data-target') + + if (!selector) { + selector = element.getAttribute('href') || '' + selector = /^#[a-z]/i.test(selector) ? selector : null + } + + return selector + }, + + reflow(element) { + new Function('bs', 'return bs')(element.offsetHeight) + }, + + supportsTransitionEnd() { + return !!transition } - }, duration) - return this -} - -function setTransitionEndSupport() { - transition = transitionEndTest() - - $.fn.emulateTransitionEnd = transitionEndEmulator - - if (Util.supportsTransitionEnd()) { - $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent() } -} -setTransitionEndSupport() + setTransitionEndSupport() + + return Util + +})() + +export default Util