├── .gitignore ├── .npmignore ├── README.md ├── bower.json ├── composer.json ├── magicsuggest.css ├── magicsuggest.jquery.json ├── magicsuggest.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | *.DS_Store 3 | /.settings 4 | /.project 5 | sample 6 | node_modules 7 | /.idea/.gitignore 8 | /.idea/modules.xml 9 | /.idea/vcs.xml 10 | /ignore/ 11 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .sample 2 | ./sample 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![GitHub issues](https://img.shields.io/github/issues/magicsuggest/magicsuggest) 2 | ![GitHub closed issues](https://img.shields.io/github/issues-closed/magicsuggest/magicsuggest) 3 | ![GitHub milestones](https://img.shields.io/github/milestones/all/Magicsuggest/Magicsuggest) 4 | ![npm](https://img.shields.io/npm/dt/magicsuggest) 5 | ![GitHub Release Date](https://img.shields.io/github/release-date/magicsuggest/magicsuggest) 6 | 7 | -------------------------- 8 | MagicSuggest v2.1.7 Updates deprecated jQuery methods 9 | -------------------------- 10 | - (fix) updates deprecated jQuery methods such as trim(), $.isArray, and Proxy(). 11 | - (Update) It replaces them with native JavaScript alternatives. 12 | - (Fix) the jQuery method each() is also replaced with native JavaScript forEach() - where possible. 13 | 14 | -------------------------- 15 | MagicSuggest v2.1.6 Bug Fix 16 | -------------------------- 17 | - (fix) Disabled arbitrary HTML and SCRIPT execution on input. 18 | 19 | MagicSuggest v2.1.5 20 | -------------------------- 21 | - (fix) prepend close button instead of appending it 22 | - (fix) updated magicsuggest-min.js with current master code 23 | - (fea) dynamically update max selection size 24 | 25 | 26 | MagicSuggest v2.0.0 27 | ==================== 28 | MagicSuggest has a new home here: http://nicolasbize.com/magicsuggest/ 29 | It includes a great new API documentation, examples, tutorials and more! 30 | 31 | Milestone change log: 32 | 33 | MagicSuggest v.2.0.0 34 | ==================== 35 | - New home at http://nicolasbize.com/magicsuggest/ to run dynamic examples that gh-pages couldn't handle 36 | - Now runs with Bootstrap 3 (required) 37 | - Responsive design 38 | - No more intrusive loading 39 | 40 | v1.3.1 BugFixing again! (Minor Tagged Milestone - August 17th, 2013) 41 | ==================================================================== 42 | - (fix) enable after disable now works (credits to amanokerim - https://github.com/amanokerim) 43 | - (fix) trigger icon now takes full height (credits to DioVayne - https://github.com/DioVayne) 44 | - (fix) clear now compatible with isSilent (credits to Coywolf - https://github.com/Coywolf) 45 | - (fix) groupBy was broken by 1.3.0 46 | - (fea) compatibility with latest jQuery 1.10.2 (credits to RafaelMalgor - https://github.com/RafaelMalgor) 47 | - (fea) resulted JSON objects can now have a custom result property resultsField (credits to RafaelMalgor - https://github.com/RafaelMalgor) 48 | 49 | v1.3.0 Some more features and bugfixing (Minor Tagged Milestone - May 25th, 2013) 50 | ================================================================================= 51 | - (fea) combo component can now be fetched through the same div element (credits to meghuizen - https://github.com/meghuizen) 52 | - (fix) CSS bug with 1.2.7+ with triggerHidden (credits to ScullWM - https://github.com/ScullWM) 53 | - (fix) container would always render with 1 row even though a bunch of data was loaded (credits to travishaagen - https://github.com/travishaagen) 54 | - (fea) added minimum jQuery version to work in docs (credits to rajeshmeniya - https://github.com/rajeshmeniya) 55 | - (fix) input was not correctly enabled / disabled (credits to zerekw - https://github.com/zerekw) 56 | - (fea) added getName and setName to easily fetch/set form name of component (credits to jbmoens - https://github.com/jbmoens) 57 | - (fix) when a value is specified in the DOM original element, it is passed correctly to MS. (credits to jbmoens - https://github.com/jbmoens) 58 | - (fix) input space now always uses the remaining space as this leads to less issues. 59 | - (fea) combo has now more logic when used for a single selection combo box. 60 | - (fix) space taken for single selection on a small combo remains on one line. (credits to ScullWM - https://github.com/ScullWM) 61 | - (fea) multiple items can now be selected through the Ctrl key (credits to meghuizen - https://github.com/meghuizen) 62 | - (fea) trigger icon now uses pure CSS (credits to meghuizen - https://github.com/meghuizen) 63 | - (fea) cfg(data) can now take a function as parameter (credits to meghuizen - https://github.com/meghuizen) 64 | - (fea) cfg(data) can take a json object whose data items are within the results property 65 | - (fix) CSS has been fixed so it behaves correctly within a bootstrap modal (credits to daenuprobst - https://github.com/daenuprobst) 66 | - (fea) suggestion rendering optimized by reducing draw calls to one. (credits to meghuizen - https://github.com/meghuizen) 67 | - (fix) tags can now longer be removed when the combo is disabled (credits to grena - https://github.com/grena) 68 | - (fix) setting data was only going through visible set of suggestions (credits to grena - https://github.com/grena) 69 | - (fix) missing semi-colons, went through full jslint (credits to grena - https://github.com/grena) 70 | - (fix) suggestions were not appearing when maxSuggestions was set to 10. (credits to zerekw - https://github.com/zerekw and plasmaxy - https://github.com/plasmaxy) 71 | - (fix) the clear function was broken (credits to travishaagen - https://github.com/travishaagen) 72 | - (fea) the component's config can now be setup entirely from the DOM container element. 73 | - (fea) added a silent mode to selection changing methods in order to know if it was user-triggered or not. (credits to travishaagen - https://github.com/travishaagen) 74 | - (fea) added a setData(object) method to fill the combo after it has been rendered (credits to travishaagen - https://github.com/travishaagen) 75 | - (fix) ajax query was sent twice when the user was typing faster than the typeDelay (credits to arvenom - https://github.com/arvenom) 76 | - (fix) highlighting the search results was also highlighting html tags when using custom rendering (credits to pstuart2 - https://github.com/pstuart2) 77 | - (fea) added cfg(strictSuggest) so that user can choose how the suggestions will be made 78 | - (fea) added cfg(toggleOnClick) so that the user can expand/close the combo by clicking on it (credits to psulek - https://github.com/psulek) 79 | - (fix) empty suggestion text was wrongly triggered when performing initial ajax call (credits to curtgrimes - https://github.com/curtgrimes) 80 | - (fea) added cfg(selectionRenderer) (credits to pstuart2 - https://github.com/pstuart2) 81 | - (fix) empty text class was not triggered properly (credits to jods4 - https://github.com/jods4) 82 | - (fix) IE8 compatibility (credits to sandormajor - https://github.com/sandormajor) 83 | - (fea) MagicSuggest can now be rendered from a select dom component. (credits to Yogu - https://github.com/Yogu) 84 | - (fea) on blur now automatically adds the typed text to the selection if free entries are allowed (credits to sandormajor - https://github.com/sandormajor) 85 | - (fea) new public method empty() which will clear the user text. 86 | - (fix) make sure combo is filled prior to triggering load event 87 | - (fea) renamed some events for better readability 88 | 89 | v1.2.0 Standardization on jQuery plugins (Minor Tagged Milestone - Mar. 4th 2013) 90 | ================================================================================= 91 | - (fix) fixed disabled behaviour when one could still edit the emptyText 92 | - (fix) collapse method would throw an error 93 | - (cfg) typeDelay: Amount (in ms) between keyboard registers (credits to jayesbee - https://github.com/jayesbee) 94 | - (fea) standardized on jQuery plugin (credits to jayesbee - https://github.com/jayesbee) 95 | - (fea) added documentation examples 96 | - (cfg) name: name used for magicsuggest as a form element (credits to iambibhas - https://github.com/iambibhas) 97 | - (fix) start up rendering when value rendered as text 98 | - (cfg) dataParams: additional parameters for ajax request (credits to jayesbee - https://github.com/jayesbee) 99 | - (fix) other rendering issues with inner text 100 | 101 | v1.1.0 Various enhancements and bug fixing (Minor Tagged Milestone - Feb. 19th 2013) 102 | ==================================================================================== 103 | - (fea) close cross style now blends in a bit more 104 | - (fea) escape now collapses the combo (without loosing focus) 105 | - (fix) can't enter entries made out of space 106 | - (cfg) noSuggestionText: text displayed when there are no suggestions from given data 107 | - (cfg) minCharsRenderer: allows to customize message when not enough characters are entered to trigger a search 108 | - (cfg) maxEntryRenderer: allows to customize message when too many characters have been entered 109 | - (cfg) maxEntryLength: amount of characters to limit user input 110 | - (cfg) style: custom style applied to the main container 111 | - (cfg) infoMsgCls: custom class to apply to the helper 112 | - (fea) new helper message on upper right to inform on the component status 113 | - (cfg) id: allows to give the component a custom ID 114 | - (cfg) inputCfg : allows additional parameters passed out to the INPUT tag. Enables usage of AngularJS's custom tags for ex. 115 | - (cfg) renderer : allows custom rendering within the combo. 116 | - (cfg) groupBy : allows grouping within the combo box listing. 117 | - (fix) blur event now registers correctly when selecting an element from the combo 118 | - (fix) flicker in IE when hovering trigger 119 | - (cfg) strictSuggest : set how suggestions will be proposed 120 | - (fix) maxResults is now correctly interpreted 121 | - (fix) maxSelection is now correctly interpreted 122 | - (cfg) method : set the ajax method, default to 'POST' 123 | - (fea) ajax request can now interpret multiple results from server base. 124 | - (fix) bug where the blur event would be triggered when clicking upon the page 125 | - (cfg) required : triggers invalid / valid events when not filled 126 | - (fea) validation through isValid() method 127 | 128 | v1.0. initial component release 129 | =============================== 130 | - choose to allow free entries or not 131 | - keyboard management 132 | - theme ability 133 | - static and dynamic data processing 134 | - positionning 135 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "magicsuggest", 3 | "version": "2.1.7", 4 | "main": ["magicsuggest.js", "magicsuggest.css"], 5 | "dependencies": { 6 | "bootstrap": "~3", 7 | "jquery": ">= 1.8.3" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nicolasbize/magicsuggest", 3 | "description": "MagicSuggest is a multiple selection auto-suggest input box for Bootstrap 3.", 4 | "version": "2.1.7", 5 | "type": "component", 6 | "homepage": "http://nicolasbize.com/magicsuggest", 7 | "license": "MIT", 8 | "require": { 9 | "components/bootstrap": ">=3.0.0", 10 | "components/jquery": ">=1.8.3" 11 | }, 12 | "extra": { 13 | "component": { 14 | "scripts": [ 15 | "magicsuggest.js" 16 | ], 17 | "files": [ 18 | "magicsuggest.css" 19 | ] 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /magicsuggest.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Multiple Selection Component for Bootstrap 3 | * 4 | * Author: Nicolas Bize 5 | * Maintainer: Sergio F. Rodriguez 6 | * Created: Feb 8th 2013 7 | * Last Updated: Feb 15th 2024 8 | * Version: 2.1.4 9 | * Licence: MagicSuggest is licenced under MIT licence (http://opensource.org/licenses/MIT) 10 | */ 11 | .ms-ctn{ 12 | position: relative; 13 | padding: 5px 12px; 14 | height: auto; 15 | } 16 | .ms-inv{ 17 | border: 1px solid #CC0000; 18 | } 19 | .ms-ctn-readonly{ 20 | cursor: pointer; 21 | } 22 | .ms-ctn-disabled{ 23 | cursor: not-allowed; 24 | background-color: #eeeeee; 25 | } 26 | .ms-ctn-bootstrap-focus, 27 | .ms-ctn-bootstrap-focus .ms-res-ctn{ 28 | border-color: rgba(82, 168, 236, 0.8) !important; 29 | /* IE6-9 */ 30 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6) !important; 31 | -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6) !important; 32 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6) !important; 33 | border-bottom-left-radius: 0; 34 | border-bottom-right-radius: 0; 35 | } 36 | .ms-ctn-focus{ 37 | border-color: #66afe9; 38 | outline: 0; 39 | -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); 40 | box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); 41 | } 42 | .ms-ctn input{ 43 | border: 0; 44 | box-shadow: none; 45 | -webkit-transition: none; 46 | outline: none; 47 | display: block; 48 | padding: 0; 49 | line-height: 1.42857143; 50 | margin: 1px 0; 51 | width: 100%; 52 | } 53 | .ms-ctn .ms-sel-ctn input{ 54 | float: left; 55 | } 56 | .ms-ctn-disabled input{ 57 | cursor: not-allowed; 58 | background-color: #eeeeee; 59 | } 60 | .ms-ctn .ms-input-readonly{ 61 | cursor: pointer; 62 | } 63 | .ms-ctn .ms-empty-text{ 64 | color: #DDD; 65 | } 66 | .ms-ctn input:focus{ 67 | border: 0; 68 | box-shadow: none; 69 | -webkit-transition: none; 70 | background: #FFF; 71 | } 72 | .ms-ctn input::-ms-clear { 73 | width: 0; 74 | height: 0; 75 | } 76 | .ms-ctn .ms-trigger{ 77 | top: 0; 78 | width: 25px; 79 | height:100%; 80 | position:absolute; 81 | right:0; 82 | background: transparent; 83 | border-left: 1px solid #CCC; 84 | cursor: pointer; 85 | } 86 | .ms-ctn .ms-trigger .ms-trigger-ico { 87 | display: inline-block; 88 | width: 0; 89 | height: 0; 90 | vertical-align: top; 91 | border-top: 4px solid #333; 92 | border-right: 4px solid transparent; 93 | border-left: 4px solid transparent; 94 | content: ""; 95 | margin-left: 8px; 96 | margin-top: 15px; 97 | } 98 | .ms-ctn .ms-trigger:hover{ 99 | background-color: #e6e6e6; 100 | } 101 | .ms-ctn .ms-trigger:hover .ms-trigger-ico{ 102 | background-position: 0 -4px; 103 | } 104 | .ms-ctn-disabled .ms-trigger{ 105 | cursor: not-allowed; 106 | background-color: #eeeeee; 107 | } 108 | .ms-ctn-bootstrap-focus{ 109 | border-bottom: 1px solid #CCC; 110 | } 111 | .ms-res-ctn{ 112 | width: 100%; 113 | display: block; 114 | overflow-y: auto; 115 | } 116 | .ms-res-ctn .ms-res-group{ 117 | line-height: 23px; 118 | text-align: left; 119 | padding: 2px 5px; 120 | font-weight: bold; 121 | border-bottom: 1px dotted #CCC; 122 | border-top: 1px solid #CCC; 123 | background: #f3edff; 124 | color: #333; 125 | } 126 | .ms-res-ctn .ms-res-item{ 127 | line-height: 25px; 128 | text-align: left; 129 | padding: 2px 5px; 130 | color: #666; 131 | cursor: pointer; 132 | } 133 | .ms-res-ctn .ms-res-item-grouped{ 134 | padding-left: 15px; 135 | } 136 | .ms-res-ctn .ms-res-odd{ 137 | background: #FAFAFA; 138 | } 139 | .ms-res-ctn .ms-res-item-active{ 140 | background-color: #F5F5F5; 141 | } 142 | .ms-res-ctn .ms-res-item-disabled{ 143 | color: #CCC; 144 | cursor: default; 145 | } 146 | .ms-sel-ctn{ 147 | overflow: auto; 148 | line-height: 18px; 149 | padding-right: 25px; 150 | } 151 | .ms-no-trigger .ms-sel-ctn{ 152 | padding-right: 0; 153 | } 154 | /** Outer and global tags **/ 155 | .ms-sel-ctn .ms-sel-item{ 156 | background: #F3F3F3; 157 | color: #999; 158 | float: left; 159 | font-size: 12px; 160 | padding: 3px 5px; 161 | border-radius: 3px; 162 | border: 1px solid #DDD; 163 | margin: 3px 0px 1px 0; 164 | } 165 | .ms-sel-ctn .ms-sel-invalid{ 166 | border-color: rgb(248, 165, 165) !important; 167 | background: #FDF2F2 !important; 168 | } 169 | .ms-sel-ctn .ms-sel-item:hover{ 170 | border: 1px solid #BBB; 171 | } 172 | /** For inner tags **/ 173 | .ms-ctn .ms-sel-item{ 174 | background: #F3F3F3; 175 | color: #999; 176 | float: left; 177 | font-size: 12px; 178 | padding: 0 5px; 179 | border-radius: 3px; 180 | border: 1px solid #DDD; 181 | margin: 1px 5px 1px 0; 182 | } 183 | .ms-ctn .ms-sel-item:hover{ 184 | border: 1px solid transparent; 185 | } 186 | .ms-ctn-focus .ms-sel-item:hover{ 187 | border: 1px solid #BBB; 188 | } 189 | .ms-sel-ctn .ms-sel-text{ 190 | background: #FFF; 191 | color: #666; 192 | padding-right: 0; 193 | margin-left: 0; 194 | font-size: 14px; 195 | font-weight: normal; 196 | } 197 | .ms-as-string .ms-sel-text{ 198 | border-color: transparent; 199 | } 200 | .ms-res-ctn .ms-res-item em{ 201 | font-style: normal; 202 | background: #565656; 203 | color: #FFF; 204 | } 205 | .ms-sel-ctn .ms-sel-text:hover{ 206 | background: #FFF; 207 | } 208 | .ms-sel-ctn .ms-sel-item-active{ 209 | border: 1px solid red; 210 | background: #757575; 211 | } 212 | .ms-stacked .ms-sel-item{ 213 | float: inherit; 214 | } 215 | .ms-sel-ctn .ms-sel-item .ms-close-btn{ 216 | width: 7px; 217 | cursor: pointer; 218 | height: 7px; 219 | float: right; 220 | margin: 6px 2px 0 10px; 221 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAOCAYAAADjXQYbAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAEZ0FNQQAAsY58+1GTAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAABSSURBVHjahI7BCQAwCAOTzpThHMHh3Kl9CVos9XckFwQAuPtGuWTWwMwaczKzyHsqg6+5JqMJr28BABHRwmTWQFJjTmYWOU1L4tdck9GE17dnALGAS+kAR/u2AAAAAElFTkSuQmCC); 222 | background-position: 0 -7px; 223 | } 224 | .ms-sel-ctn .ms-sel-item .ms-close-btn:hover{ 225 | background-position: 0 0; 226 | } 227 | .ms-stacked .ms-sel-item .ms-close-btn { 228 | margin-left: 0px; 229 | } 230 | .ms-helper{ 231 | color: #AAA; 232 | font-size: 10px; 233 | position: absolute; 234 | top: -17px; 235 | right: 0; 236 | } 237 | .ms-ctn.input-lg .ms-trigger .ms-trigger-ico { 238 | margin-top: 17px 239 | } 240 | .ms-ctn.input-sm .ms-trigger .ms-trigger-ico { 241 | margin-top: 13px 242 | } 243 | .ms-ctn.input-lg .ms-sel-ctn .ms-sel-item { 244 | padding-top: 2px; 245 | padding-bottom: 3px; 246 | } 247 | .ms-ctn.input-sm .ms-sel-ctn { 248 | line-height: 15px; 249 | } 250 | .ms-ctn.input-sm .ms-sel-ctn .ms-sel-item { 251 | padding-top: 1px; 252 | padding-bottom: 1px; 253 | margin-top:0; 254 | margin-bottom: 0; 255 | } 256 | .ms-ctn.input-sm .ms-sel-ctn .ms-sel-item .ms-close-btn { 257 | margin-top: 4px; 258 | } 259 | .ms-ctn .ms-sel-ctn { 260 | margin-left: -7px; 261 | } 262 | .ms-ctn .ms-trigger:hover { 263 | width:24px; 264 | right: 1px; 265 | border-radius: 0 3px 3px 0; 266 | } 267 | -------------------------------------------------------------------------------- /magicsuggest.jquery.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "magicsuggest", 3 | "title": "MagicSuggest", 4 | "description": "MagicSuggest is a multiple selection auto suggest combo box for Bootstrap 3.", 5 | "keywords": [ 6 | "select", 7 | "suggest", 8 | "autocomplete", 9 | "typeahead", 10 | "dropdown", 11 | "multiselect", 12 | "tag", 13 | "tagging", 14 | "bootstrap", 15 | "combobox" 16 | ], 17 | "version": "2.1.7", 18 | "author": { 19 | "name": "Nicolas Bize", 20 | "url": "https://github.com/nicolasbize" 21 | }, 22 | "licenses": [ 23 | { 24 | "type": "MIT", 25 | "url": "http://nicolasbize.com/magicsuggest/licence.html" 26 | } 27 | ], 28 | "bugs": "https://github.com/nicolasbize/magicsuggest/issues", 29 | "homepage": "http://nicolasbize.com/magicsuggest/", 30 | "docs": "http://nicolasbize.com/magicsuggest/doc.html", 31 | "download": "https://github.com/nicolasbize/magicsuggest/releases", 32 | "dependencies": { 33 | "jquery": ">=1.8.3", 34 | "bootstrap": ">=3.0.0" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /magicsuggest.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license MIT 3 | * Multiple Selection Component for Bootstrap 4 | * 5 | * Author: Nicolas Bize 6 | * Maintainer: Sergio F. Rodriguez 7 | * Created: Feb 8th 2013 8 | * Last Updated: Feb 15, 2024 9 | * Version: @VERSION@ 10 | * Licence: MagicSuggest is licenced under MIT licence (http://opensource.org/licenses/MIT) 11 | */ 12 | (function ($) { 13 | "use strict"; 14 | 15 | let MagicSuggest = function (element, options) { 16 | let ms = this; 17 | 18 | /** 19 | * Initializes the MagicSuggest component 20 | */ 21 | let defaults = { 22 | /********** CONFIGURATION PROPERTIES ************/ 23 | /** 24 | * Restricts or allows the user to validate typed entries. 25 | * Defaults to true. 26 | */ 27 | allowFreeEntries: true, 28 | 29 | /** 30 | * Restricts or allows the user to add the same entry more than once 31 | * Defaults to false. 32 | */ 33 | allowDuplicates: false, 34 | 35 | /** 36 | * Additional config object passed to each $.ajax call 37 | */ 38 | ajaxConfig: {}, 39 | 40 | /** 41 | * If ajaxJSONMode is true, form data must be send in JSON format 42 | */ 43 | ajaxJSONMode: false, 44 | 45 | /** 46 | * If a single suggestion comes out, it is preselected. 47 | */ 48 | autoSelect: true, 49 | 50 | /** 51 | * Auto select the first matching item with multiple items shown 52 | */ 53 | selectFirst: false, 54 | 55 | /** 56 | * Allow customization of query parameter 57 | */ 58 | queryParam: 'query', 59 | 60 | /** 61 | * A function triggered just before the ajax request is sent, similar to jQuery 62 | */ 63 | beforeSend: function () { 64 | }, 65 | 66 | /** 67 | * A custom CSS class to apply to the field's underlying element. 68 | */ 69 | cls: '', 70 | 71 | /** 72 | * JSON Data source used to populate the combo box. 3 options are available here: 73 | * No Data Source (default) 74 | * When left null, the combo box will not suggest anything. It can still enable the user to enter 75 | * multiple entries if allowFreeEntries is * set to true (default). 76 | * Static Source 77 | * You can pass an array of JSON objects, an array of strings or even a single CSV string as the 78 | * data source.For ex. data: [* {id:0,name:"Paris"}, {id: 1, name: "New York"}] 79 | * You can also pass any json object with the results property containing the json array. 80 | * Url 81 | * You can pass the url from which the component will fetch its JSON data.Data will be fetched 82 | * using a POST ajax request that will * include the entered text as 'query' parameter. The results 83 | * fetched from the server can be: 84 | * - an array of JSON objects (ex: [{id:...,name:...},{...}]) 85 | * - a string containing an array of JSON objects ready to be parsed (ex: "[{id:...,name:...},{...}]") 86 | * - a JSON object whose data will be contained in the results property 87 | * (ex: {results: [{id:...,name:...},{...}] 88 | * Function 89 | * You can pass a function which returns an array of JSON objects (ex: [{id:...,name:...},{...}]) 90 | * The function can return the JSON data or it can use the first argument as function to handle the data. 91 | * Only one (callback function or return value) is needed for the function to succeed. 92 | * See the following example: 93 | * function (response) { var myjson = [{name: 'test', id: 1}]; response(myjson); return myjson; } 94 | */ 95 | data: null, 96 | 97 | /** 98 | * Additional parameters to the ajax call 99 | */ 100 | dataUrlParams: {}, 101 | 102 | /** 103 | * Start the component in a disabled state. 104 | */ 105 | disabled: false, 106 | 107 | /** 108 | * Name of JSON object property that defines the disabled behaviour 109 | */ 110 | disabledField: null, 111 | 112 | /** 113 | * Name of JSON object property displayed in the combo list 114 | */ 115 | displayField: 'name', 116 | 117 | /** 118 | * Name of JSON object property used as tooltip of items selected 119 | */ 120 | tooltipField: 'title', 121 | 122 | /** 123 | * Set to false if you only want mouse interaction. In that case the combo will 124 | * automatically expand on focus. 125 | */ 126 | editable: true, 127 | 128 | /** 129 | * Set starting state for combo. 130 | */ 131 | expanded: false, 132 | 133 | /** 134 | * Automatically expands combo on focus. 135 | */ 136 | expandOnFocus: false, 137 | 138 | /** 139 | * JSON property by which the list should be grouped 140 | */ 141 | groupBy: null, 142 | 143 | /** 144 | * Set to true to hide the trigger on the right 145 | */ 146 | hideTrigger: false, 147 | 148 | /** 149 | * Set to true to highlight search input within displayed suggestions 150 | */ 151 | highlight: true, 152 | 153 | /** 154 | * A custom ID for this component 155 | */ 156 | id: null, 157 | 158 | /** 159 | * A class that is added to the info message appearing on the top-right part of the component 160 | */ 161 | infoMsgCls: '', 162 | 163 | /** 164 | * Additional parameters passed out to the INPUT tag. Enables usage of AngularJS's custom tags for ex. 165 | */ 166 | inputCfg: {}, 167 | 168 | /** 169 | * The class that is applied to show that the field is invalid 170 | */ 171 | invalidCls: 'ms-inv', 172 | 173 | /** 174 | * Set to true to filter data results according to case. Useless if the data is fetched remotely 175 | */ 176 | matchCase: false, 177 | 178 | /** 179 | * Once expanded, the combo's height will take as much room as the # of available results. 180 | * In case there are too many results displayed, this will fix the drop down height. 181 | */ 182 | maxDropHeight: 290, 183 | 184 | /** 185 | * Defines how long the user free entry can be. Set to null for no limit. 186 | */ 187 | maxEntryLength: null, 188 | 189 | /** 190 | * A function that defines the helper text when the max entry length has been surpassed. 191 | */ 192 | maxEntryRenderer: function (v) { 193 | return 'Please reduce your entry by ' + v + ' character' + (v > 1 ? 's' : ''); 194 | }, 195 | 196 | /** 197 | * The maximum number of results displayed in the combo drop down at once. 198 | */ 199 | maxSuggestions: null, 200 | 201 | /** 202 | * The maximum number of items the user can select if multiple selection is allowed. 203 | * Set to null to remove the limit. 204 | */ 205 | maxSelection: 10, 206 | 207 | /** 208 | * A function that defines the helper text when the max selection amount has been reached. The function has a single 209 | * parameter which is the number of selected elements. 210 | */ 211 | maxSelectionRenderer: function (v) { 212 | return 'You cannot choose more than ' + v + ' item' + (v > 1 ? 's' : ''); 213 | }, 214 | 215 | /** 216 | * The method used by the ajax request. 217 | */ 218 | method: 'POST', 219 | 220 | /** 221 | * The minimum number of characters the user must type before the combo expands and offers suggestions. 222 | */ 223 | minChars: 0, 224 | 225 | /** 226 | * A function that defines the helper text when not enough letters are set. The function has a single 227 | * parameter which is the difference between the required amount of letters and the current one. 228 | */ 229 | minCharsRenderer: function (v) { 230 | return 'Please type ' + v + ' more character' + (v > 1 ? 's' : ''); 231 | }, 232 | 233 | /** 234 | * Whether sorting / filtering should be done remotely or locally. 235 | * Use either 'local' or 'remote' 236 | */ 237 | mode: 'local', 238 | 239 | /** 240 | * The name used as a form element. 241 | */ 242 | name: 'MagicSuggest', 243 | 244 | /** 245 | * The text displayed when there are no suggestions. 246 | */ 247 | noSuggestionText: 'No suggestions', 248 | 249 | /** 250 | * The default placeholder text when nothing has been entered 251 | */ 252 | placeholder: 'Type or click here', 253 | 254 | /** 255 | * A function used to define how the items will be presented in the combo 256 | */ 257 | renderer: null, 258 | 259 | /** 260 | * Whether or not this field should be required 261 | */ 262 | required: false, 263 | 264 | /** 265 | * Set to true to render selection as a delimited string 266 | */ 267 | resultAsString: false, 268 | 269 | /** 270 | * Text delimiter to use in a delimited string. 271 | */ 272 | resultAsStringDelimiter: ',', 273 | 274 | /** 275 | * Name of JSON object property that represents the list of suggested objects 276 | */ 277 | resultsField: 'results', 278 | 279 | /** 280 | * A custom CSS class to add to a selected item 281 | */ 282 | selectionCls: '', 283 | 284 | /** 285 | * An optional element replacement in which the selection is rendered 286 | */ 287 | selectionContainer: null, 288 | 289 | /** 290 | * Where the selected items will be displayed. Only 'right', 'bottom' and 'inner' are valid values 291 | */ 292 | selectionPosition: 'inner', 293 | 294 | /** 295 | * A function used to define how the items will be presented in the tag list 296 | */ 297 | selectionRenderer: null, 298 | 299 | /** 300 | * Set to true to stack the selectioned items when positioned on the bottom 301 | * Requires the selectionPosition to be set to 'bottom' 302 | */ 303 | selectionStacked: false, 304 | 305 | /** 306 | * Direction used for sorting. Only 'asc' and 'desc' are valid values 307 | */ 308 | sortDir: 'asc', 309 | 310 | /** 311 | * name of JSON object property for local result sorting. 312 | * Leave null if you do not wish the results to be ordered or if they are already ordered remotely. 313 | */ 314 | sortOrder: null, 315 | 316 | /** 317 | * If set to true, suggestions will have to start by user input (and not simply contain it as a substring) 318 | */ 319 | strictSuggest: false, 320 | 321 | /** 322 | * Custom style added to the component container. 323 | */ 324 | style: '', 325 | 326 | /** 327 | * If set to true, the combo will expand / collapse when clicked upon 328 | */ 329 | toggleOnClick: false, 330 | 331 | /** 332 | * Amount (in ms) between keyboard registers. 333 | */ 334 | typeDelay: 400, 335 | 336 | /** 337 | * If set to true, tab won't blur the component but will be registered as the ENTER key 338 | */ 339 | useTabKey: false, 340 | 341 | /** 342 | * If set to true, using comma will validate the user's choice 343 | */ 344 | useCommaKey: true, 345 | 346 | /** 347 | * Determines whether or not the results will be displayed with a zebra table style 348 | */ 349 | useZebraStyle: false, 350 | 351 | /** 352 | * initial value for the field 353 | */ 354 | value: null, 355 | 356 | /** 357 | * name of JSON object property that represents its underlying value 358 | */ 359 | valueField: 'id', 360 | 361 | /** 362 | * regular expression to validate the values against 363 | */ 364 | vregex: null, 365 | 366 | /** 367 | * type to validate against 368 | */ 369 | vtype: null 370 | }; 371 | 372 | let conf = $.extend({}, options); 373 | let cfg = $.extend(true, {}, defaults, conf); 374 | 375 | /********** PUBLIC METHODS ************/ 376 | /** 377 | * Add one or multiple json items to the current selection 378 | * @param items - json object or array of json objects 379 | * @param isSilent - (optional) set to true to suppress 'selectionchange' event from being triggered 380 | */ 381 | this.addToSelection = function (items, isSilent) { 382 | if (!cfg.maxSelection || _selection.length < cfg.maxSelection) { 383 | 384 | // If the selection is inner and has a value, set the placeholder to an empty string 385 | let valueChanged = false; 386 | 387 | // If the items is not an array, convert it to an array 388 | if (!Array.isArray(items)) { 389 | items = [items]; 390 | } 391 | 392 | // Add the items to the selection 393 | items.forEach((selection) => { 394 | if (cfg.allowDuplicates || $.inArray(selection[cfg.valueField], ms.getValue()) === -1) { 395 | _selection.push(selection); 396 | valueChanged = true; 397 | } 398 | }); 399 | 400 | // If the selection is inner and has a value, set the placeholder to an empty string 401 | if (valueChanged === true) { 402 | self._renderSelection(); 403 | this.empty(); 404 | if (isSilent !== true) { 405 | $(this).trigger('selectionchange', [this, this.getSelection()]); 406 | } 407 | } 408 | } 409 | 410 | // If the selection is inner and has a value, set the placeholder to an empty string 411 | const isInnerSelection = cfg.selectionPosition === 'inner'; 412 | const hasValue = this.getValue().length > 0; 413 | const placeholder = isInnerSelection && hasValue ? '' : cfg.placeholder; 414 | 415 | // Set the placeholder to an empty string if the selection is inner and has a value 416 | this.input.attr('placeholder', placeholder); 417 | }; 418 | 419 | /** 420 | * Clears the current selection 421 | * @param isSilent - (optional) set to true to suppress 'selectionchange' event from being triggered 422 | */ 423 | this.clear = function (isSilent) { 424 | this.removeFromSelection(_selection.slice(0), isSilent); // clone array to avoid concurrency issues 425 | }; 426 | 427 | /** 428 | * Collapse the dropdown part of the combo 429 | */ 430 | this.collapse = function () { 431 | if (cfg.expanded === true) { 432 | this.combobox.detach(); 433 | cfg.expanded = false; 434 | $(this).trigger('collapse', [this]); 435 | } 436 | }; 437 | 438 | /** 439 | * Set the component in a disabled state. 440 | */ 441 | this.disable = function () { 442 | this.container.addClass('ms-ctn-disabled'); 443 | cfg.disabled = true; 444 | ms.input.attr('disabled', true); 445 | }; 446 | 447 | /** 448 | * Empties out the combo user text 449 | */ 450 | this.empty = function () { 451 | this.input.val(''); 452 | }; 453 | 454 | /** 455 | * Set the component in a enable state. 456 | */ 457 | this.enable = function () { 458 | this.container.removeClass('ms-ctn-disabled'); 459 | cfg.disabled = false; 460 | ms.input.attr('disabled', false); 461 | }; 462 | 463 | /** 464 | * Expand the drop drown part of the combo. 465 | */ 466 | this.expand = function () { 467 | if (!cfg.expanded && (this.input.val().length >= cfg.minChars || this.combobox.children().length > 0)) { 468 | this.combobox.appendTo(this.container); 469 | self._processSuggestions(); 470 | cfg.expanded = true; 471 | $(this).trigger('expand', [this]); 472 | } 473 | }; 474 | 475 | /** 476 | * Retrieve component enabled status 477 | */ 478 | this.isDisabled = function () { 479 | return cfg.disabled; 480 | }; 481 | 482 | /** 483 | * Checks whether the field is valid or not 484 | * @return {boolean} 485 | */ 486 | this.isValid = function () { 487 | var valid = cfg.required === false || _selection.length > 0; 488 | if (cfg.vtype || cfg.vregex) { 489 | $.each(_selection, function (index, item) { 490 | valid = valid && self._validateSingleItem(item[cfg.valueField]); 491 | }); 492 | } 493 | return valid; 494 | }; 495 | 496 | /** 497 | * Gets the data params for current ajax request 498 | */ 499 | this.getDataUrlParams = function () { 500 | return cfg.dataUrlParams; 501 | }; 502 | 503 | /** 504 | * Gets the name given to the form input 505 | */ 506 | this.getName = function () { 507 | return cfg.name; 508 | }; 509 | 510 | /** 511 | * Retrieve an array of selected json objects 512 | * @return {Array} 513 | */ 514 | this.getSelection = function () { 515 | return _selection; 516 | }; 517 | 518 | /** 519 | * Retrieve the current text entered by the user 520 | */ 521 | this.getRawValue = function () { 522 | return this.stripHtml(ms.input.val()); 523 | }; 524 | 525 | /** 526 | * remove html from raw user input 527 | */ 528 | this.stripHtml = function (inputString) { 529 | return inputString.replace(/(<([^>]+)>)/gi, ""); 530 | }; 531 | 532 | /** 533 | * Retrieve an array of selected values 534 | */ 535 | this.getValue = function () { 536 | return $.map(_selection, function (o) { 537 | return o[cfg.valueField]; 538 | }); 539 | }; 540 | 541 | /** 542 | * Remove one or multiples json items from the current selection 543 | * @param items - json object or array of json objects 544 | * @param isSilent - (optional) set to true to suppress 'selectionchange' event from being triggered 545 | */ 546 | this.removeFromSelection = function (items, isSilent) { 547 | if (!Array.isArray(items)) { 548 | items = [items]; 549 | } 550 | var valuechanged = false; 551 | $.each(items, function (index, json) { 552 | var i = $.inArray(json[cfg.valueField], ms.getValue()); 553 | if (i > -1) { 554 | _selection.splice(i, 1); 555 | valuechanged = true; 556 | } 557 | }); 558 | if (valuechanged === true) { 559 | self._renderSelection(); 560 | if (isSilent !== true) { 561 | $(this).trigger('selectionchange', [this, this.getSelection()]); 562 | } 563 | if (cfg.expandOnFocus) { 564 | ms.expand(); 565 | } 566 | if (cfg.expanded) { 567 | self._processSuggestions(); 568 | } 569 | } 570 | this.input.attr('placeholder', (cfg.selectionPosition === 'inner' && this.getValue().length > 0) ? '' : cfg.placeholder); 571 | this.input.css({width: '100%'}); 572 | }; 573 | 574 | /** 575 | * Get current data 576 | */ 577 | this.getData = function () { 578 | return _cbData; 579 | }; 580 | 581 | /** 582 | * Set up some combo data after it has been rendered 583 | * @param data 584 | */ 585 | this.setData = function (data) { 586 | cfg.data = data; 587 | self._processSuggestions(); 588 | }; 589 | 590 | /** 591 | * Sets the name for the input field so it can be fetched in the form 592 | * @param name 593 | */ 594 | this.setName = function (name) { 595 | cfg.name = name; 596 | if (name) { 597 | cfg.name += name.indexOf('[]') > 0 ? '' : '[]'; 598 | } 599 | if (ms._valueContainer) { 600 | $.each(ms._valueContainer.children(), function (i, el) { 601 | el.name = cfg.name; 602 | }); 603 | } 604 | }; 605 | 606 | /** 607 | * Sets the current selection with the JSON items provided 608 | * @param items 609 | */ 610 | this.setSelection = function (items) { 611 | this.clear(); 612 | this.addToSelection(items); 613 | }; 614 | 615 | /** 616 | * Sets a value for the combo box. Value must be an array of values with data type matching valueField one. 617 | * @param data 618 | */ 619 | this.setValue = function (values) { 620 | var items = []; 621 | $.each(values, function (index, value) { 622 | // first try to see if we have the full objects from our data set 623 | var found = false; 624 | $.each(_cbData, function (i, item) { 625 | if (item[cfg.valueField] == value) { 626 | items.push(item); 627 | found = true; 628 | return false; 629 | } 630 | }); 631 | if (!found) { 632 | if (typeof (value) === 'object') { 633 | items.push(value); 634 | } else { 635 | var json = {}; 636 | json[cfg.valueField] = value; 637 | json[cfg.displayField] = value; 638 | items.push(json); 639 | } 640 | } 641 | }); 642 | if (items.length > 0) { 643 | this.addToSelection(items); 644 | } 645 | }; 646 | 647 | /** 648 | * Sets data params for subsequent ajax requests 649 | * @param params 650 | */ 651 | this.setDataUrlParams = function (params) { 652 | cfg.dataUrlParams = $.extend({}, params); 653 | }; 654 | 655 | /** 656 | * Sets a new max select size. Removes any selections beyond the new selection size 657 | * @param newSelectionSize 658 | */ 659 | this.setMaxSelection = function (newSelectionSize) { 660 | if (newSelectionSize < 0) { 661 | newSelectionSize = null; 662 | } 663 | 664 | //if the number that is currently selected is larger than the max selection, truncate down to the max size 665 | if (newSelectionSize !== null && _selection.length > newSelectionSize) { 666 | this.removeFromSelection(_selection.slice(newSelectionSize)); 667 | } 668 | 669 | cfg.maxSelection = newSelectionSize; 670 | }; 671 | 672 | /********** PRIVATE ************/ 673 | var _selection = [], // selected objects 674 | _comboItemHeight = 0, // height for each combo item. 675 | _timer, 676 | _hasFocus = false, 677 | _groups = null, 678 | _cbData = [], 679 | _ctrlDown = false, 680 | KEYCODES = { 681 | BACKSPACE: 8, 682 | TAB: 9, 683 | ENTER: 13, 684 | SHIFT: 16, 685 | CTRL: 17, 686 | ESC: 27, 687 | SPACE: 32, 688 | UPARROW: 38, 689 | DOWNARROW: 40, 690 | COMMA: 188 691 | }; 692 | 693 | var self = { 694 | /** 695 | * Empties the result container and refills it with the array of json results in input 696 | * @private 697 | */ 698 | _displaySuggestions: function (data) { 699 | ms.combobox.show(); 700 | ms.combobox.empty(); 701 | 702 | var resHeight = 0, // total height taken by displayed results. 703 | nbGroups = 0; 704 | 705 | if (_groups === null) { 706 | self._renderComboItems(data); 707 | resHeight = _comboItemHeight * data.length; 708 | } else { 709 | for (var grpName in _groups) { 710 | nbGroups += 1; 711 | $('
', { 712 | 'class': 'ms-res-group', 713 | html: grpName 714 | }).appendTo(ms.combobox); 715 | self._renderComboItems(_groups[grpName].items, true); 716 | } 717 | var _groupItemHeight = ms.combobox.find('.ms-res-group').outerHeight(); 718 | if (_groupItemHeight !== null) { 719 | var tmpResHeight = nbGroups * _groupItemHeight; 720 | resHeight = (_comboItemHeight * data.length) + tmpResHeight; 721 | } else { 722 | resHeight = _comboItemHeight * (data.length + nbGroups); 723 | } 724 | } 725 | 726 | if (resHeight < ms.combobox.height() || resHeight <= cfg.maxDropHeight) { 727 | ms.combobox.height(resHeight); 728 | } else if (resHeight >= ms.combobox.height() && resHeight > cfg.maxDropHeight) { 729 | ms.combobox.height(cfg.maxDropHeight); 730 | } 731 | 732 | if (data.length === 1 && cfg.autoSelect === true) { 733 | ms.combobox.children().filter(':not(.ms-res-item-disabled):last').addClass('ms-res-item-active'); 734 | } 735 | 736 | if (cfg.selectFirst === true) { 737 | ms.combobox.children().filter(':not(.ms-res-item-disabled):first').addClass('ms-res-item-active'); 738 | } 739 | 740 | if (data.length === 0 && ms.getRawValue() !== "") { 741 | var noSuggestionText = cfg.noSuggestionText.replace(/\{\{.*\}\}/, ms.input.val()); 742 | self._updateHelper(noSuggestionText); 743 | ms.collapse(); 744 | } 745 | 746 | // When free entry is off, add invalid class to input if no data matches 747 | if (cfg.allowFreeEntries === false) { 748 | if (data.length === 0) { 749 | $(ms.input).addClass(cfg.invalidCls); 750 | ms.combobox.hide(); 751 | } else { 752 | $(ms.input).removeClass(cfg.invalidCls); 753 | } 754 | } 755 | }, 756 | 757 | /** 758 | * Returns an array of json objects from an array of strings. 759 | * @private 760 | */ 761 | _getEntriesFromStringArray: function (data) { 762 | var json = []; 763 | $.each(data, function (index, element) { 764 | var entry = {}; 765 | entry[cfg.displayField] = entry[cfg.valueField] = element.trim(); 766 | json.push(entry); 767 | }); 768 | return json; 769 | }, 770 | 771 | /** 772 | * Replaces html with highlighted html according to case 773 | * @param html 774 | * @private 775 | */ 776 | _highlightSuggestion: function (html) { 777 | var q = ms.input.val(); 778 | 779 | //escape special regex characters 780 | var specialCharacters = ['^', '$', '*', '+', '?', '.', '(', ')', ':', '!', '|', '{', '}', '[', ']']; 781 | 782 | $.each(specialCharacters, function (index, value) { 783 | q = q.replace(value, "\\" + value); 784 | }) 785 | 786 | if (q.length === 0) { 787 | return html; // nothing entered as input 788 | } 789 | 790 | var glob = cfg.matchCase === true ? 'g' : 'gi'; 791 | return html.replace(new RegExp('(' + q + ')(?!([^<]+)?>)', glob), '$1'); 792 | }, 793 | 794 | /** 795 | * Moves the selected cursor amongst the list item 796 | * @param dir - 'up' or 'down' 797 | * @private 798 | */ 799 | _moveSelectedRow: function (dir) { 800 | if (!cfg.expanded) { 801 | ms.expand(); 802 | } 803 | var list, start, active, scrollPos; 804 | list = ms.combobox.find(".ms-res-item:not(.ms-res-item-disabled)"); 805 | if (dir === 'down') { 806 | start = list.eq(0); 807 | } else { 808 | start = list.filter(':last'); 809 | } 810 | active = ms.combobox.find('.ms-res-item-active:not(.ms-res-item-disabled):first'); 811 | if (active.length > 0) { 812 | if (dir === 'down') { 813 | start = active.nextAll('.ms-res-item:not(.ms-res-item-disabled)').first(); 814 | if (start.length === 0) { 815 | start = list.eq(0); 816 | } 817 | scrollPos = ms.combobox.scrollTop(); 818 | ms.combobox.scrollTop(0); 819 | if (start[0].offsetTop + start.outerHeight() > ms.combobox.height()) { 820 | ms.combobox.scrollTop(scrollPos + _comboItemHeight); 821 | } 822 | } else { 823 | start = active.prevAll('.ms-res-item:not(.ms-res-item-disabled)').first(); 824 | if (start.length === 0) { 825 | start = list.filter(':last'); 826 | ms.combobox.scrollTop(_comboItemHeight * list.length); 827 | } 828 | if (start[0].offsetTop < ms.combobox.scrollTop()) { 829 | ms.combobox.scrollTop(ms.combobox.scrollTop() - _comboItemHeight); 830 | } 831 | } 832 | } 833 | list.removeClass("ms-res-item-active"); 834 | start.addClass("ms-res-item-active"); 835 | }, 836 | 837 | /** 838 | * According to given data and query, sort and add suggestions in their container 839 | * @private 840 | */ 841 | _processSuggestions: function (source) { 842 | var json = null, data = source || cfg.data; 843 | if (data !== null) { 844 | if (typeof (data) === 'function') { 845 | data = data.call(ms, ms.getRawValue()); 846 | } 847 | if (typeof (data) === 'string') { // get results from ajax 848 | $(ms).trigger('beforeload', [ms]); 849 | var queryParams = {} 850 | queryParams[cfg.queryParam] = ms.input.val(); 851 | var params = $.extend(queryParams, cfg.dataUrlParams); 852 | 853 | var processData = true; 854 | var contentType = "application/x-www-form-urlencoded"; 855 | if (cfg.ajaxJSONMode) { 856 | //Adjust request ajax call 857 | processData = false; 858 | contentType = 'application/json'; 859 | params = JSON.stringify(params); 860 | } 861 | $.ajax($.extend({ 862 | type: cfg.method, 863 | url: data, 864 | data: params, 865 | contentType: contentType, 866 | processData: processData, 867 | beforeSend: cfg.beforeSend, 868 | success: function (asyncData) { 869 | json = typeof (asyncData) === 'string' ? JSON.parse(asyncData) : asyncData; 870 | self._processSuggestions(json); 871 | $(ms).trigger('load', [ms, json]); 872 | if (self._asyncValues) { 873 | ms.setValue(typeof (self._asyncValues) === 'string' ? JSON.parse(self._asyncValues) : self._asyncValues); 874 | self._renderSelection(); 875 | delete (self._asyncValues); 876 | } 877 | }, 878 | error: function (jqXHR, textStatus, errorThrown) { 879 | $(ms).trigger('error', [ms, jqXHR, textStatus, errorThrown]); 880 | } 881 | }, cfg.ajaxConfig)); 882 | return; 883 | } else { // results from local array 884 | if (data.length > 0 && typeof (data[0]) === 'string') { // results from array of strings 885 | _cbData = self._getEntriesFromStringArray(data); 886 | } else { // regular json array or json object with results property 887 | _cbData = data[cfg.resultsField] || data; 888 | } 889 | } 890 | var sortedData = cfg.mode === 'remote' ? _cbData : self._sortAndTrim(_cbData); 891 | self._displaySuggestions(self._group(sortedData)); 892 | 893 | } 894 | }, 895 | 896 | /** 897 | * Render the component to the given input DOM element 898 | * @private 899 | */ 900 | _render: function (el) { 901 | ms.setName(cfg.name); // make sure the form name is correct 902 | // holds the main div, will relay the focus events to the contained input element. 903 | ms.container = $('
', { 904 | 'class': 'ms-ctn form-control ' + (cfg.resultAsString ? 'ms-as-string ' : '') + cfg.cls + 905 | ($(el).hasClass('input-lg') ? ' input-lg' : '') + 906 | ($(el).hasClass('input-sm') ? ' input-sm' : '') + 907 | (cfg.disabled === true ? ' ms-ctn-disabled' : '') + 908 | (cfg.editable === true ? '' : ' ms-ctn-readonly') + 909 | (cfg.hideTrigger === false ? '' : ' ms-no-trigger'), 910 | style: cfg.style, 911 | id: cfg.id 912 | }); 913 | 914 | ms.container.on('focus', handlers._onFocus.bind(this)); 915 | ms.container.on('blur', handlers._onBlur.bind(this)); 916 | ms.container.on('keydown', handlers._onKeyDown.bind(this)); 917 | ms.container.on('keyup', handlers._onKeyUp.bind(this)); 918 | 919 | 920 | 921 | 922 | // holds the input field 923 | ms.input = $('', $.extend({ 924 | type: 'text', 925 | 'class': cfg.editable === true ? '' : ' ms-input-readonly', 926 | readonly: !cfg.editable, 927 | placeholder: cfg.placeholder, 928 | disabled: cfg.disabled 929 | }, cfg.inputCfg)); 930 | 931 | ms.input.on('focus', handlers._onInputFocus.bind(this)); 932 | ms.input.on('click', handlers._onInputClick.bind(this)); 933 | 934 | // holds the suggestions. will always be placed on focus 935 | ms.combobox = $('
', { 936 | 'class': 'ms-res-ctn dropdown-menu' 937 | }).height(cfg.maxDropHeight); 938 | 939 | // bind the onclick and mouseover using delegated events (needs jQuery >= 1.7) 940 | ms.combobox.on('click', 'div.ms-res-item', handlers._onComboItemSelected.bind(this)); 941 | ms.combobox.on('mouseover', 'div.ms-res-item', handlers._onComboItemMouseOver.bind(this)); 942 | 943 | if (cfg.selectionContainer) { 944 | ms.selectionContainer = cfg.selectionContainer; 945 | $(ms.selectionContainer).addClass('ms-sel-ctn'); 946 | } else { 947 | ms.selectionContainer = $('
', { 948 | 'class': 'ms-sel-ctn' 949 | }); 950 | } 951 | ms.selectionContainer.on('click', handlers._onFocus.bind(this)); 952 | 953 | if (cfg.selectionPosition === 'inner' && !cfg.selectionContainer) { 954 | ms.selectionContainer.append(ms.input); 955 | } else { 956 | ms.container.append(ms.input); 957 | } 958 | 959 | ms.helper = $('', { 960 | 'class': 'ms-helper ' + cfg.infoMsgCls 961 | }); 962 | 963 | self._updateHelper(); 964 | ms.container.append(ms.helper); 965 | 966 | 967 | // Render the whole thing 968 | $(el).replaceWith(ms.container); 969 | 970 | if (!cfg.selectionContainer) { 971 | switch (cfg.selectionPosition) { 972 | case 'bottom': 973 | ms.selectionContainer.insertAfter(ms.container); 974 | if (cfg.selectionStacked === true) { 975 | ms.selectionContainer.width(ms.container.width()); 976 | ms.selectionContainer.addClass('ms-stacked'); 977 | } 978 | break; 979 | case 'right': 980 | ms.selectionContainer.insertAfter(ms.container); 981 | ms.container.css('float', 'left'); 982 | break; 983 | default: 984 | ms.container.append(ms.selectionContainer); 985 | break; 986 | } 987 | } 988 | 989 | // holds the trigger on the right side 990 | if (cfg.hideTrigger === false) { 991 | ms.trigger = $('
', { 992 | 'class': 'ms-trigger', 993 | html: '
' 994 | }); 995 | ms.trigger.on('click', handlers._onTriggerClick.bind(this)); 996 | ms.container.append(ms.trigger); 997 | } 998 | 999 | $(window).on('resize', handlers._onWindowResized.bind(this)); 1000 | 1001 | // do not perform an initial call if we are using ajax unless we have initial values 1002 | if (cfg.value !== null || cfg.data !== null) { 1003 | if (typeof (cfg.data) === 'string') { 1004 | self._asyncValues = cfg.value; 1005 | self._processSuggestions(); 1006 | } else { 1007 | self._processSuggestions(); 1008 | if (cfg.value !== null) { 1009 | ms.setValue(cfg.value); 1010 | self._renderSelection(); 1011 | } 1012 | } 1013 | } 1014 | 1015 | $("body").on('click', function (e) { 1016 | var targetClass = $(e.target).attr('class'); 1017 | if (targetClass === undefined) { 1018 | targetClass = ""; 1019 | } 1020 | 1021 | if (ms.container.hasClass('ms-ctn-focus') && 1022 | ms.container.has(e.target).length === 0 && 1023 | targetClass.indexOf('ms-res-item') < 0 && 1024 | targetClass.indexOf('ms-close-btn') < 0 && 1025 | ms.container[0] !== e.target) { 1026 | handlers._onBlur(); 1027 | } 1028 | }); 1029 | 1030 | if (cfg.expanded === true) { 1031 | cfg.expanded = false; 1032 | ms.expand(); 1033 | } 1034 | }, 1035 | 1036 | /** 1037 | * Renders each element within the combo box 1038 | * @private 1039 | */ 1040 | _renderComboItems: function (items, isGrouped) { 1041 | var ref = this, html = ''; 1042 | $.each(items, function (index, value) { 1043 | var displayed = cfg.renderer !== null ? cfg.renderer.call(ref, value) : value[cfg.displayField]; 1044 | var disabled = cfg.disabledField !== null && value[cfg.disabledField] === true; 1045 | var titleText = cfg.tooltipField !== null ? value[cfg.tooltipField] : ''; 1046 | var resultItemEl = $('
', { 1047 | 'class': 'ms-res-item ' + (isGrouped ? 'ms-res-item-grouped ' : '') + 1048 | (disabled ? 'ms-res-item-disabled ' : '') + 1049 | (index % 2 === 1 && cfg.useZebraStyle === true ? 'ms-res-odd' : ''), 1050 | 'title': titleText, 1051 | html: cfg.highlight === true ? self._highlightSuggestion(displayed) : displayed, 1052 | 'data-json': JSON.stringify(value) 1053 | }); 1054 | html += $('
').append(resultItemEl).html(); 1055 | }); 1056 | ms.combobox.append(html); 1057 | _comboItemHeight = ms.combobox.find('.ms-res-item:first').outerHeight(); 1058 | }, 1059 | 1060 | /** 1061 | * Renders the selected items into their container. 1062 | * @private 1063 | */ 1064 | _renderSelection: function () { 1065 | var ref = this, w = 0, inputOffset = 0, items = [], 1066 | asText = cfg.resultAsString === true && !_hasFocus; 1067 | 1068 | ms.selectionContainer.find('.ms-sel-item').remove(); 1069 | if (ms._valueContainer !== undefined) { 1070 | ms._valueContainer.remove(); 1071 | } 1072 | 1073 | $.each(_selection, function (index, value) { 1074 | 1075 | var selectedItemEl, delItemEl, 1076 | selectedItemHtml = cfg.selectionRenderer !== null ? cfg.selectionRenderer.call(ref, value) : value[cfg.displayField]; 1077 | 1078 | var validCls = self._validateSingleItem(value[cfg.displayField]) ? '' : ' ms-sel-invalid'; 1079 | var titleText = cfg.tooltipField !== null ? value[cfg.tooltipField] : ''; 1080 | // tag representing selected value 1081 | if (asText === true) { 1082 | selectedItemEl = $('
', { 1083 | 'class': 'ms-sel-item ms-sel-text ' + cfg.selectionCls + validCls, 1084 | 'title': titleText, 1085 | html: selectedItemHtml + (index === (_selection.length - 1) ? '' : cfg.resultAsStringDelimiter) 1086 | }).data('json', value); 1087 | } else { 1088 | selectedItemEl = $('
', { 1089 | 'class': 'ms-sel-item ' + cfg.selectionCls + validCls, 1090 | 'title': titleText, 1091 | html: selectedItemHtml 1092 | }).data('json', value); 1093 | 1094 | if (cfg.disabled === false) { 1095 | // small cross img 1096 | delItemEl = $('', { 1097 | 'class': 'ms-close-btn' 1098 | }).data('json', value).prependTo(selectedItemEl); 1099 | 1100 | delItemEl.on('click', handlers._onTagTriggerClick.bind(ref)); 1101 | } 1102 | } 1103 | 1104 | items.push(selectedItemEl); 1105 | }); 1106 | ms.selectionContainer.prepend(items); 1107 | 1108 | // store the values, behaviour of multiple select 1109 | ms._valueContainer = $('
', { 1110 | style: 'display: none;' 1111 | }); 1112 | 1113 | $.each(ms.getValue(), function (i, val) { 1114 | var el = $('', { 1115 | type: 'hidden', 1116 | name: cfg.name, 1117 | value: val 1118 | }); 1119 | el.appendTo(ms._valueContainer); 1120 | }); 1121 | ms._valueContainer.appendTo(ms.selectionContainer); 1122 | 1123 | if (cfg.selectionPosition === 'inner' && !cfg.selectionContainer) { 1124 | ms.input.width(0); 1125 | inputOffset = ms.input.offset().left - ms.selectionContainer.offset().left; 1126 | w = ms.container.width() - inputOffset - 42; 1127 | if (w < 0) { 1128 | w = ms.container.width(); 1129 | } 1130 | ms.input.width(w); 1131 | } 1132 | 1133 | if (_selection.length === cfg.maxSelection) { 1134 | self._updateHelper(cfg.maxSelectionRenderer.call(this, _selection.length)); 1135 | } else { 1136 | ms.helper.hide(); 1137 | } 1138 | }, 1139 | 1140 | /** 1141 | * Select an item either through keyboard or mouse 1142 | * @param item 1143 | * @private 1144 | */ 1145 | _selectItem: function (item) { 1146 | if (cfg.maxSelection === 1) { 1147 | _selection = []; 1148 | } 1149 | ms.addToSelection(item.data('json')); 1150 | item.removeClass('ms-res-item-active'); 1151 | if (cfg.expandOnFocus === false || _selection.length === cfg.maxSelection) { 1152 | ms.collapse(); 1153 | } 1154 | if (!_hasFocus) { 1155 | ms.input.trigger('focus'); 1156 | } else if (_hasFocus && (cfg.expandOnFocus || _ctrlDown)) { 1157 | self._processSuggestions(); 1158 | if (_ctrlDown) { 1159 | ms.expand(); 1160 | } 1161 | } 1162 | }, 1163 | 1164 | /** 1165 | * Sorts the results and cut them down to max # of displayed results at once 1166 | * @private 1167 | */ 1168 | _sortAndTrim: function (data) { 1169 | var q = ms.getRawValue(), 1170 | filtered = [], 1171 | newSuggestions = [], 1172 | selectedValues = ms.getValue(); 1173 | // filter the data according to given input 1174 | if (q.length > 0) { 1175 | $.each(data, function (index, obj) { 1176 | var name = obj[cfg.displayField]; 1177 | if ((cfg.matchCase === true && name.indexOf(q) > -1) || 1178 | (cfg.matchCase === false && name.toLowerCase().indexOf(q.toLowerCase()) > -1)) { 1179 | if (cfg.strictSuggest === false || name.toLowerCase().indexOf(q.toLowerCase()) === 0) { 1180 | filtered.push(obj); 1181 | } 1182 | } 1183 | }); 1184 | } else { 1185 | filtered = data; 1186 | } 1187 | // take out the ones that have already been selected 1188 | $.each(filtered, function (index, obj) { 1189 | if (cfg.allowDuplicates || $.inArray(obj[cfg.valueField], selectedValues) === -1) { 1190 | newSuggestions.push(obj); 1191 | } 1192 | }); 1193 | // sort the data 1194 | if (cfg.sortOrder !== null) { 1195 | newSuggestions.sort(function (a, b) { 1196 | if (a[cfg.sortOrder] < b[cfg.sortOrder]) { 1197 | return cfg.sortDir === 'asc' ? -1 : 1; 1198 | } 1199 | if (a[cfg.sortOrder] > b[cfg.sortOrder]) { 1200 | return cfg.sortDir === 'asc' ? 1 : -1; 1201 | } 1202 | return 0; 1203 | }); 1204 | } 1205 | // trim it down 1206 | if (cfg.maxSuggestions && cfg.maxSuggestions > 0) { 1207 | newSuggestions = newSuggestions.slice(0, cfg.maxSuggestions); 1208 | } 1209 | return newSuggestions; 1210 | 1211 | }, 1212 | 1213 | _group: function (data) { 1214 | // build groups 1215 | if (cfg.groupBy !== null) { 1216 | _groups = {}; 1217 | 1218 | $.each(data, function (index, value) { 1219 | var props = cfg.groupBy.indexOf('.') > -1 ? cfg.groupBy.split('.') : cfg.groupBy; 1220 | var prop = value[cfg.groupBy]; 1221 | if (typeof (props) != 'string') { 1222 | prop = value; 1223 | while (props.length > 0) { 1224 | prop = prop[props.shift()]; 1225 | } 1226 | } 1227 | if (_groups[prop] === undefined) { 1228 | _groups[prop] = {title: prop, items: [value]}; 1229 | } else { 1230 | _groups[prop].items.push(value); 1231 | } 1232 | }); 1233 | } 1234 | return data; 1235 | }, 1236 | 1237 | /** 1238 | * Update the helper text 1239 | * @private 1240 | */ 1241 | _updateHelper: function (html) { 1242 | ms.helper.html(html); 1243 | if (!ms.helper.is(":visible")) { 1244 | ms.helper.fadeIn(); 1245 | } 1246 | }, 1247 | 1248 | /** 1249 | * Validate an item against vtype or vregex 1250 | * @private 1251 | */ 1252 | _validateSingleItem: function (value) { 1253 | if (cfg.vregex !== null && cfg.vregex instanceof RegExp) { 1254 | return cfg.vregex.test(value); 1255 | } else if (cfg.vtype !== null) { 1256 | switch (cfg.vtype) { 1257 | case 'alpha': 1258 | return (/^[a-zA-Z_]+$/).test(value); 1259 | case 'alphanum': 1260 | return (/^[a-zA-Z0-9_]+$/).test(value); 1261 | case 'email': 1262 | return (/^(\w+)([\-+.][\w]+)*@(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/).test(value); 1263 | case 'url': 1264 | return (/(((^https?)|(^ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i).test(value); 1265 | case 'ipaddress': 1266 | return (/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/).test(value); 1267 | } 1268 | } 1269 | return true; 1270 | } 1271 | }; 1272 | 1273 | var handlers = { 1274 | /** 1275 | * Triggered when blurring out of the component 1276 | * @private 1277 | */ 1278 | _onBlur: function () { 1279 | ms.container.removeClass('ms-ctn-focus'); 1280 | ms.collapse(); 1281 | _hasFocus = false; 1282 | if (ms.getRawValue() !== '' && cfg.allowFreeEntries === true) { 1283 | var obj = {}; 1284 | obj[cfg.displayField] = obj[cfg.valueField] = ms.getRawValue().trim(); 1285 | ms.addToSelection(obj); 1286 | } 1287 | self._renderSelection(); 1288 | 1289 | if (ms.isValid() === false) { 1290 | ms.container.addClass(cfg.invalidCls); 1291 | } else if (ms.input.val() !== '' && cfg.allowFreeEntries === false) { 1292 | ms.empty(); 1293 | self._updateHelper(''); 1294 | } 1295 | $(ms).trigger('blur', [ms]); 1296 | }, 1297 | 1298 | /** 1299 | * Triggered when hovering an element in the combo 1300 | * @param e 1301 | * @private 1302 | */ 1303 | _onComboItemMouseOver: function (e) { 1304 | var target = $(e.currentTarget); 1305 | if (!target.hasClass('ms-res-item-disabled')) { 1306 | ms.combobox.children().removeClass('ms-res-item-active'); 1307 | target.addClass('ms-res-item-active'); 1308 | } 1309 | }, 1310 | 1311 | /** 1312 | * Triggered when an item is chosen from the list 1313 | * @param e 1314 | * @private 1315 | */ 1316 | _onComboItemSelected: function (e) { 1317 | var target = $(e.currentTarget); 1318 | if (!target.hasClass('ms-res-item-disabled')) { 1319 | self._selectItem($(e.currentTarget)); 1320 | } 1321 | }, 1322 | 1323 | /** 1324 | * Triggered when focusing on the container div. Will focus on the input field instead. 1325 | * @private 1326 | */ 1327 | _onFocus: function () { 1328 | ms.input.trigger('focus'); 1329 | }, 1330 | 1331 | /** 1332 | * Triggered when clicking on the input text field 1333 | * @private 1334 | */ 1335 | _onInputClick: function () { 1336 | if (ms.isDisabled() === false && _hasFocus) { 1337 | if (cfg.toggleOnClick === true) { 1338 | if (cfg.expanded) { 1339 | ms.collapse(); 1340 | } else { 1341 | ms.expand(); 1342 | } 1343 | } 1344 | } 1345 | }, 1346 | 1347 | /** 1348 | * Triggered when focusing on the input text field. 1349 | * @private 1350 | */ 1351 | _onInputFocus: function () { 1352 | if (ms.isDisabled() === false && !_hasFocus) { 1353 | _hasFocus = true; 1354 | ms.container.addClass('ms-ctn-focus'); 1355 | ms.container.removeClass(cfg.invalidCls); 1356 | 1357 | var curLength = ms.getRawValue().length; 1358 | if (cfg.expandOnFocus === true) { 1359 | ms.expand(); 1360 | } 1361 | 1362 | if (_selection.length === cfg.maxSelection) { 1363 | self._updateHelper(cfg.maxSelectionRenderer.call(this, _selection.length)); 1364 | } else if (curLength < cfg.minChars) { 1365 | self._updateHelper(cfg.minCharsRenderer.call(this, cfg.minChars - curLength)); 1366 | } 1367 | 1368 | self._renderSelection(); 1369 | $(ms).trigger('focus', [ms]); 1370 | } 1371 | }, 1372 | 1373 | /** 1374 | * Triggered when the user presses a key while the component has focus 1375 | * This is where we want to handle all keys that don't require the user input field 1376 | * since it hasn't registered the key hit yet 1377 | * @param e keyEvent 1378 | * @private 1379 | */ 1380 | _onKeyDown: function (e) { 1381 | // check how tab should be handled 1382 | var active = ms.combobox.find('.ms-res-item-active:not(.ms-res-item-disabled):first'), 1383 | freeInput = ms.input.val(); 1384 | $(ms).trigger('keydown', [ms, e]); 1385 | 1386 | if (e.keyCode === KEYCODES.TAB && (cfg.useTabKey === false || 1387 | (cfg.useTabKey === true && active.length === 0 && ms.input.val().length === 0))) { 1388 | handlers._onBlur(); 1389 | return; 1390 | } 1391 | switch (e.keyCode) { 1392 | case KEYCODES.BACKSPACE: 1393 | if (freeInput.length === 0 && ms.getSelection().length > 0 && cfg.selectionPosition === 'inner') { 1394 | _selection.pop(); 1395 | self._renderSelection(); 1396 | $(ms).trigger('selectionchange', [ms, ms.getSelection()]); 1397 | ms.input.attr('placeholder', (cfg.selectionPosition === 'inner' && ms.getValue().length > 0) ? '' : cfg.placeholder); 1398 | ms.input.trigger('focus'); 1399 | e.preventDefault(); 1400 | } 1401 | break; 1402 | case KEYCODES.TAB: 1403 | case KEYCODES.ESC: 1404 | e.preventDefault(); 1405 | break; 1406 | case KEYCODES.ENTER: 1407 | if (freeInput !== '' || cfg.expanded) { 1408 | e.preventDefault(); 1409 | } 1410 | break; 1411 | case KEYCODES.COMMA: 1412 | if (cfg.useCommaKey === true) { 1413 | e.preventDefault(); 1414 | } 1415 | break; 1416 | case KEYCODES.CTRL: 1417 | _ctrlDown = true; 1418 | break; 1419 | case KEYCODES.DOWNARROW: 1420 | e.preventDefault(); 1421 | self._moveSelectedRow("down"); 1422 | break; 1423 | case KEYCODES.UPARROW: 1424 | e.preventDefault(); 1425 | self._moveSelectedRow("up"); 1426 | break; 1427 | default: 1428 | if (_selection.length === cfg.maxSelection) { 1429 | e.preventDefault(); 1430 | } 1431 | break; 1432 | } 1433 | }, 1434 | 1435 | /** 1436 | * Triggered when a key is released while the component has focus 1437 | * @param e 1438 | * @private 1439 | */ 1440 | _onKeyUp: function (e) { 1441 | var freeInput = ms.getRawValue(), 1442 | inputValid = ms.input.val().trim().length > 0 && 1443 | (!cfg.maxEntryLength || ms.input.val().trim().length <= cfg.maxEntryLength), 1444 | selected, 1445 | obj = {}; 1446 | 1447 | $(ms).trigger('keyup', [ms, e]); 1448 | 1449 | if (e.keyCode !== KEYCODES.SHIFT && e.keyCode !== KEYCODES.CTRL) { 1450 | clearTimeout(_timer); 1451 | } 1452 | 1453 | // collapse if escape, but keep focus. 1454 | if (e.keyCode === KEYCODES.ESC && cfg.expanded) { 1455 | ms.combobox.hide(); 1456 | } 1457 | // ignore a bunch of keys 1458 | if ((e.keyCode === KEYCODES.TAB && cfg.useTabKey === false) || (e.keyCode > KEYCODES.ENTER && e.keyCode < KEYCODES.SPACE)) { 1459 | if (e.keyCode === KEYCODES.CTRL) { 1460 | _ctrlDown = false; 1461 | } 1462 | return; 1463 | } 1464 | switch (e.keyCode) { 1465 | case KEYCODES.UPARROW: 1466 | case KEYCODES.DOWNARROW: 1467 | e.preventDefault(); 1468 | break; 1469 | case KEYCODES.ENTER: 1470 | case KEYCODES.TAB: 1471 | case KEYCODES.COMMA: 1472 | if (e.keyCode !== KEYCODES.COMMA || cfg.useCommaKey === true) { 1473 | e.preventDefault(); 1474 | if (cfg.expanded === true) { // if a selection is performed, select it and reset field 1475 | selected = ms.combobox.find('.ms-res-item-active:not(.ms-res-item-disabled):first'); 1476 | if (selected.length > 0) { 1477 | self._selectItem(selected); 1478 | return; 1479 | } 1480 | } 1481 | // if no selection or if freetext entered and free entries allowed, add new obj to selection 1482 | if (inputValid === true && cfg.allowFreeEntries === true) { 1483 | obj[cfg.displayField] = obj[cfg.valueField] = freeInput.trim(); 1484 | ms.addToSelection(obj); 1485 | ms.collapse(); // reset combo suggestions 1486 | ms.input.trigger('focus'); 1487 | } 1488 | break; 1489 | } 1490 | default: 1491 | if (_selection.length === cfg.maxSelection) { 1492 | self._updateHelper(cfg.maxSelectionRenderer.call(this, _selection.length)); 1493 | } else { 1494 | if (freeInput.length < cfg.minChars) { 1495 | self._updateHelper(cfg.minCharsRenderer.call(this, cfg.minChars - freeInput.length)); 1496 | if (cfg.expanded === true) { 1497 | ms.collapse(); 1498 | } 1499 | } else if (cfg.maxEntryLength && freeInput.length > cfg.maxEntryLength) { 1500 | self._updateHelper(cfg.maxEntryRenderer.call(this, freeInput.length - cfg.maxEntryLength)); 1501 | if (cfg.expanded === true) { 1502 | ms.collapse(); 1503 | } 1504 | } else { 1505 | ms.helper.hide(); 1506 | if (cfg.minChars <= freeInput.length) { 1507 | _timer = setTimeout(function () { 1508 | if (cfg.expanded === true) { 1509 | self._processSuggestions(); 1510 | } else { 1511 | ms.expand(); 1512 | } 1513 | }, cfg.typeDelay); 1514 | } 1515 | } 1516 | } 1517 | break; 1518 | } 1519 | }, 1520 | 1521 | /** 1522 | * Triggered when clicking upon cross for deletion 1523 | * @param e 1524 | * @private 1525 | */ 1526 | _onTagTriggerClick: function (e) { 1527 | ms.removeFromSelection($(e.currentTarget).data('json')); 1528 | }, 1529 | 1530 | /** 1531 | * Triggered when clicking on the small trigger in the right 1532 | * @private 1533 | */ 1534 | _onTriggerClick: function () { 1535 | if (ms.isDisabled() === false && !(cfg.expandOnFocus === true && _selection.length === cfg.maxSelection)) { 1536 | $(ms).trigger('triggerclick', [ms]); 1537 | if (cfg.expanded === true) { 1538 | ms.collapse(); 1539 | } else { 1540 | var curLength = ms.getRawValue().length; 1541 | if (curLength >= cfg.minChars) { 1542 | ms.input.trigger('focus'); 1543 | ms.expand(); 1544 | } else { 1545 | self._updateHelper(cfg.minCharsRenderer.call(this, cfg.minChars - curLength)); 1546 | } 1547 | } 1548 | } 1549 | }, 1550 | 1551 | /** 1552 | * Triggered when the browser window is resized 1553 | * @private 1554 | */ 1555 | _onWindowResized: function () { 1556 | self._renderSelection(); 1557 | } 1558 | }; 1559 | 1560 | // startup point 1561 | if (element !== null) { 1562 | self._render(element); 1563 | } 1564 | }; 1565 | 1566 | $.fn.magicSuggest = function (options) { 1567 | var obj = $(this); 1568 | 1569 | if (obj.length === 1 && obj.data('magicSuggest')) { 1570 | return obj.data('magicSuggest'); 1571 | } 1572 | 1573 | obj.each(function (i) { 1574 | // assume $(this) is an element 1575 | var cntr = $(this); 1576 | 1577 | // Return early if this element already has a plugin instance 1578 | if (cntr.data('magicSuggest')) { 1579 | return; 1580 | } 1581 | 1582 | if (this.nodeName.toLowerCase() === 'select') { // rendering from select 1583 | options.data = []; 1584 | options.value = []; 1585 | $.each(this.children, function (index, child) { 1586 | if (child.nodeName && child.nodeName.toLowerCase() === 'option') { 1587 | options.data.push({ id: child.value, name: child.text }); 1588 | if ($(child).attr('selected')) { 1589 | options.value.push(child.value); 1590 | } 1591 | } 1592 | }); 1593 | } 1594 | 1595 | var def = {}; 1596 | // set values from DOM container element 1597 | $.each(this.attributes, function (i, att) { 1598 | def[att.name] = att.name === 'value' && att.value !== '' ? JSON.parse(att.value) : att.value; 1599 | }); 1600 | 1601 | var field = new MagicSuggest(this, $.extend([], $.fn.magicSuggest.defaults, options, def)); 1602 | cntr.data('magicSuggest', field); 1603 | field.container.data('magicSuggest', field); 1604 | }); 1605 | 1606 | if (obj.length === 1) { 1607 | return obj.data('magicSuggest'); 1608 | } 1609 | return obj; 1610 | }; 1611 | 1612 | $.fn.magicSuggest.defaults = {}; 1613 | })(jQuery); 1614 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "magicsuggest", 3 | "version": "2.1.7", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "magicsuggest", 9 | "version": "2.1.7", 10 | "license": "MIT", 11 | "dependencies": { 12 | "bootstrap": "~3", 13 | "jquery": ">= 1.8.3" 14 | }, 15 | "devDependencies": { 16 | "cross-var": "^1.1.0", 17 | "replace-in-file": "^7.0.1", 18 | "uglify-js": "^3.17.4" 19 | } 20 | }, 21 | "node_modules/ansi-regex": { 22 | "version": "2.1.1", 23 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 24 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", 25 | "dev": true, 26 | "engines": { 27 | "node": ">=0.10.0" 28 | } 29 | }, 30 | "node_modules/ansi-styles": { 31 | "version": "2.2.1", 32 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 33 | "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", 34 | "dev": true, 35 | "engines": { 36 | "node": ">=0.10.0" 37 | } 38 | }, 39 | "node_modules/babel-code-frame": { 40 | "version": "6.26.0", 41 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 42 | "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", 43 | "dev": true, 44 | "dependencies": { 45 | "chalk": "^1.1.3", 46 | "esutils": "^2.0.2", 47 | "js-tokens": "^3.0.2" 48 | } 49 | }, 50 | "node_modules/babel-core": { 51 | "version": "6.26.3", 52 | "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", 53 | "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", 54 | "dev": true, 55 | "dependencies": { 56 | "babel-code-frame": "^6.26.0", 57 | "babel-generator": "^6.26.0", 58 | "babel-helpers": "^6.24.1", 59 | "babel-messages": "^6.23.0", 60 | "babel-register": "^6.26.0", 61 | "babel-runtime": "^6.26.0", 62 | "babel-template": "^6.26.0", 63 | "babel-traverse": "^6.26.0", 64 | "babel-types": "^6.26.0", 65 | "babylon": "^6.18.0", 66 | "convert-source-map": "^1.5.1", 67 | "debug": "^2.6.9", 68 | "json5": "^0.5.1", 69 | "lodash": "^4.17.4", 70 | "minimatch": "^3.0.4", 71 | "path-is-absolute": "^1.0.1", 72 | "private": "^0.1.8", 73 | "slash": "^1.0.0", 74 | "source-map": "^0.5.7" 75 | } 76 | }, 77 | "node_modules/babel-generator": { 78 | "version": "6.26.1", 79 | "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", 80 | "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", 81 | "dev": true, 82 | "dependencies": { 83 | "babel-messages": "^6.23.0", 84 | "babel-runtime": "^6.26.0", 85 | "babel-types": "^6.26.0", 86 | "detect-indent": "^4.0.0", 87 | "jsesc": "^1.3.0", 88 | "lodash": "^4.17.4", 89 | "source-map": "^0.5.7", 90 | "trim-right": "^1.0.1" 91 | } 92 | }, 93 | "node_modules/babel-helper-bindify-decorators": { 94 | "version": "6.24.1", 95 | "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", 96 | "integrity": "sha512-TYX2QQATKA6Wssp6j7jqlw4QLmABDN1olRdEHndYvBXdaXM5dcx6j5rN0+nd+aVL+Th40fAEYvvw/Xxd/LETuQ==", 97 | "dev": true, 98 | "dependencies": { 99 | "babel-runtime": "^6.22.0", 100 | "babel-traverse": "^6.24.1", 101 | "babel-types": "^6.24.1" 102 | } 103 | }, 104 | "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { 105 | "version": "6.24.1", 106 | "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", 107 | "integrity": "sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==", 108 | "dev": true, 109 | "dependencies": { 110 | "babel-helper-explode-assignable-expression": "^6.24.1", 111 | "babel-runtime": "^6.22.0", 112 | "babel-types": "^6.24.1" 113 | } 114 | }, 115 | "node_modules/babel-helper-call-delegate": { 116 | "version": "6.24.1", 117 | "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", 118 | "integrity": "sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ==", 119 | "dev": true, 120 | "dependencies": { 121 | "babel-helper-hoist-variables": "^6.24.1", 122 | "babel-runtime": "^6.22.0", 123 | "babel-traverse": "^6.24.1", 124 | "babel-types": "^6.24.1" 125 | } 126 | }, 127 | "node_modules/babel-helper-define-map": { 128 | "version": "6.26.0", 129 | "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", 130 | "integrity": "sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA==", 131 | "dev": true, 132 | "dependencies": { 133 | "babel-helper-function-name": "^6.24.1", 134 | "babel-runtime": "^6.26.0", 135 | "babel-types": "^6.26.0", 136 | "lodash": "^4.17.4" 137 | } 138 | }, 139 | "node_modules/babel-helper-explode-assignable-expression": { 140 | "version": "6.24.1", 141 | "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", 142 | "integrity": "sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==", 143 | "dev": true, 144 | "dependencies": { 145 | "babel-runtime": "^6.22.0", 146 | "babel-traverse": "^6.24.1", 147 | "babel-types": "^6.24.1" 148 | } 149 | }, 150 | "node_modules/babel-helper-explode-class": { 151 | "version": "6.24.1", 152 | "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", 153 | "integrity": "sha512-SFbWewr0/0U4AiRzsHqwsbOQeLXVa9T1ELdqEa2efcQB5KopTnunAqoj07TuHlN2lfTQNPGO/rJR4FMln5fVcA==", 154 | "dev": true, 155 | "dependencies": { 156 | "babel-helper-bindify-decorators": "^6.24.1", 157 | "babel-runtime": "^6.22.0", 158 | "babel-traverse": "^6.24.1", 159 | "babel-types": "^6.24.1" 160 | } 161 | }, 162 | "node_modules/babel-helper-function-name": { 163 | "version": "6.24.1", 164 | "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", 165 | "integrity": "sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==", 166 | "dev": true, 167 | "dependencies": { 168 | "babel-helper-get-function-arity": "^6.24.1", 169 | "babel-runtime": "^6.22.0", 170 | "babel-template": "^6.24.1", 171 | "babel-traverse": "^6.24.1", 172 | "babel-types": "^6.24.1" 173 | } 174 | }, 175 | "node_modules/babel-helper-get-function-arity": { 176 | "version": "6.24.1", 177 | "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", 178 | "integrity": "sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==", 179 | "dev": true, 180 | "dependencies": { 181 | "babel-runtime": "^6.22.0", 182 | "babel-types": "^6.24.1" 183 | } 184 | }, 185 | "node_modules/babel-helper-hoist-variables": { 186 | "version": "6.24.1", 187 | "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", 188 | "integrity": "sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw==", 189 | "dev": true, 190 | "dependencies": { 191 | "babel-runtime": "^6.22.0", 192 | "babel-types": "^6.24.1" 193 | } 194 | }, 195 | "node_modules/babel-helper-optimise-call-expression": { 196 | "version": "6.24.1", 197 | "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", 198 | "integrity": "sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA==", 199 | "dev": true, 200 | "dependencies": { 201 | "babel-runtime": "^6.22.0", 202 | "babel-types": "^6.24.1" 203 | } 204 | }, 205 | "node_modules/babel-helper-regex": { 206 | "version": "6.26.0", 207 | "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", 208 | "integrity": "sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg==", 209 | "dev": true, 210 | "dependencies": { 211 | "babel-runtime": "^6.26.0", 212 | "babel-types": "^6.26.0", 213 | "lodash": "^4.17.4" 214 | } 215 | }, 216 | "node_modules/babel-helper-remap-async-to-generator": { 217 | "version": "6.24.1", 218 | "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", 219 | "integrity": "sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg==", 220 | "dev": true, 221 | "dependencies": { 222 | "babel-helper-function-name": "^6.24.1", 223 | "babel-runtime": "^6.22.0", 224 | "babel-template": "^6.24.1", 225 | "babel-traverse": "^6.24.1", 226 | "babel-types": "^6.24.1" 227 | } 228 | }, 229 | "node_modules/babel-helper-replace-supers": { 230 | "version": "6.24.1", 231 | "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", 232 | "integrity": "sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw==", 233 | "dev": true, 234 | "dependencies": { 235 | "babel-helper-optimise-call-expression": "^6.24.1", 236 | "babel-messages": "^6.23.0", 237 | "babel-runtime": "^6.22.0", 238 | "babel-template": "^6.24.1", 239 | "babel-traverse": "^6.24.1", 240 | "babel-types": "^6.24.1" 241 | } 242 | }, 243 | "node_modules/babel-helpers": { 244 | "version": "6.24.1", 245 | "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", 246 | "integrity": "sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==", 247 | "dev": true, 248 | "dependencies": { 249 | "babel-runtime": "^6.22.0", 250 | "babel-template": "^6.24.1" 251 | } 252 | }, 253 | "node_modules/babel-messages": { 254 | "version": "6.23.0", 255 | "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", 256 | "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", 257 | "dev": true, 258 | "dependencies": { 259 | "babel-runtime": "^6.22.0" 260 | } 261 | }, 262 | "node_modules/babel-plugin-check-es2015-constants": { 263 | "version": "6.22.0", 264 | "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", 265 | "integrity": "sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA==", 266 | "dev": true, 267 | "dependencies": { 268 | "babel-runtime": "^6.22.0" 269 | } 270 | }, 271 | "node_modules/babel-plugin-syntax-async-functions": { 272 | "version": "6.13.0", 273 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", 274 | "integrity": "sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw==", 275 | "dev": true 276 | }, 277 | "node_modules/babel-plugin-syntax-async-generators": { 278 | "version": "6.13.0", 279 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", 280 | "integrity": "sha512-EbciFN5Jb9iqU9bqaLmmFLx2G8pAUsvpWJ6OzOWBNrSY9qTohXj+7YfZx6Ug1Qqh7tCb1EA7Jvn9bMC1HBiucg==", 281 | "dev": true 282 | }, 283 | "node_modules/babel-plugin-syntax-class-constructor-call": { 284 | "version": "6.18.0", 285 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", 286 | "integrity": "sha512-EEuBcXz/wZ81Jaac0LnMHtD4Mfz9XWn2oH2Xj+CHwz2SZWUqqdtR2BgWPSdTGMmxN/5KLSh4PImt9+9ZedDarA==", 287 | "dev": true 288 | }, 289 | "node_modules/babel-plugin-syntax-class-properties": { 290 | "version": "6.13.0", 291 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", 292 | "integrity": "sha512-chI3Rt9T1AbrQD1s+vxw3KcwC9yHtF621/MacuItITfZX344uhQoANjpoSJZleAmW2tjlolqB/f+h7jIqXa7pA==", 293 | "dev": true 294 | }, 295 | "node_modules/babel-plugin-syntax-decorators": { 296 | "version": "6.13.0", 297 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", 298 | "integrity": "sha512-AWj19x2aDm8qFQ5O2JcD6pwJDW1YdcnO+1b81t7gxrGjz5VHiUqeYWAR4h7zueWMalRelrQDXprv2FrY1dbpbw==", 299 | "dev": true 300 | }, 301 | "node_modules/babel-plugin-syntax-do-expressions": { 302 | "version": "6.13.0", 303 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", 304 | "integrity": "sha512-HD/5qJB9oSXzl0caxM+aRD7ENICXqcc3Up/8toDQk7zNIDE7TzsqtxC5f4t9Rwhu2Ya8l9l4j6b3vOsy+a6qxg==", 305 | "dev": true 306 | }, 307 | "node_modules/babel-plugin-syntax-dynamic-import": { 308 | "version": "6.18.0", 309 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", 310 | "integrity": "sha512-MioUE+LfjCEz65Wf7Z/Rm4XCP5k2c+TbMd2Z2JKc7U9uwjBhAfNPE48KC4GTGKhppMeYVepwDBNO/nGY6NYHBA==", 311 | "dev": true 312 | }, 313 | "node_modules/babel-plugin-syntax-exponentiation-operator": { 314 | "version": "6.13.0", 315 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", 316 | "integrity": "sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==", 317 | "dev": true 318 | }, 319 | "node_modules/babel-plugin-syntax-export-extensions": { 320 | "version": "6.13.0", 321 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", 322 | "integrity": "sha512-Eo0rcRaIDMld/W6mVhePiudIuLW+Cr/8eveW3mBREfZORScZgx4rh6BAPyvzdEc/JZvQ+LkC80t0VGFs6FX+lg==", 323 | "dev": true 324 | }, 325 | "node_modules/babel-plugin-syntax-function-bind": { 326 | "version": "6.13.0", 327 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", 328 | "integrity": "sha512-m8yMoh9LIiNyeLdQs5I9G+3YXo4nqVsKQkk7YplrG4qAFbNi9hkZlow8HDHxhH9QOVFPHmy8+03NzRCdyChIKw==", 329 | "dev": true 330 | }, 331 | "node_modules/babel-plugin-syntax-object-rest-spread": { 332 | "version": "6.13.0", 333 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", 334 | "integrity": "sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==", 335 | "dev": true 336 | }, 337 | "node_modules/babel-plugin-syntax-trailing-function-commas": { 338 | "version": "6.22.0", 339 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", 340 | "integrity": "sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ==", 341 | "dev": true 342 | }, 343 | "node_modules/babel-plugin-transform-async-generator-functions": { 344 | "version": "6.24.1", 345 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", 346 | "integrity": "sha512-uT7eovUxtXe8Q2ufcjRuJIOL0hg6VAUJhiWJBLxH/evYAw+aqoJLcYTR8hqx13iOx/FfbCMHgBmXWZjukbkyPg==", 347 | "dev": true, 348 | "dependencies": { 349 | "babel-helper-remap-async-to-generator": "^6.24.1", 350 | "babel-plugin-syntax-async-generators": "^6.5.0", 351 | "babel-runtime": "^6.22.0" 352 | } 353 | }, 354 | "node_modules/babel-plugin-transform-async-to-generator": { 355 | "version": "6.24.1", 356 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", 357 | "integrity": "sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw==", 358 | "dev": true, 359 | "dependencies": { 360 | "babel-helper-remap-async-to-generator": "^6.24.1", 361 | "babel-plugin-syntax-async-functions": "^6.8.0", 362 | "babel-runtime": "^6.22.0" 363 | } 364 | }, 365 | "node_modules/babel-plugin-transform-class-constructor-call": { 366 | "version": "6.24.1", 367 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", 368 | "integrity": "sha512-RvYukT1Nh7njz8P8326ztpQUGCKwmjgu6aRIx1lkvylWITYcskg29vy1Kp8WXIq7FvhXsz0Crf2kS94bjB690A==", 369 | "dev": true, 370 | "dependencies": { 371 | "babel-plugin-syntax-class-constructor-call": "^6.18.0", 372 | "babel-runtime": "^6.22.0", 373 | "babel-template": "^6.24.1" 374 | } 375 | }, 376 | "node_modules/babel-plugin-transform-class-properties": { 377 | "version": "6.24.1", 378 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", 379 | "integrity": "sha512-n4jtBA3OYBdvG5PRMKsMXJXHfLYw/ZOmtxCLOOwz6Ro5XlrColkStLnz1AS1L2yfPA9BKJ1ZNlmVCLjAL9DSIg==", 380 | "dev": true, 381 | "dependencies": { 382 | "babel-helper-function-name": "^6.24.1", 383 | "babel-plugin-syntax-class-properties": "^6.8.0", 384 | "babel-runtime": "^6.22.0", 385 | "babel-template": "^6.24.1" 386 | } 387 | }, 388 | "node_modules/babel-plugin-transform-decorators": { 389 | "version": "6.24.1", 390 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", 391 | "integrity": "sha512-skQ2CImwDkCHu0mkWvCOlBCpBIHW4/49IZWVwV4A/EnWjL9bB6UBvLyMNe3Td5XDStSZNhe69j4bfEW8dvUbew==", 392 | "dev": true, 393 | "dependencies": { 394 | "babel-helper-explode-class": "^6.24.1", 395 | "babel-plugin-syntax-decorators": "^6.13.0", 396 | "babel-runtime": "^6.22.0", 397 | "babel-template": "^6.24.1", 398 | "babel-types": "^6.24.1" 399 | } 400 | }, 401 | "node_modules/babel-plugin-transform-do-expressions": { 402 | "version": "6.22.0", 403 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", 404 | "integrity": "sha512-yQwYqYg+Tnj1InA8W1rsItsZVhkv1Euc4KVua9ledtPz5PDWYz7LVyy6rDBpVYUWFZj5k6GUm3YZpCbIm8Tqew==", 405 | "dev": true, 406 | "dependencies": { 407 | "babel-plugin-syntax-do-expressions": "^6.8.0", 408 | "babel-runtime": "^6.22.0" 409 | } 410 | }, 411 | "node_modules/babel-plugin-transform-es2015-arrow-functions": { 412 | "version": "6.22.0", 413 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", 414 | "integrity": "sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg==", 415 | "dev": true, 416 | "dependencies": { 417 | "babel-runtime": "^6.22.0" 418 | } 419 | }, 420 | "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { 421 | "version": "6.22.0", 422 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", 423 | "integrity": "sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A==", 424 | "dev": true, 425 | "dependencies": { 426 | "babel-runtime": "^6.22.0" 427 | } 428 | }, 429 | "node_modules/babel-plugin-transform-es2015-block-scoping": { 430 | "version": "6.26.0", 431 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", 432 | "integrity": "sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw==", 433 | "dev": true, 434 | "dependencies": { 435 | "babel-runtime": "^6.26.0", 436 | "babel-template": "^6.26.0", 437 | "babel-traverse": "^6.26.0", 438 | "babel-types": "^6.26.0", 439 | "lodash": "^4.17.4" 440 | } 441 | }, 442 | "node_modules/babel-plugin-transform-es2015-classes": { 443 | "version": "6.24.1", 444 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", 445 | "integrity": "sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag==", 446 | "dev": true, 447 | "dependencies": { 448 | "babel-helper-define-map": "^6.24.1", 449 | "babel-helper-function-name": "^6.24.1", 450 | "babel-helper-optimise-call-expression": "^6.24.1", 451 | "babel-helper-replace-supers": "^6.24.1", 452 | "babel-messages": "^6.23.0", 453 | "babel-runtime": "^6.22.0", 454 | "babel-template": "^6.24.1", 455 | "babel-traverse": "^6.24.1", 456 | "babel-types": "^6.24.1" 457 | } 458 | }, 459 | "node_modules/babel-plugin-transform-es2015-computed-properties": { 460 | "version": "6.24.1", 461 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", 462 | "integrity": "sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw==", 463 | "dev": true, 464 | "dependencies": { 465 | "babel-runtime": "^6.22.0", 466 | "babel-template": "^6.24.1" 467 | } 468 | }, 469 | "node_modules/babel-plugin-transform-es2015-destructuring": { 470 | "version": "6.23.0", 471 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", 472 | "integrity": "sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA==", 473 | "dev": true, 474 | "dependencies": { 475 | "babel-runtime": "^6.22.0" 476 | } 477 | }, 478 | "node_modules/babel-plugin-transform-es2015-duplicate-keys": { 479 | "version": "6.24.1", 480 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", 481 | "integrity": "sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug==", 482 | "dev": true, 483 | "dependencies": { 484 | "babel-runtime": "^6.22.0", 485 | "babel-types": "^6.24.1" 486 | } 487 | }, 488 | "node_modules/babel-plugin-transform-es2015-for-of": { 489 | "version": "6.23.0", 490 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", 491 | "integrity": "sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw==", 492 | "dev": true, 493 | "dependencies": { 494 | "babel-runtime": "^6.22.0" 495 | } 496 | }, 497 | "node_modules/babel-plugin-transform-es2015-function-name": { 498 | "version": "6.24.1", 499 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", 500 | "integrity": "sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg==", 501 | "dev": true, 502 | "dependencies": { 503 | "babel-helper-function-name": "^6.24.1", 504 | "babel-runtime": "^6.22.0", 505 | "babel-types": "^6.24.1" 506 | } 507 | }, 508 | "node_modules/babel-plugin-transform-es2015-literals": { 509 | "version": "6.22.0", 510 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", 511 | "integrity": "sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ==", 512 | "dev": true, 513 | "dependencies": { 514 | "babel-runtime": "^6.22.0" 515 | } 516 | }, 517 | "node_modules/babel-plugin-transform-es2015-modules-amd": { 518 | "version": "6.24.1", 519 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", 520 | "integrity": "sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA==", 521 | "dev": true, 522 | "dependencies": { 523 | "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", 524 | "babel-runtime": "^6.22.0", 525 | "babel-template": "^6.24.1" 526 | } 527 | }, 528 | "node_modules/babel-plugin-transform-es2015-modules-commonjs": { 529 | "version": "6.26.2", 530 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", 531 | "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", 532 | "dev": true, 533 | "dependencies": { 534 | "babel-plugin-transform-strict-mode": "^6.24.1", 535 | "babel-runtime": "^6.26.0", 536 | "babel-template": "^6.26.0", 537 | "babel-types": "^6.26.0" 538 | } 539 | }, 540 | "node_modules/babel-plugin-transform-es2015-modules-systemjs": { 541 | "version": "6.24.1", 542 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", 543 | "integrity": "sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg==", 544 | "dev": true, 545 | "dependencies": { 546 | "babel-helper-hoist-variables": "^6.24.1", 547 | "babel-runtime": "^6.22.0", 548 | "babel-template": "^6.24.1" 549 | } 550 | }, 551 | "node_modules/babel-plugin-transform-es2015-modules-umd": { 552 | "version": "6.24.1", 553 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", 554 | "integrity": "sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw==", 555 | "dev": true, 556 | "dependencies": { 557 | "babel-plugin-transform-es2015-modules-amd": "^6.24.1", 558 | "babel-runtime": "^6.22.0", 559 | "babel-template": "^6.24.1" 560 | } 561 | }, 562 | "node_modules/babel-plugin-transform-es2015-object-super": { 563 | "version": "6.24.1", 564 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", 565 | "integrity": "sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA==", 566 | "dev": true, 567 | "dependencies": { 568 | "babel-helper-replace-supers": "^6.24.1", 569 | "babel-runtime": "^6.22.0" 570 | } 571 | }, 572 | "node_modules/babel-plugin-transform-es2015-parameters": { 573 | "version": "6.24.1", 574 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", 575 | "integrity": "sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ==", 576 | "dev": true, 577 | "dependencies": { 578 | "babel-helper-call-delegate": "^6.24.1", 579 | "babel-helper-get-function-arity": "^6.24.1", 580 | "babel-runtime": "^6.22.0", 581 | "babel-template": "^6.24.1", 582 | "babel-traverse": "^6.24.1", 583 | "babel-types": "^6.24.1" 584 | } 585 | }, 586 | "node_modules/babel-plugin-transform-es2015-shorthand-properties": { 587 | "version": "6.24.1", 588 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", 589 | "integrity": "sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw==", 590 | "dev": true, 591 | "dependencies": { 592 | "babel-runtime": "^6.22.0", 593 | "babel-types": "^6.24.1" 594 | } 595 | }, 596 | "node_modules/babel-plugin-transform-es2015-spread": { 597 | "version": "6.22.0", 598 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", 599 | "integrity": "sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg==", 600 | "dev": true, 601 | "dependencies": { 602 | "babel-runtime": "^6.22.0" 603 | } 604 | }, 605 | "node_modules/babel-plugin-transform-es2015-sticky-regex": { 606 | "version": "6.24.1", 607 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", 608 | "integrity": "sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ==", 609 | "dev": true, 610 | "dependencies": { 611 | "babel-helper-regex": "^6.24.1", 612 | "babel-runtime": "^6.22.0", 613 | "babel-types": "^6.24.1" 614 | } 615 | }, 616 | "node_modules/babel-plugin-transform-es2015-template-literals": { 617 | "version": "6.22.0", 618 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", 619 | "integrity": "sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg==", 620 | "dev": true, 621 | "dependencies": { 622 | "babel-runtime": "^6.22.0" 623 | } 624 | }, 625 | "node_modules/babel-plugin-transform-es2015-typeof-symbol": { 626 | "version": "6.23.0", 627 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", 628 | "integrity": "sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw==", 629 | "dev": true, 630 | "dependencies": { 631 | "babel-runtime": "^6.22.0" 632 | } 633 | }, 634 | "node_modules/babel-plugin-transform-es2015-unicode-regex": { 635 | "version": "6.24.1", 636 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", 637 | "integrity": "sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ==", 638 | "dev": true, 639 | "dependencies": { 640 | "babel-helper-regex": "^6.24.1", 641 | "babel-runtime": "^6.22.0", 642 | "regexpu-core": "^2.0.0" 643 | } 644 | }, 645 | "node_modules/babel-plugin-transform-exponentiation-operator": { 646 | "version": "6.24.1", 647 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", 648 | "integrity": "sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==", 649 | "dev": true, 650 | "dependencies": { 651 | "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", 652 | "babel-plugin-syntax-exponentiation-operator": "^6.8.0", 653 | "babel-runtime": "^6.22.0" 654 | } 655 | }, 656 | "node_modules/babel-plugin-transform-export-extensions": { 657 | "version": "6.22.0", 658 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", 659 | "integrity": "sha512-mtzELzINaYqdVglyZrDDVwkcFRuE7s6QUFWXxwffKAHB/NkfbJ2NJSytugB43ytIC8UVt30Ereyx+7gNyTkDLg==", 660 | "dev": true, 661 | "dependencies": { 662 | "babel-plugin-syntax-export-extensions": "^6.8.0", 663 | "babel-runtime": "^6.22.0" 664 | } 665 | }, 666 | "node_modules/babel-plugin-transform-function-bind": { 667 | "version": "6.22.0", 668 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", 669 | "integrity": "sha512-9Ec4KYf1GurT39mlUjDSlN7HWSlB3u3mWRMogQbb+Y88lO0ZM3rJ0ADhPnQwWK9TbO6e/4E+Et1rrfGY9mFimA==", 670 | "dev": true, 671 | "dependencies": { 672 | "babel-plugin-syntax-function-bind": "^6.8.0", 673 | "babel-runtime": "^6.22.0" 674 | } 675 | }, 676 | "node_modules/babel-plugin-transform-object-rest-spread": { 677 | "version": "6.26.0", 678 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", 679 | "integrity": "sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA==", 680 | "dev": true, 681 | "dependencies": { 682 | "babel-plugin-syntax-object-rest-spread": "^6.8.0", 683 | "babel-runtime": "^6.26.0" 684 | } 685 | }, 686 | "node_modules/babel-plugin-transform-regenerator": { 687 | "version": "6.26.0", 688 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", 689 | "integrity": "sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg==", 690 | "dev": true, 691 | "dependencies": { 692 | "regenerator-transform": "^0.10.0" 693 | } 694 | }, 695 | "node_modules/babel-plugin-transform-strict-mode": { 696 | "version": "6.24.1", 697 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", 698 | "integrity": "sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==", 699 | "dev": true, 700 | "dependencies": { 701 | "babel-runtime": "^6.22.0", 702 | "babel-types": "^6.24.1" 703 | } 704 | }, 705 | "node_modules/babel-preset-es2015": { 706 | "version": "6.24.1", 707 | "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", 708 | "integrity": "sha512-XfwUqG1Ry6R43m4Wfob+vHbIVBIqTg/TJY4Snku1iIzeH7mUnwHA8Vagmv+ZQbPwhS8HgsdQvy28Py3k5zpoFQ==", 709 | "deprecated": "🙌 Thanks for using Babel: we recommend using babel-preset-env now: please read https://babeljs.io/env to update!", 710 | "dev": true, 711 | "dependencies": { 712 | "babel-plugin-check-es2015-constants": "^6.22.0", 713 | "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", 714 | "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", 715 | "babel-plugin-transform-es2015-block-scoping": "^6.24.1", 716 | "babel-plugin-transform-es2015-classes": "^6.24.1", 717 | "babel-plugin-transform-es2015-computed-properties": "^6.24.1", 718 | "babel-plugin-transform-es2015-destructuring": "^6.22.0", 719 | "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", 720 | "babel-plugin-transform-es2015-for-of": "^6.22.0", 721 | "babel-plugin-transform-es2015-function-name": "^6.24.1", 722 | "babel-plugin-transform-es2015-literals": "^6.22.0", 723 | "babel-plugin-transform-es2015-modules-amd": "^6.24.1", 724 | "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", 725 | "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", 726 | "babel-plugin-transform-es2015-modules-umd": "^6.24.1", 727 | "babel-plugin-transform-es2015-object-super": "^6.24.1", 728 | "babel-plugin-transform-es2015-parameters": "^6.24.1", 729 | "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", 730 | "babel-plugin-transform-es2015-spread": "^6.22.0", 731 | "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", 732 | "babel-plugin-transform-es2015-template-literals": "^6.22.0", 733 | "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", 734 | "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", 735 | "babel-plugin-transform-regenerator": "^6.24.1" 736 | } 737 | }, 738 | "node_modules/babel-preset-stage-0": { 739 | "version": "6.24.1", 740 | "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", 741 | "integrity": "sha512-MJD+xBbpsApbKlzAX0sOBF+VeFaUmv5s8FSOO7SSZpes1QgphCjq/UIGRFWSmQ/0i5bqQjLGCTXGGXqcLQ9JDA==", 742 | "dev": true, 743 | "dependencies": { 744 | "babel-plugin-transform-do-expressions": "^6.22.0", 745 | "babel-plugin-transform-function-bind": "^6.22.0", 746 | "babel-preset-stage-1": "^6.24.1" 747 | } 748 | }, 749 | "node_modules/babel-preset-stage-1": { 750 | "version": "6.24.1", 751 | "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", 752 | "integrity": "sha512-rn+UOcd7BHDniq1SVxv2/AVVSVI1NK+hfS0I/iR6m6KbOi/aeBRcqBilqO73pd9VUpRXF2HFtlDuC9F2BEQqmg==", 753 | "dev": true, 754 | "dependencies": { 755 | "babel-plugin-transform-class-constructor-call": "^6.24.1", 756 | "babel-plugin-transform-export-extensions": "^6.22.0", 757 | "babel-preset-stage-2": "^6.24.1" 758 | } 759 | }, 760 | "node_modules/babel-preset-stage-2": { 761 | "version": "6.24.1", 762 | "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", 763 | "integrity": "sha512-9F+nquz+37PrlTSBdpeQBKnQfAMNBnryXw+m4qBh35FNbJPfzZz+sjN2G5Uf1CRedU9PH7fJkTbYijxmkLX8Og==", 764 | "dev": true, 765 | "dependencies": { 766 | "babel-plugin-syntax-dynamic-import": "^6.18.0", 767 | "babel-plugin-transform-class-properties": "^6.24.1", 768 | "babel-plugin-transform-decorators": "^6.24.1", 769 | "babel-preset-stage-3": "^6.24.1" 770 | } 771 | }, 772 | "node_modules/babel-preset-stage-3": { 773 | "version": "6.24.1", 774 | "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", 775 | "integrity": "sha512-eCbEOF8uN0KypFXJmZXn2sTk7bPV9uM5xov7G/7BM08TbQEObsVs0cEWfy6NQySlfk7JBi/t+XJP1JkruYfthA==", 776 | "dev": true, 777 | "dependencies": { 778 | "babel-plugin-syntax-trailing-function-commas": "^6.22.0", 779 | "babel-plugin-transform-async-generator-functions": "^6.24.1", 780 | "babel-plugin-transform-async-to-generator": "^6.24.1", 781 | "babel-plugin-transform-exponentiation-operator": "^6.24.1", 782 | "babel-plugin-transform-object-rest-spread": "^6.22.0" 783 | } 784 | }, 785 | "node_modules/babel-register": { 786 | "version": "6.26.0", 787 | "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", 788 | "integrity": "sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==", 789 | "dev": true, 790 | "dependencies": { 791 | "babel-core": "^6.26.0", 792 | "babel-runtime": "^6.26.0", 793 | "core-js": "^2.5.0", 794 | "home-or-tmp": "^2.0.0", 795 | "lodash": "^4.17.4", 796 | "mkdirp": "^0.5.1", 797 | "source-map-support": "^0.4.15" 798 | } 799 | }, 800 | "node_modules/babel-runtime": { 801 | "version": "6.26.0", 802 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 803 | "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", 804 | "dev": true, 805 | "dependencies": { 806 | "core-js": "^2.4.0", 807 | "regenerator-runtime": "^0.11.0" 808 | } 809 | }, 810 | "node_modules/babel-template": { 811 | "version": "6.26.0", 812 | "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", 813 | "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", 814 | "dev": true, 815 | "dependencies": { 816 | "babel-runtime": "^6.26.0", 817 | "babel-traverse": "^6.26.0", 818 | "babel-types": "^6.26.0", 819 | "babylon": "^6.18.0", 820 | "lodash": "^4.17.4" 821 | } 822 | }, 823 | "node_modules/babel-traverse": { 824 | "version": "6.26.0", 825 | "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", 826 | "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", 827 | "dev": true, 828 | "dependencies": { 829 | "babel-code-frame": "^6.26.0", 830 | "babel-messages": "^6.23.0", 831 | "babel-runtime": "^6.26.0", 832 | "babel-types": "^6.26.0", 833 | "babylon": "^6.18.0", 834 | "debug": "^2.6.8", 835 | "globals": "^9.18.0", 836 | "invariant": "^2.2.2", 837 | "lodash": "^4.17.4" 838 | } 839 | }, 840 | "node_modules/babel-types": { 841 | "version": "6.26.0", 842 | "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", 843 | "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", 844 | "dev": true, 845 | "dependencies": { 846 | "babel-runtime": "^6.26.0", 847 | "esutils": "^2.0.2", 848 | "lodash": "^4.17.4", 849 | "to-fast-properties": "^1.0.3" 850 | } 851 | }, 852 | "node_modules/babylon": { 853 | "version": "6.18.0", 854 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", 855 | "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", 856 | "dev": true, 857 | "bin": { 858 | "babylon": "bin/babylon.js" 859 | } 860 | }, 861 | "node_modules/balanced-match": { 862 | "version": "1.0.2", 863 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 864 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 865 | "dev": true 866 | }, 867 | "node_modules/bootstrap": { 868 | "version": "3.4.1", 869 | "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", 870 | "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", 871 | "engines": { 872 | "node": ">=6" 873 | } 874 | }, 875 | "node_modules/brace-expansion": { 876 | "version": "1.1.11", 877 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 878 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 879 | "dev": true, 880 | "dependencies": { 881 | "balanced-match": "^1.0.0", 882 | "concat-map": "0.0.1" 883 | } 884 | }, 885 | "node_modules/chalk": { 886 | "version": "1.1.3", 887 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 888 | "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", 889 | "dev": true, 890 | "dependencies": { 891 | "ansi-styles": "^2.2.1", 892 | "escape-string-regexp": "^1.0.2", 893 | "has-ansi": "^2.0.0", 894 | "strip-ansi": "^3.0.0", 895 | "supports-color": "^2.0.0" 896 | }, 897 | "engines": { 898 | "node": ">=0.10.0" 899 | } 900 | }, 901 | "node_modules/cliui": { 902 | "version": "8.0.1", 903 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 904 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 905 | "dev": true, 906 | "dependencies": { 907 | "string-width": "^4.2.0", 908 | "strip-ansi": "^6.0.1", 909 | "wrap-ansi": "^7.0.0" 910 | }, 911 | "engines": { 912 | "node": ">=12" 913 | } 914 | }, 915 | "node_modules/cliui/node_modules/ansi-regex": { 916 | "version": "5.0.1", 917 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 918 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 919 | "dev": true, 920 | "engines": { 921 | "node": ">=8" 922 | } 923 | }, 924 | "node_modules/cliui/node_modules/strip-ansi": { 925 | "version": "6.0.1", 926 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 927 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 928 | "dev": true, 929 | "dependencies": { 930 | "ansi-regex": "^5.0.1" 931 | }, 932 | "engines": { 933 | "node": ">=8" 934 | } 935 | }, 936 | "node_modules/color-convert": { 937 | "version": "2.0.1", 938 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 939 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 940 | "dev": true, 941 | "dependencies": { 942 | "color-name": "~1.1.4" 943 | }, 944 | "engines": { 945 | "node": ">=7.0.0" 946 | } 947 | }, 948 | "node_modules/color-name": { 949 | "version": "1.1.4", 950 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 951 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 952 | "dev": true 953 | }, 954 | "node_modules/concat-map": { 955 | "version": "0.0.1", 956 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 957 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 958 | "dev": true 959 | }, 960 | "node_modules/convert-source-map": { 961 | "version": "1.9.0", 962 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 963 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 964 | "dev": true 965 | }, 966 | "node_modules/core-js": { 967 | "version": "2.6.12", 968 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", 969 | "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", 970 | "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", 971 | "dev": true, 972 | "hasInstallScript": true 973 | }, 974 | "node_modules/cross-spawn": { 975 | "version": "5.1.0", 976 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 977 | "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", 978 | "dev": true, 979 | "dependencies": { 980 | "lru-cache": "^4.0.1", 981 | "shebang-command": "^1.2.0", 982 | "which": "^1.2.9" 983 | } 984 | }, 985 | "node_modules/cross-var": { 986 | "version": "1.1.0", 987 | "resolved": "https://registry.npmjs.org/cross-var/-/cross-var-1.1.0.tgz", 988 | "integrity": "sha512-wIcFax9RNm5ayuORUeJ5MLxPbfh8XdZhhUpKutIszU46Fs9UIhEdPJ7+YguM+7FxEj+68hSQVyathVsIu84SiA==", 989 | "dev": true, 990 | "dependencies": { 991 | "babel-preset-es2015": "^6.18.0", 992 | "babel-preset-stage-0": "^6.16.0", 993 | "babel-register": "^6.18.0", 994 | "cross-spawn": "^5.0.1", 995 | "exit": "^0.1.2" 996 | }, 997 | "bin": { 998 | "cross-var": "index.js" 999 | } 1000 | }, 1001 | "node_modules/debug": { 1002 | "version": "2.6.9", 1003 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1004 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1005 | "dev": true, 1006 | "dependencies": { 1007 | "ms": "2.0.0" 1008 | } 1009 | }, 1010 | "node_modules/detect-indent": { 1011 | "version": "4.0.0", 1012 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", 1013 | "integrity": "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==", 1014 | "dev": true, 1015 | "dependencies": { 1016 | "repeating": "^2.0.0" 1017 | }, 1018 | "engines": { 1019 | "node": ">=0.10.0" 1020 | } 1021 | }, 1022 | "node_modules/emoji-regex": { 1023 | "version": "8.0.0", 1024 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1025 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1026 | "dev": true 1027 | }, 1028 | "node_modules/escalade": { 1029 | "version": "3.1.1", 1030 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1031 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1032 | "dev": true, 1033 | "engines": { 1034 | "node": ">=6" 1035 | } 1036 | }, 1037 | "node_modules/escape-string-regexp": { 1038 | "version": "1.0.5", 1039 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1040 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 1041 | "dev": true, 1042 | "engines": { 1043 | "node": ">=0.8.0" 1044 | } 1045 | }, 1046 | "node_modules/esutils": { 1047 | "version": "2.0.3", 1048 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1049 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1050 | "dev": true, 1051 | "engines": { 1052 | "node": ">=0.10.0" 1053 | } 1054 | }, 1055 | "node_modules/exit": { 1056 | "version": "0.1.2", 1057 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 1058 | "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", 1059 | "dev": true, 1060 | "engines": { 1061 | "node": ">= 0.8.0" 1062 | } 1063 | }, 1064 | "node_modules/fs.realpath": { 1065 | "version": "1.0.0", 1066 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1067 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1068 | "dev": true 1069 | }, 1070 | "node_modules/get-caller-file": { 1071 | "version": "2.0.5", 1072 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1073 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1074 | "dev": true, 1075 | "engines": { 1076 | "node": "6.* || 8.* || >= 10.*" 1077 | } 1078 | }, 1079 | "node_modules/glob": { 1080 | "version": "8.1.0", 1081 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 1082 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 1083 | "dev": true, 1084 | "dependencies": { 1085 | "fs.realpath": "^1.0.0", 1086 | "inflight": "^1.0.4", 1087 | "inherits": "2", 1088 | "minimatch": "^5.0.1", 1089 | "once": "^1.3.0" 1090 | }, 1091 | "engines": { 1092 | "node": ">=12" 1093 | }, 1094 | "funding": { 1095 | "url": "https://github.com/sponsors/isaacs" 1096 | } 1097 | }, 1098 | "node_modules/glob/node_modules/brace-expansion": { 1099 | "version": "2.0.1", 1100 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1101 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1102 | "dev": true, 1103 | "dependencies": { 1104 | "balanced-match": "^1.0.0" 1105 | } 1106 | }, 1107 | "node_modules/glob/node_modules/minimatch": { 1108 | "version": "5.1.6", 1109 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 1110 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 1111 | "dev": true, 1112 | "dependencies": { 1113 | "brace-expansion": "^2.0.1" 1114 | }, 1115 | "engines": { 1116 | "node": ">=10" 1117 | } 1118 | }, 1119 | "node_modules/globals": { 1120 | "version": "9.18.0", 1121 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", 1122 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", 1123 | "dev": true, 1124 | "engines": { 1125 | "node": ">=0.10.0" 1126 | } 1127 | }, 1128 | "node_modules/has-ansi": { 1129 | "version": "2.0.0", 1130 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1131 | "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", 1132 | "dev": true, 1133 | "dependencies": { 1134 | "ansi-regex": "^2.0.0" 1135 | }, 1136 | "engines": { 1137 | "node": ">=0.10.0" 1138 | } 1139 | }, 1140 | "node_modules/has-flag": { 1141 | "version": "4.0.0", 1142 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1143 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1144 | "dev": true, 1145 | "engines": { 1146 | "node": ">=8" 1147 | } 1148 | }, 1149 | "node_modules/home-or-tmp": { 1150 | "version": "2.0.0", 1151 | "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", 1152 | "integrity": "sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==", 1153 | "dev": true, 1154 | "dependencies": { 1155 | "os-homedir": "^1.0.0", 1156 | "os-tmpdir": "^1.0.1" 1157 | }, 1158 | "engines": { 1159 | "node": ">=0.10.0" 1160 | } 1161 | }, 1162 | "node_modules/inflight": { 1163 | "version": "1.0.6", 1164 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1165 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1166 | "dev": true, 1167 | "dependencies": { 1168 | "once": "^1.3.0", 1169 | "wrappy": "1" 1170 | } 1171 | }, 1172 | "node_modules/inherits": { 1173 | "version": "2.0.4", 1174 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1175 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1176 | "dev": true 1177 | }, 1178 | "node_modules/invariant": { 1179 | "version": "2.2.4", 1180 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", 1181 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", 1182 | "dev": true, 1183 | "dependencies": { 1184 | "loose-envify": "^1.0.0" 1185 | } 1186 | }, 1187 | "node_modules/is-finite": { 1188 | "version": "1.1.0", 1189 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", 1190 | "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", 1191 | "dev": true, 1192 | "engines": { 1193 | "node": ">=0.10.0" 1194 | }, 1195 | "funding": { 1196 | "url": "https://github.com/sponsors/sindresorhus" 1197 | } 1198 | }, 1199 | "node_modules/is-fullwidth-code-point": { 1200 | "version": "3.0.0", 1201 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1202 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1203 | "dev": true, 1204 | "engines": { 1205 | "node": ">=8" 1206 | } 1207 | }, 1208 | "node_modules/isexe": { 1209 | "version": "2.0.0", 1210 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1211 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1212 | "dev": true 1213 | }, 1214 | "node_modules/jquery": { 1215 | "version": "3.7.1", 1216 | "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", 1217 | "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" 1218 | }, 1219 | "node_modules/js-tokens": { 1220 | "version": "3.0.2", 1221 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1222 | "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", 1223 | "dev": true 1224 | }, 1225 | "node_modules/jsesc": { 1226 | "version": "1.3.0", 1227 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", 1228 | "integrity": "sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==", 1229 | "dev": true, 1230 | "bin": { 1231 | "jsesc": "bin/jsesc" 1232 | } 1233 | }, 1234 | "node_modules/json5": { 1235 | "version": "0.5.1", 1236 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", 1237 | "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", 1238 | "dev": true, 1239 | "bin": { 1240 | "json5": "lib/cli.js" 1241 | } 1242 | }, 1243 | "node_modules/lodash": { 1244 | "version": "4.17.21", 1245 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1246 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1247 | "dev": true 1248 | }, 1249 | "node_modules/loose-envify": { 1250 | "version": "1.4.0", 1251 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1252 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1253 | "dev": true, 1254 | "dependencies": { 1255 | "js-tokens": "^3.0.0 || ^4.0.0" 1256 | }, 1257 | "bin": { 1258 | "loose-envify": "cli.js" 1259 | } 1260 | }, 1261 | "node_modules/lru-cache": { 1262 | "version": "4.1.5", 1263 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 1264 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 1265 | "dev": true, 1266 | "dependencies": { 1267 | "pseudomap": "^1.0.2", 1268 | "yallist": "^2.1.2" 1269 | } 1270 | }, 1271 | "node_modules/minimatch": { 1272 | "version": "3.1.2", 1273 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1274 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1275 | "dev": true, 1276 | "dependencies": { 1277 | "brace-expansion": "^1.1.7" 1278 | }, 1279 | "engines": { 1280 | "node": "*" 1281 | } 1282 | }, 1283 | "node_modules/minimist": { 1284 | "version": "1.2.8", 1285 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1286 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1287 | "dev": true, 1288 | "funding": { 1289 | "url": "https://github.com/sponsors/ljharb" 1290 | } 1291 | }, 1292 | "node_modules/mkdirp": { 1293 | "version": "0.5.6", 1294 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1295 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1296 | "dev": true, 1297 | "dependencies": { 1298 | "minimist": "^1.2.6" 1299 | }, 1300 | "bin": { 1301 | "mkdirp": "bin/cmd.js" 1302 | } 1303 | }, 1304 | "node_modules/ms": { 1305 | "version": "2.0.0", 1306 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1307 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1308 | "dev": true 1309 | }, 1310 | "node_modules/once": { 1311 | "version": "1.4.0", 1312 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1313 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1314 | "dev": true, 1315 | "dependencies": { 1316 | "wrappy": "1" 1317 | } 1318 | }, 1319 | "node_modules/os-homedir": { 1320 | "version": "1.0.2", 1321 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1322 | "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", 1323 | "dev": true, 1324 | "engines": { 1325 | "node": ">=0.10.0" 1326 | } 1327 | }, 1328 | "node_modules/os-tmpdir": { 1329 | "version": "1.0.2", 1330 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1331 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", 1332 | "dev": true, 1333 | "engines": { 1334 | "node": ">=0.10.0" 1335 | } 1336 | }, 1337 | "node_modules/path-is-absolute": { 1338 | "version": "1.0.1", 1339 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1340 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1341 | "dev": true, 1342 | "engines": { 1343 | "node": ">=0.10.0" 1344 | } 1345 | }, 1346 | "node_modules/private": { 1347 | "version": "0.1.8", 1348 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", 1349 | "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", 1350 | "dev": true, 1351 | "engines": { 1352 | "node": ">= 0.6" 1353 | } 1354 | }, 1355 | "node_modules/pseudomap": { 1356 | "version": "1.0.2", 1357 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1358 | "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", 1359 | "dev": true 1360 | }, 1361 | "node_modules/regenerate": { 1362 | "version": "1.4.2", 1363 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", 1364 | "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", 1365 | "dev": true 1366 | }, 1367 | "node_modules/regenerator-runtime": { 1368 | "version": "0.11.1", 1369 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 1370 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", 1371 | "dev": true 1372 | }, 1373 | "node_modules/regenerator-transform": { 1374 | "version": "0.10.1", 1375 | "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", 1376 | "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", 1377 | "dev": true, 1378 | "dependencies": { 1379 | "babel-runtime": "^6.18.0", 1380 | "babel-types": "^6.19.0", 1381 | "private": "^0.1.6" 1382 | } 1383 | }, 1384 | "node_modules/regexpu-core": { 1385 | "version": "2.0.0", 1386 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", 1387 | "integrity": "sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ==", 1388 | "dev": true, 1389 | "dependencies": { 1390 | "regenerate": "^1.2.1", 1391 | "regjsgen": "^0.2.0", 1392 | "regjsparser": "^0.1.4" 1393 | } 1394 | }, 1395 | "node_modules/regjsgen": { 1396 | "version": "0.2.0", 1397 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", 1398 | "integrity": "sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==", 1399 | "dev": true 1400 | }, 1401 | "node_modules/regjsparser": { 1402 | "version": "0.1.5", 1403 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", 1404 | "integrity": "sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==", 1405 | "dev": true, 1406 | "dependencies": { 1407 | "jsesc": "~0.5.0" 1408 | }, 1409 | "bin": { 1410 | "regjsparser": "bin/parser" 1411 | } 1412 | }, 1413 | "node_modules/regjsparser/node_modules/jsesc": { 1414 | "version": "0.5.0", 1415 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 1416 | "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", 1417 | "dev": true, 1418 | "bin": { 1419 | "jsesc": "bin/jsesc" 1420 | } 1421 | }, 1422 | "node_modules/repeating": { 1423 | "version": "2.0.1", 1424 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 1425 | "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", 1426 | "dev": true, 1427 | "dependencies": { 1428 | "is-finite": "^1.0.0" 1429 | }, 1430 | "engines": { 1431 | "node": ">=0.10.0" 1432 | } 1433 | }, 1434 | "node_modules/replace-in-file": { 1435 | "version": "7.0.1", 1436 | "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-7.0.1.tgz", 1437 | "integrity": "sha512-KbhgPq04eA+TxXuUxpgWIH9k/TjF+28ofon2PXP7vq6izAILhxOtksCVcLuuQLtyjouBaPdlH6RJYYcSPVxCOA==", 1438 | "dev": true, 1439 | "dependencies": { 1440 | "chalk": "^4.1.2", 1441 | "glob": "^8.1.0", 1442 | "yargs": "^17.7.2" 1443 | }, 1444 | "bin": { 1445 | "replace-in-file": "bin/cli.js" 1446 | }, 1447 | "engines": { 1448 | "node": ">=10" 1449 | } 1450 | }, 1451 | "node_modules/replace-in-file/node_modules/ansi-styles": { 1452 | "version": "4.3.0", 1453 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1454 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1455 | "dev": true, 1456 | "dependencies": { 1457 | "color-convert": "^2.0.1" 1458 | }, 1459 | "engines": { 1460 | "node": ">=8" 1461 | }, 1462 | "funding": { 1463 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1464 | } 1465 | }, 1466 | "node_modules/replace-in-file/node_modules/chalk": { 1467 | "version": "4.1.2", 1468 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1469 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1470 | "dev": true, 1471 | "dependencies": { 1472 | "ansi-styles": "^4.1.0", 1473 | "supports-color": "^7.1.0" 1474 | }, 1475 | "engines": { 1476 | "node": ">=10" 1477 | }, 1478 | "funding": { 1479 | "url": "https://github.com/chalk/chalk?sponsor=1" 1480 | } 1481 | }, 1482 | "node_modules/replace-in-file/node_modules/supports-color": { 1483 | "version": "7.2.0", 1484 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1485 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1486 | "dev": true, 1487 | "dependencies": { 1488 | "has-flag": "^4.0.0" 1489 | }, 1490 | "engines": { 1491 | "node": ">=8" 1492 | } 1493 | }, 1494 | "node_modules/require-directory": { 1495 | "version": "2.1.1", 1496 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1497 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1498 | "dev": true, 1499 | "engines": { 1500 | "node": ">=0.10.0" 1501 | } 1502 | }, 1503 | "node_modules/shebang-command": { 1504 | "version": "1.2.0", 1505 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1506 | "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", 1507 | "dev": true, 1508 | "dependencies": { 1509 | "shebang-regex": "^1.0.0" 1510 | }, 1511 | "engines": { 1512 | "node": ">=0.10.0" 1513 | } 1514 | }, 1515 | "node_modules/shebang-regex": { 1516 | "version": "1.0.0", 1517 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1518 | "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", 1519 | "dev": true, 1520 | "engines": { 1521 | "node": ">=0.10.0" 1522 | } 1523 | }, 1524 | "node_modules/slash": { 1525 | "version": "1.0.0", 1526 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", 1527 | "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", 1528 | "dev": true, 1529 | "engines": { 1530 | "node": ">=0.10.0" 1531 | } 1532 | }, 1533 | "node_modules/source-map": { 1534 | "version": "0.5.7", 1535 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1536 | "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", 1537 | "dev": true, 1538 | "engines": { 1539 | "node": ">=0.10.0" 1540 | } 1541 | }, 1542 | "node_modules/source-map-support": { 1543 | "version": "0.4.18", 1544 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", 1545 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", 1546 | "dev": true, 1547 | "dependencies": { 1548 | "source-map": "^0.5.6" 1549 | } 1550 | }, 1551 | "node_modules/string-width": { 1552 | "version": "4.2.3", 1553 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1554 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1555 | "dev": true, 1556 | "dependencies": { 1557 | "emoji-regex": "^8.0.0", 1558 | "is-fullwidth-code-point": "^3.0.0", 1559 | "strip-ansi": "^6.0.1" 1560 | }, 1561 | "engines": { 1562 | "node": ">=8" 1563 | } 1564 | }, 1565 | "node_modules/string-width/node_modules/ansi-regex": { 1566 | "version": "5.0.1", 1567 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1568 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1569 | "dev": true, 1570 | "engines": { 1571 | "node": ">=8" 1572 | } 1573 | }, 1574 | "node_modules/string-width/node_modules/strip-ansi": { 1575 | "version": "6.0.1", 1576 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1577 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1578 | "dev": true, 1579 | "dependencies": { 1580 | "ansi-regex": "^5.0.1" 1581 | }, 1582 | "engines": { 1583 | "node": ">=8" 1584 | } 1585 | }, 1586 | "node_modules/strip-ansi": { 1587 | "version": "3.0.1", 1588 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1589 | "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", 1590 | "dev": true, 1591 | "dependencies": { 1592 | "ansi-regex": "^2.0.0" 1593 | }, 1594 | "engines": { 1595 | "node": ">=0.10.0" 1596 | } 1597 | }, 1598 | "node_modules/supports-color": { 1599 | "version": "2.0.0", 1600 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1601 | "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", 1602 | "dev": true, 1603 | "engines": { 1604 | "node": ">=0.8.0" 1605 | } 1606 | }, 1607 | "node_modules/to-fast-properties": { 1608 | "version": "1.0.3", 1609 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", 1610 | "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", 1611 | "dev": true, 1612 | "engines": { 1613 | "node": ">=0.10.0" 1614 | } 1615 | }, 1616 | "node_modules/trim-right": { 1617 | "version": "1.0.1", 1618 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 1619 | "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", 1620 | "dev": true, 1621 | "engines": { 1622 | "node": ">=0.10.0" 1623 | } 1624 | }, 1625 | "node_modules/uglify-js": { 1626 | "version": "3.17.4", 1627 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", 1628 | "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", 1629 | "dev": true, 1630 | "bin": { 1631 | "uglifyjs": "bin/uglifyjs" 1632 | }, 1633 | "engines": { 1634 | "node": ">=0.8.0" 1635 | } 1636 | }, 1637 | "node_modules/which": { 1638 | "version": "1.3.1", 1639 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1640 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1641 | "dev": true, 1642 | "dependencies": { 1643 | "isexe": "^2.0.0" 1644 | }, 1645 | "bin": { 1646 | "which": "bin/which" 1647 | } 1648 | }, 1649 | "node_modules/wrap-ansi": { 1650 | "version": "7.0.0", 1651 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1652 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1653 | "dev": true, 1654 | "dependencies": { 1655 | "ansi-styles": "^4.0.0", 1656 | "string-width": "^4.1.0", 1657 | "strip-ansi": "^6.0.0" 1658 | }, 1659 | "engines": { 1660 | "node": ">=10" 1661 | }, 1662 | "funding": { 1663 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1664 | } 1665 | }, 1666 | "node_modules/wrap-ansi/node_modules/ansi-regex": { 1667 | "version": "5.0.1", 1668 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1669 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1670 | "dev": true, 1671 | "engines": { 1672 | "node": ">=8" 1673 | } 1674 | }, 1675 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 1676 | "version": "4.3.0", 1677 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1678 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1679 | "dev": true, 1680 | "dependencies": { 1681 | "color-convert": "^2.0.1" 1682 | }, 1683 | "engines": { 1684 | "node": ">=8" 1685 | }, 1686 | "funding": { 1687 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1688 | } 1689 | }, 1690 | "node_modules/wrap-ansi/node_modules/strip-ansi": { 1691 | "version": "6.0.1", 1692 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1693 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1694 | "dev": true, 1695 | "dependencies": { 1696 | "ansi-regex": "^5.0.1" 1697 | }, 1698 | "engines": { 1699 | "node": ">=8" 1700 | } 1701 | }, 1702 | "node_modules/wrappy": { 1703 | "version": "1.0.2", 1704 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1705 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1706 | "dev": true 1707 | }, 1708 | "node_modules/y18n": { 1709 | "version": "5.0.8", 1710 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1711 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1712 | "dev": true, 1713 | "engines": { 1714 | "node": ">=10" 1715 | } 1716 | }, 1717 | "node_modules/yallist": { 1718 | "version": "2.1.2", 1719 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1720 | "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", 1721 | "dev": true 1722 | }, 1723 | "node_modules/yargs": { 1724 | "version": "17.7.2", 1725 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 1726 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 1727 | "dev": true, 1728 | "dependencies": { 1729 | "cliui": "^8.0.1", 1730 | "escalade": "^3.1.1", 1731 | "get-caller-file": "^2.0.5", 1732 | "require-directory": "^2.1.1", 1733 | "string-width": "^4.2.3", 1734 | "y18n": "^5.0.5", 1735 | "yargs-parser": "^21.1.1" 1736 | }, 1737 | "engines": { 1738 | "node": ">=12" 1739 | } 1740 | }, 1741 | "node_modules/yargs-parser": { 1742 | "version": "21.1.1", 1743 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 1744 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 1745 | "dev": true, 1746 | "engines": { 1747 | "node": ">=12" 1748 | } 1749 | } 1750 | } 1751 | } 1752 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "magicsuggest", 3 | "version": "2.1.7", 4 | "description": "MagicSuggest is a multiple selection auto-suggest input box for Bootstrap 3.", 5 | "main": "magicsuggest.js", 6 | "scripts": { 7 | "set-version": "cross-var \"replace-in-file @VERSION@ $npm_package_version ./magicsuggest.min.js\"", 8 | "compressjs": "uglifyjs ./magicsuggest.js -c --comments --source-map \"root='/', url='magicsuggest.min.js.map'\" -o ./magicsuggest.min.js", 9 | "postcompressjs": "npm run set-version", 10 | "build": "npm run compressjs" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/Magicsuggest/magicsuggest.git" 15 | }, 16 | "author": "Nicolas Bize", 17 | "license": "MIT", 18 | "bugs": { 19 | "url": "https://github.com/Magicsuggest/magicsuggest/issues" 20 | }, 21 | "homepage": "https://github.com/Magicsuggest/magicsuggest#readme", 22 | "dependencies": { 23 | "bootstrap": "~3", 24 | "jquery": ">= 1.8.3" 25 | }, 26 | "keywords": [ 27 | "autocomplete", 28 | "bootstrap3", 29 | "JQuery" 30 | ], 31 | "devDependencies": { 32 | "cross-var": "^1.1.0", 33 | "replace-in-file": "^7.0.1", 34 | "uglify-js": "^3.17.4" 35 | } 36 | } 37 | --------------------------------------------------------------------------------