├── .eslintrc.js ├── .github ├── contributing.md ├── issue_template.md └── workflows │ └── nodejs.yml ├── .gitignore ├── LICENSE.md ├── README.md ├── bin ├── .eslintrc.js ├── build-dist.js ├── lint-json.js └── version.js ├── bower.json ├── dist ├── draggabilly.pkgd.js └── draggabilly.pkgd.min.js ├── draggabilly.js ├── package-lock.json ├── package.json ├── sandbox ├── require-js │ ├── index.html │ └── main.js ├── sandbox.html └── single.html └── test ├── .jshintrc ├── index.html ├── jquery.html ├── test.css └── unit ├── basics.js ├── destroy.js ├── jquery-basics.js └── jquery-destroy.js /.eslintrc.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | 3 | module.exports = { 4 | plugins: [ 'metafizzy' ], 5 | extends: 'plugin:metafizzy/browser', 6 | env: { 7 | browser: true, 8 | commonjs: true, 9 | }, 10 | parserOptions: { 11 | ecmaVersion: 2018, 12 | }, 13 | globals: { 14 | Draggabilly: 'readonly', 15 | QUnit: 'readonly', 16 | }, 17 | rules: { 18 | }, 19 | ignorePatterns: [ 20 | 'bower_components/', 21 | ], 22 | }; 23 | -------------------------------------------------------------------------------- /.github/contributing.md: -------------------------------------------------------------------------------- 1 | ## Submitting issues 2 | 3 | ### Reduced test case required 4 | 5 | All bug reports and problem issues require a [**reduced test case**](https://css-tricks.com/reduced-test-cases/). Create one by forking any one of the [CodePen demos](https://codepen.io/collection/aMeRBE?grid_type=list&sort_by=item_created_at) from [the docs](https://draggabilly.desandro.com). Try forking these CodePens: 6 | 7 | **CodePens** 8 | 9 | + [basic jQuery demo](https://codepen.io/desandro/pen/BawYQeq) 10 | + [basic vanilla JS demo](https://codepen.io/desandro/pen/mdBXOZL) 11 | 12 | **Test cases** 13 | 14 | + A reduced test case clearly demonstrates the bug or issue. 15 | + It contains the bare minimum HTML, CSS, and JavaScript required to demonstrate the bug. 16 | + A link to your production site is **not** a reduced test case. 17 | 18 | Providing a reduced test case is the best way to get your issue addressed. They help you point out the problem. They help me verify and debug the problem. They help others understand the problem. Without a reduced test case, your issue may be closed. 19 | 20 | ## Pull requests 21 | 22 | _Contributions are appreciated!_ 23 | 24 | + _Typos and one-line fixes:_ send them right in. 25 | + _Larger changes_ like new features: **ask first** by opening a new issue. I can be particular about my vision for Draggabilly. I do not want you to spend effort on code that I may not wish to merge. 26 | + **Follow the code style.** 2-space indentation, spaces in brackets, semicolons, trailing commas. 27 | + **Do not run `gulp` and update `dist/` files.** I'll take care of this after merging. 28 | -------------------------------------------------------------------------------- /.github/issue_template.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | **Test case:** https://codepen.io/desandro/pen/BawYQeq 4 | -------------------------------------------------------------------------------- /.github/workflows/nodejs.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | pull_request: 10 | branches: [ master ] 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | strategy: 16 | matrix: 17 | node-version: [12.x] 18 | steps: 19 | - uses: actions/checkout@v2 20 | - name: Use Node.js ${{ matrix.node-version }} 21 | uses: actions/setup-node@v1 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | - run: npm ci 25 | - run: npm run dist 26 | - run: npm run lint 27 | env: 28 | CI: true 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | bower_components/ 2 | node_modules/ 3 | build/ 4 | **/fonts/ 5 | .netlify/ 6 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013-2021 [David DeSandro](https://desandro.com) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Draggabilly 2 | 3 |

Make that shiz draggable

4 | 5 | [draggabilly.desandro.com](https://draggabilly.desandro.com) 6 | 7 | Rad because it supports mouse and touch devices. 8 | 9 | Draggabilly v3.0.0 10 | 11 | ## Install 12 | 13 | ### Download 14 | 15 | + [draggabilly.pkgd.min.js](https://unpkg.com/draggabilly@3/dist/draggabilly.pkgd.min.js) minified 16 | + [draggabilly.pkgd.js](https://unpkg.com/draggabilly@3/dist/draggabilly.pkgd.js) un-minified 17 | 18 | ### Package managers 19 | 20 | Install with npm: `npm install draggabilly` 21 | 22 | Install with Yarn: `yarn add draggabilly` 23 | 24 | ### CDN 25 | 26 | Link directly to `draggabilly.pkgd.min.js` on [unpkg.com](https://unpkg.com). 27 | 28 | ``` html 29 | 30 | ``` 31 | 32 | ## Usage 33 | 34 | Initialize Draggabilly as a jQuery plugin 35 | 36 | ``` js 37 | var $draggable = $('.draggable').draggabilly({ 38 | // options... 39 | }) 40 | ``` 41 | 42 | Initialize Draggabilly with vanilla JS 43 | 44 | ``` js 45 | var elem = document.querySelector('.draggable'); 46 | var draggie = new Draggabilly( elem, { 47 | // options... 48 | }); 49 | 50 | // or pass in selector string as first argument 51 | var draggie = new Draggabilly( '.draggable', { 52 | // options... 53 | }); 54 | 55 | // if you have multiple .draggable elements 56 | // get all draggie elements 57 | var draggableElems = document.querySelectorAll('.draggable'); 58 | // array of Draggabillies 59 | var draggies = [] 60 | // init Draggabillies 61 | for ( var i=0; i < draggableElems.length; i++ ) { 62 | var draggableElem = draggableElems[i]; 63 | var draggie = new Draggabilly( draggableElem, { 64 | // options... 65 | }); 66 | draggies.push( draggie ); 67 | } 68 | ``` 69 | 70 | ### Classes 71 | 72 | + `.is-pointer-down` added when the user's pointer (mouse, touch, pointer) first presses down. 73 | + `.is-dragging` added when elements starts to drag. 74 | 75 | ## Options 76 | 77 | ### axis 78 | 79 | **Type:** _String_ 80 | 81 | **Values:** `'x'` or `'y'` 82 | 83 | ``` js 84 | axis: 'x' 85 | ``` 86 | 87 | Constrains movement to horizontal or vertical axis. 88 | 89 | ### containment 90 | 91 | **Type:** _Element_, Selector _String_, or _Boolean_ 92 | 93 | ``` js 94 | containment: '.container' 95 | ``` 96 | 97 | Contains movement to the bounds of the element. If `true`, the container will be the parent element. 98 | 99 | ### grid 100 | 101 | **Type:** _Array_ 102 | 103 | **Values:** `[ x, y ]` 104 | 105 | ``` js 106 | grid: [ 20, 20 ] 107 | ``` 108 | 109 | Snaps the element to a grid, every x and y pixels. 110 | 111 | ### handle 112 | 113 | **Type:** Selector _String_, _Array_, _HTMLElement_ 114 | 115 | ``` js 116 | // select all .handle children with selector string 117 | handle: '.handle' 118 | 119 | // set as element 120 | handle: element.querySelector('.handle') 121 | 122 | // set as array or NodeList 123 | handle: [ element.querySelector('.handle1'), element.querySelector('.handle2') ] 124 | ``` 125 | 126 | Specifies on what element the drag interaction starts. 127 | 128 | `handle` is useful for when you do not want all inner elements to be used for dragging, like inputs and forms. See [back handle example on CodePen](https://codepen.io/desandro/pen/znAuH). 129 | 130 | ## Events 131 | 132 | Bind events with jQuery with standard jQuery event methods `.on()`, `.off()`, and `.one()`. Inside jQuery event listeners `this` refers to the Draggabilly element. 133 | 134 | ``` js 135 | // jQuery 136 | function listener(/* parameters */) { 137 | // get Draggabilly instance 138 | var draggie = $(this).data('draggabilly'); 139 | console.log( 'eventName happened', draggie.position.x, draggie.position.y ); 140 | } 141 | // bind event listener 142 | $draggable.on( 'eventName', listener ); 143 | // unbind event listener 144 | $draggable.off( 'eventName', listener ); 145 | // bind event listener to trigger once. note ONE not ON 146 | $draggable.one( 'eventName', function() { 147 | console.log('eventName happened just once'); 148 | }); 149 | ``` 150 | 151 | Bind events with vanilla JS with `.on()`, `.off()`, and `.once()` methods. Inside vanilla JS event listeners `this` refers to the Draggabilly instance. 152 | 153 | ``` js 154 | // vanilla JS 155 | function listener(/* parameters */) { 156 | console.log( 'eventName happened', this.position.x, this.position.y ); 157 | } 158 | // bind event listener 159 | draggie.on( 'eventName', listener ); 160 | // unbind event listener 161 | draggie.off( 'eventName', listener ); 162 | // bind event listener to trigger once. note ONCE not ONE or ON 163 | draggie.once( 'eventName', function() { 164 | console.log('eventName happened just once'); 165 | }); 166 | ``` 167 | 168 | ### dragStart 169 | 170 | Triggered when dragging starts and the element starts moving. Dragging starts after the user's pointer has moved a couple pixels to allow for clicks. 171 | 172 | ```js 173 | // jQuery 174 | $draggable.on( 'dragStart', function( event, pointer ) {...}) 175 | // vanilla JS 176 | draggie.on( 'dragStart', function( event, pointer ) {...}) 177 | ``` 178 | 179 | + `event` - **Type:** _Event_ - the original `mousedown` or `touchstart` event 180 | + `pointer` - **Type:** _MouseEvent_ or _Touch_ - the event object that has `.pageX` and `.pageY` 181 | 182 | ### dragMove 183 | 184 | Triggered when dragging moves. 185 | 186 | ```js 187 | // jQuery 188 | $draggable.on( 'dragMove', function( event, pointer, moveVector ) {...}) 189 | // vanilla JS 190 | draggie.on( 'dragMove', function( event, pointer, moveVector ) {...}) 191 | ``` 192 | 193 | + `event` - **Type:** _Event_ - the original `mousemove` or `touchmove` event 194 | + `pointer` - **Type:** _MouseEvent_ or _Touch_ - the event object that has `.pageX` and `.pageY` 195 | + `moveVector` **Type:** _Object_ - How far the pointer has moved from its start position `{ x: 20, y: -30 }` 196 | 197 | ### dragEnd 198 | 199 | Triggered when dragging ends. 200 | 201 | ```js 202 | // jQuery 203 | $draggable.on( 'dragEnd', function( event, pointer ) {...}) 204 | // vanilla JS 205 | draggie.on( 'dragEnd', function( event, pointer ) {...}) 206 | ``` 207 | 208 | + `event` - **Type:** _Event_ - the original `mouseup` or `touchend` event 209 | + `pointer` - **Type:** _MouseEvent_ or _Touch_ - the event object that has `.pageX` and `.pageY` 210 | 211 | ### pointerDown 212 | 213 | Triggered when the user's pointer (mouse, touch, pointer) presses down. 214 | 215 | ```js 216 | // jQuery 217 | $draggable.on( 'pointerDown', function( event, pointer ) {...}) 218 | // vanilla JS 219 | draggie.on( 'pointerDown', function( event, pointer ) {...}) 220 | ``` 221 | 222 | + `event` - **Type:** _Event_ - the original `mousedown` or `touchstart` event 223 | + `pointer` - **Type:** _MouseEvent_ or _Touch_ - the event object that has `.pageX` and `.pageY` 224 | 225 | ### pointerMove 226 | 227 | Triggered when the user's pointer moves. 228 | 229 | ```js 230 | // jQuery 231 | $draggable.on( 'pointerMove', function( event, pointer, moveVector ) {...}) 232 | // vanilla JS 233 | draggie.on( 'pointerMove', function( event, pointer, moveVector ) {...}) 234 | ``` 235 | 236 | + `event` - **Type:** _Event_ - the original `mousemove` or `touchmove` event 237 | + `pointer` - **Type:** _MouseEvent_ or _Touch_ - the event object that has `.pageX` and `.pageY` 238 | + `moveVector` **Type:** _Object_ - How far the pointer has moved from its start position `{ x: 20, y: -30 }` 239 | 240 | ### pointerUp 241 | 242 | Triggered when the user's pointer unpresses. 243 | 244 | ```js 245 | // jQuery 246 | $draggable.on( 'pointerUp', function( event, pointer ) {...}) 247 | // vanilla JS 248 | draggie.on( 'pointerUp', function( event, pointer ) {...}) 249 | ``` 250 | 251 | + `event` - **Type:** _Event_ - the original `mouseup` or `touchend` event 252 | + `pointer` - **Type:** _MouseEvent_ or _Touch_ - the event object that has `.pageX` and `.pageY` 253 | 254 | ### staticClick 255 | 256 | Triggered when the user's pointer is pressed and unpressed and has not moved enough to start dragging. 257 | 258 | `click` events are hard to detect with draggable UI, as they are triggered whenever a user drags. Draggabilly's staticClick event resolves this, as it is triggered when the user has not dragged. 259 | 260 | ```js 261 | // jQuery 262 | $draggable.on( 'staticClick', function( event, pointer ) {...}) 263 | // vanilla JS 264 | draggie.on( 'staticClick', function( event, pointer ) {...}) 265 | ``` 266 | 267 | + `event` - **Type:** _Event_ - the original `mouseup` or `touchend` event 268 | + `pointer` - **Type:** _MouseEvent_ or _Touch_ - the event object that has `.pageX` and `.pageY` 269 | 270 | ## Methods 271 | 272 | ### disable 273 | 274 | ``` js 275 | // jQuery 276 | $draggable.draggabilly('disable') 277 | // vanilla JS 278 | draggie.disable() 279 | ``` 280 | 281 | ### enable 282 | 283 | ``` js 284 | // jQuery 285 | $draggable.draggabilly('enable') 286 | // vanilla JS 287 | draggie.enable() 288 | ``` 289 | 290 | ### setPosition 291 | 292 | ``` js 293 | // jQuery 294 | $draggable.draggabilly( 'setPosition', x, y ) 295 | // vanilla JS 296 | draggie.setPosition( x, y ) 297 | ``` 298 | 299 | + `x` - **Type:** _Number_ - horizontal position 300 | + `y` - **Type:** _Number_ - vertical position 301 | 302 | ### dragEnd 303 | 304 | Stop dragging. 305 | 306 | ``` js 307 | // jQuery 308 | $draggable.draggabilly('dragEnd') 309 | // vanilla JS 310 | draggie.dragEnd() 311 | ``` 312 | 313 | ### destroy 314 | 315 | ``` js 316 | // jQuery 317 | $draggable.draggabilly('destroy') 318 | // vanilla JS 319 | draggie.destroy() 320 | ``` 321 | 322 | ### jQuery.fn.data('draggabilly') 323 | 324 | Get the Draggabilly instance from a jQuery object. Draggabilly instances are useful to access Draggabilly properties. 325 | 326 | ``` js 327 | var draggie = $('.draggable').data('draggabilly') 328 | // access Draggabilly properties 329 | console.log( 'draggie at ' + draggie.position.x + ', ' + draggie.position.y ) 330 | ``` 331 | 332 | ## Properties 333 | 334 | ### position 335 | 336 | ``` js 337 | draggie.position 338 | // => { x: 20, y: -30 } 339 | ``` 340 | 341 | + `position` - **Type:** _Object_ 342 | + `x` - **Type:** _Number_ 343 | + `y` - **Type:** _Number_ 344 | 345 | ## Webpack & Browserify 346 | 347 | Install [Draggabilly with npm](https://www.npmjs.com/package/draggabilly). 348 | 349 | ``` 350 | npm install draggabilly 351 | ``` 352 | 353 | ``` js 354 | var Draggabilly = require('draggabilly'); 355 | 356 | var draggie = new Draggabilly( '.draggable', { 357 | // options 358 | }); 359 | ``` 360 | 361 | To use Draggabilly as a jQuery plugin, you need to install and call [jQuery Bridget](https://github.com/desandro/jquery-bridget). 362 | 363 | ``` 364 | npm install jquery-bridget 365 | ``` 366 | 367 | ``` js 368 | var $ = require('jquery'); 369 | var jQueryBridget = require('jquery-bridget'); 370 | var Draggabilly = require('draggabilly'); 371 | 372 | // make Draggabilly a jQuery plugin 373 | jQueryBridget( 'draggabilly', Draggabilly, $ ); 374 | // now you can use $().draggabilly() 375 | $('.draggable').draggabilly({...}) 376 | ``` 377 | 378 | ## Browser support 379 | 380 | Draggabilly v3 supports Chrome 49+, Firefox 41+, Safari 14+ (mobile & desktop), and Edge 12+. 381 | 382 | - Use [Draggabilly v2](https://github.com/desandro/draggabilly/releases/tag/v2.4.1) for IE10 support and Safari 8 support. 383 | - Use [Draggabilly v2.1](https://github.com/desandro/draggabilly/releases/tag/v2.1.1) for Android 4+ and Safari 6+ support. 384 | - Use [Draggabilly v1](https://github.com/desandro/draggabilly/releases/tag/v1.2.4) for IE8 & 9, and Android 2.3+ support. 385 | 386 | ## License 387 | 388 | Draggabilly is released under the [MIT License](https://desandro.mit-license.org/). Have at it. 389 | 390 | --- 391 | 392 | Made by [David DeSandro](https://desandro.com) 😻 393 | -------------------------------------------------------------------------------- /bin/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 'metafizzy' ], 3 | extends: 'plugin:metafizzy/node', 4 | rules: { 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /bin/build-dist.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const { execSync } = require('child_process'); 3 | const { minify } = require('terser'); 4 | const pkg = require('../package.json'); 5 | 6 | const distPath = 'dist/draggabilly.pkgd.js'; 7 | const distMinPath = 'dist/draggabilly.pkgd.min.js'; 8 | 9 | let indexContent = fs.readFileSync( `./${pkg.main}`, 'utf8' ); 10 | 11 | let paths = [ 12 | 'node_modules/jquery-bridget/jquery-bridget.js', 13 | 'node_modules/get-size/get-size.js', 14 | 'node_modules/ev-emitter/ev-emitter.js', 15 | 'node_modules/unidragger/unidragger.js', 16 | 'draggabilly.js', 17 | ]; 18 | 19 | // concatenate files 20 | execSync(`cat ${paths.join(' ')} > ${distPath}`); 21 | 22 | // add banner 23 | let banner = indexContent.split(' */')[0] + ' */\n\n'; 24 | banner = banner.replace( 'Draggabilly', 'Draggabilly PACKAGED' ); 25 | let distJsContent = fs.readFileSync( distPath, 'utf8' ); 26 | distJsContent = banner + distJsContent; 27 | fs.writeFileSync( distPath, distJsContent ); 28 | 29 | // minify 30 | ( async function() { 31 | let { code } = await minify( distJsContent, { mangle: true } ); 32 | fs.writeFileSync( distMinPath, code ); 33 | } )(); 34 | -------------------------------------------------------------------------------- /bin/lint-json.js: -------------------------------------------------------------------------------- 1 | require('../package.json'); 2 | require('../bower.json'); 3 | -------------------------------------------------------------------------------- /bin/version.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const version = require('../package.json').version; 4 | 5 | function dir( file ) { 6 | return path.resolve( __dirname, file ); 7 | } 8 | 9 | [ '../draggabilly.js', '../README.md' ].forEach( function( file ) { 10 | file = dir( file ); 11 | let src = fs.readFileSync( file, 'utf8' ); 12 | src = src.replace( /Draggabilly v\d+\.\d+\.\d+/, `Draggabilly v${version}` ); 13 | fs.writeFileSync( file, src, 'utf8' ); 14 | } ); 15 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "draggabilly", 3 | "description": "make that shiz draggable", 4 | "main": "draggabilly.js", 5 | "dependencies": { 6 | "get-size": "^0.0.0", 7 | "unidragger": "^3.0.0" 8 | }, 9 | "devDependencies": { 10 | }, 11 | "homepage": "https://draggabilly.desandro.com", 12 | "authors": [ 13 | "David DeSandro" 14 | ], 15 | "moduleType": [ 16 | "amd", 17 | "globals", 18 | "node" 19 | ], 20 | "keywords": [ 21 | "drag", 22 | "draggable" 23 | ], 24 | "license": "MIT", 25 | "ignore": [ 26 | "**/.*", 27 | "node_modules", 28 | "bower_components", 29 | "test", 30 | "tests", 31 | "contributing.md", 32 | "Gruntfile.js", 33 | "gulpfile.js", 34 | "package.json", 35 | "sandbox" 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /dist/draggabilly.pkgd.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Draggabilly PACKAGED v3.0.0 3 | * Make that shiz draggable 4 | * https://draggabilly.desandro.com 5 | * MIT license 6 | */ 7 | 8 | /** 9 | * Bridget makes jQuery widgets 10 | * v2.0.1 11 | * MIT license 12 | */ 13 | 14 | /* jshint browser: true, strict: true, undef: true, unused: true */ 15 | 16 | ( function( window, factory ) { 17 | // universal module definition 18 | /*jshint strict: false */ /* globals define, module, require */ 19 | if ( typeof define == 'function' && define.amd ) { 20 | // AMD 21 | define( [ 'jquery' ], function( jQuery ) { 22 | return factory( window, jQuery ); 23 | }); 24 | } else if ( typeof module == 'object' && module.exports ) { 25 | // CommonJS 26 | module.exports = factory( 27 | window, 28 | require('jquery') 29 | ); 30 | } else { 31 | // browser global 32 | window.jQueryBridget = factory( 33 | window, 34 | window.jQuery 35 | ); 36 | } 37 | 38 | }( window, function factory( window, jQuery ) { 39 | 'use strict'; 40 | 41 | // ----- utils ----- // 42 | 43 | var arraySlice = Array.prototype.slice; 44 | 45 | // helper function for logging errors 46 | // $.error breaks jQuery chaining 47 | var console = window.console; 48 | var logError = typeof console == 'undefined' ? function() {} : 49 | function( message ) { 50 | console.error( message ); 51 | }; 52 | 53 | // ----- jQueryBridget ----- // 54 | 55 | function jQueryBridget( namespace, PluginClass, $ ) { 56 | $ = $ || jQuery || window.jQuery; 57 | if ( !$ ) { 58 | return; 59 | } 60 | 61 | // add option method -> $().plugin('option', {...}) 62 | if ( !PluginClass.prototype.option ) { 63 | // option setter 64 | PluginClass.prototype.option = function( opts ) { 65 | // bail out if not an object 66 | if ( !$.isPlainObject( opts ) ){ 67 | return; 68 | } 69 | this.options = $.extend( true, this.options, opts ); 70 | }; 71 | } 72 | 73 | // make jQuery plugin 74 | $.fn[ namespace ] = function( arg0 /*, arg1 */ ) { 75 | if ( typeof arg0 == 'string' ) { 76 | // method call $().plugin( 'methodName', { options } ) 77 | // shift arguments by 1 78 | var args = arraySlice.call( arguments, 1 ); 79 | return methodCall( this, arg0, args ); 80 | } 81 | // just $().plugin({ options }) 82 | plainCall( this, arg0 ); 83 | return this; 84 | }; 85 | 86 | // $().plugin('methodName') 87 | function methodCall( $elems, methodName, args ) { 88 | var returnValue; 89 | var pluginMethodStr = '$().' + namespace + '("' + methodName + '")'; 90 | 91 | $elems.each( function( i, elem ) { 92 | // get instance 93 | var instance = $.data( elem, namespace ); 94 | if ( !instance ) { 95 | logError( namespace + ' not initialized. Cannot call methods, i.e. ' + 96 | pluginMethodStr ); 97 | return; 98 | } 99 | 100 | var method = instance[ methodName ]; 101 | if ( !method || methodName.charAt(0) == '_' ) { 102 | logError( pluginMethodStr + ' is not a valid method' ); 103 | return; 104 | } 105 | 106 | // apply method, get return value 107 | var value = method.apply( instance, args ); 108 | // set return value if value is returned, use only first value 109 | returnValue = returnValue === undefined ? value : returnValue; 110 | }); 111 | 112 | return returnValue !== undefined ? returnValue : $elems; 113 | } 114 | 115 | function plainCall( $elems, options ) { 116 | $elems.each( function( i, elem ) { 117 | var instance = $.data( elem, namespace ); 118 | if ( instance ) { 119 | // set options & init 120 | instance.option( options ); 121 | instance._init(); 122 | } else { 123 | // initialize new instance 124 | instance = new PluginClass( elem, options ); 125 | $.data( elem, namespace, instance ); 126 | } 127 | }); 128 | } 129 | 130 | updateJQuery( $ ); 131 | 132 | } 133 | 134 | // ----- updateJQuery ----- // 135 | 136 | // set $.bridget for v1 backwards compatibility 137 | function updateJQuery( $ ) { 138 | if ( !$ || ( $ && $.bridget ) ) { 139 | return; 140 | } 141 | $.bridget = jQueryBridget; 142 | } 143 | 144 | updateJQuery( jQuery || window.jQuery ); 145 | 146 | // ----- ----- // 147 | 148 | return jQueryBridget; 149 | 150 | })); 151 | /*! 152 | * Infinite Scroll v2.0.4 153 | * measure size of elements 154 | * MIT license 155 | */ 156 | 157 | ( function( window, factory ) { 158 | if ( typeof module == 'object' && module.exports ) { 159 | // CommonJS 160 | module.exports = factory(); 161 | } else { 162 | // browser global 163 | window.getSize = factory(); 164 | } 165 | 166 | } )( window, function factory() { 167 | 168 | // -------------------------- helpers -------------------------- // 169 | 170 | // get a number from a string, not a percentage 171 | function getStyleSize( value ) { 172 | let num = parseFloat( value ); 173 | // not a percent like '100%', and a number 174 | let isValid = value.indexOf('%') == -1 && !isNaN( num ); 175 | return isValid && num; 176 | } 177 | 178 | // -------------------------- measurements -------------------------- // 179 | 180 | let measurements = [ 181 | 'paddingLeft', 182 | 'paddingRight', 183 | 'paddingTop', 184 | 'paddingBottom', 185 | 'marginLeft', 186 | 'marginRight', 187 | 'marginTop', 188 | 'marginBottom', 189 | 'borderLeftWidth', 190 | 'borderRightWidth', 191 | 'borderTopWidth', 192 | 'borderBottomWidth', 193 | ]; 194 | 195 | let measurementsLength = measurements.length; 196 | 197 | function getZeroSize() { 198 | let size = { 199 | width: 0, 200 | height: 0, 201 | innerWidth: 0, 202 | innerHeight: 0, 203 | outerWidth: 0, 204 | outerHeight: 0, 205 | }; 206 | measurements.forEach( ( measurement ) => { 207 | size[ measurement ] = 0; 208 | } ); 209 | return size; 210 | } 211 | 212 | // -------------------------- getSize -------------------------- // 213 | 214 | function getSize( elem ) { 215 | // use querySeletor if elem is string 216 | if ( typeof elem == 'string' ) elem = document.querySelector( elem ); 217 | 218 | // do not proceed on non-objects 219 | let isElement = elem && typeof elem == 'object' && elem.nodeType; 220 | if ( !isElement ) return; 221 | 222 | let style = getComputedStyle( elem ); 223 | 224 | // if hidden, everything is 0 225 | if ( style.display == 'none' ) return getZeroSize(); 226 | 227 | let size = {}; 228 | size.width = elem.offsetWidth; 229 | size.height = elem.offsetHeight; 230 | 231 | let isBorderBox = size.isBorderBox = style.boxSizing == 'border-box'; 232 | 233 | // get all measurements 234 | measurements.forEach( ( measurement ) => { 235 | let value = style[ measurement ]; 236 | let num = parseFloat( value ); 237 | // any 'auto', 'medium' value will be 0 238 | size[ measurement ] = !isNaN( num ) ? num : 0; 239 | } ); 240 | 241 | let paddingWidth = size.paddingLeft + size.paddingRight; 242 | let paddingHeight = size.paddingTop + size.paddingBottom; 243 | let marginWidth = size.marginLeft + size.marginRight; 244 | let marginHeight = size.marginTop + size.marginBottom; 245 | let borderWidth = size.borderLeftWidth + size.borderRightWidth; 246 | let borderHeight = size.borderTopWidth + size.borderBottomWidth; 247 | 248 | // overwrite width and height if we can get it from style 249 | let styleWidth = getStyleSize( style.width ); 250 | if ( styleWidth !== false ) { 251 | size.width = styleWidth + 252 | // add padding and border unless it's already including it 253 | ( isBorderBox ? 0 : paddingWidth + borderWidth ); 254 | } 255 | 256 | let styleHeight = getStyleSize( style.height ); 257 | if ( styleHeight !== false ) { 258 | size.height = styleHeight + 259 | // add padding and border unless it's already including it 260 | ( isBorderBox ? 0 : paddingHeight + borderHeight ); 261 | } 262 | 263 | size.innerWidth = size.width - ( paddingWidth + borderWidth ); 264 | size.innerHeight = size.height - ( paddingHeight + borderHeight ); 265 | 266 | size.outerWidth = size.width + marginWidth; 267 | size.outerHeight = size.height + marginHeight; 268 | 269 | return size; 270 | } 271 | 272 | return getSize; 273 | 274 | } ); 275 | /** 276 | * EvEmitter v2.1.1 277 | * Lil' event emitter 278 | * MIT License 279 | */ 280 | 281 | ( function( global, factory ) { 282 | // universal module definition 283 | if ( typeof module == 'object' && module.exports ) { 284 | // CommonJS - Browserify, Webpack 285 | module.exports = factory(); 286 | } else { 287 | // Browser globals 288 | global.EvEmitter = factory(); 289 | } 290 | 291 | }( typeof window != 'undefined' ? window : this, function() { 292 | 293 | function EvEmitter() {} 294 | 295 | let proto = EvEmitter.prototype; 296 | 297 | proto.on = function( eventName, listener ) { 298 | if ( !eventName || !listener ) return this; 299 | 300 | // set events hash 301 | let events = this._events = this._events || {}; 302 | // set listeners array 303 | let listeners = events[ eventName ] = events[ eventName ] || []; 304 | // only add once 305 | if ( !listeners.includes( listener ) ) { 306 | listeners.push( listener ); 307 | } 308 | 309 | return this; 310 | }; 311 | 312 | proto.once = function( eventName, listener ) { 313 | if ( !eventName || !listener ) return this; 314 | 315 | // add event 316 | this.on( eventName, listener ); 317 | // set once flag 318 | // set onceEvents hash 319 | let onceEvents = this._onceEvents = this._onceEvents || {}; 320 | // set onceListeners object 321 | let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {}; 322 | // set flag 323 | onceListeners[ listener ] = true; 324 | 325 | return this; 326 | }; 327 | 328 | proto.off = function( eventName, listener ) { 329 | let listeners = this._events && this._events[ eventName ]; 330 | if ( !listeners || !listeners.length ) return this; 331 | 332 | let index = listeners.indexOf( listener ); 333 | if ( index != -1 ) { 334 | listeners.splice( index, 1 ); 335 | } 336 | 337 | return this; 338 | }; 339 | 340 | proto.emitEvent = function( eventName, args ) { 341 | let listeners = this._events && this._events[ eventName ]; 342 | if ( !listeners || !listeners.length ) return this; 343 | 344 | // copy over to avoid interference if .off() in listener 345 | listeners = listeners.slice( 0 ); 346 | args = args || []; 347 | // once stuff 348 | let onceListeners = this._onceEvents && this._onceEvents[ eventName ]; 349 | 350 | for ( let listener of listeners ) { 351 | let isOnce = onceListeners && onceListeners[ listener ]; 352 | if ( isOnce ) { 353 | // remove listener 354 | // remove before trigger to prevent recursion 355 | this.off( eventName, listener ); 356 | // unset once flag 357 | delete onceListeners[ listener ]; 358 | } 359 | // trigger listener 360 | listener.apply( this, args ); 361 | } 362 | 363 | return this; 364 | }; 365 | 366 | proto.allOff = function() { 367 | delete this._events; 368 | delete this._onceEvents; 369 | return this; 370 | }; 371 | 372 | return EvEmitter; 373 | 374 | } ) ); 375 | /*! 376 | * Unidragger v3.0.0 377 | * Draggable base class 378 | * MIT license 379 | */ 380 | 381 | ( function( window, factory ) { 382 | // universal module definition 383 | if ( typeof module == 'object' && module.exports ) { 384 | // CommonJS 385 | module.exports = factory( 386 | window, 387 | require('ev-emitter'), 388 | ); 389 | } else { 390 | // browser global 391 | window.Unidragger = factory( 392 | window, 393 | window.EvEmitter, 394 | ); 395 | } 396 | 397 | }( typeof window != 'undefined' ? window : this, function factory( window, EvEmitter ) { 398 | 399 | function Unidragger() {} 400 | 401 | // inherit EvEmitter 402 | let proto = Unidragger.prototype = Object.create( EvEmitter.prototype ); 403 | 404 | // ----- bind start ----- // 405 | 406 | // trigger handler methods for events 407 | proto.handleEvent = function( event ) { 408 | let method = 'on' + event.type; 409 | if ( this[ method ] ) { 410 | this[ method ]( event ); 411 | } 412 | }; 413 | 414 | let startEvent, activeEvents; 415 | if ( 'ontouchstart' in window ) { 416 | // HACK prefer Touch Events as you can preventDefault on touchstart to 417 | // disable scroll in iOS & mobile Chrome metafizzy/flickity#1177 418 | startEvent = 'touchstart'; 419 | activeEvents = [ 'touchmove', 'touchend', 'touchcancel' ]; 420 | } else if ( window.PointerEvent ) { 421 | // Pointer Events 422 | startEvent = 'pointerdown'; 423 | activeEvents = [ 'pointermove', 'pointerup', 'pointercancel' ]; 424 | } else { 425 | // mouse events 426 | startEvent = 'mousedown'; 427 | activeEvents = [ 'mousemove', 'mouseup' ]; 428 | } 429 | 430 | // prototype so it can be overwriteable by Flickity 431 | proto.touchActionValue = 'none'; 432 | 433 | proto.bindHandles = function() { 434 | this._bindHandles( 'addEventListener', this.touchActionValue ); 435 | }; 436 | 437 | proto.unbindHandles = function() { 438 | this._bindHandles( 'removeEventListener', '' ); 439 | }; 440 | 441 | /** 442 | * Add or remove start event 443 | * @param {String} bindMethod - addEventListener or removeEventListener 444 | * @param {String} touchAction - value for touch-action CSS property 445 | */ 446 | proto._bindHandles = function( bindMethod, touchAction ) { 447 | this.handles.forEach( ( handle ) => { 448 | handle[ bindMethod ]( startEvent, this ); 449 | handle[ bindMethod ]( 'click', this ); 450 | // touch-action: none to override browser touch gestures. metafizzy/flickity#540 451 | if ( window.PointerEvent ) handle.style.touchAction = touchAction; 452 | } ); 453 | }; 454 | 455 | proto.bindActivePointerEvents = function() { 456 | activeEvents.forEach( ( eventName ) => { 457 | window.addEventListener( eventName, this ); 458 | } ); 459 | }; 460 | 461 | proto.unbindActivePointerEvents = function() { 462 | activeEvents.forEach( ( eventName ) => { 463 | window.removeEventListener( eventName, this ); 464 | } ); 465 | }; 466 | 467 | // ----- event handler helpers ----- // 468 | 469 | // trigger method with matching pointer 470 | proto.withPointer = function( methodName, event ) { 471 | if ( event.pointerId == this.pointerIdentifier ) { 472 | this[ methodName ]( event, event ); 473 | } 474 | }; 475 | 476 | // trigger method with matching touch 477 | proto.withTouch = function( methodName, event ) { 478 | let touch; 479 | for ( let changedTouch of event.changedTouches ) { 480 | if ( changedTouch.identifier == this.pointerIdentifier ) { 481 | touch = changedTouch; 482 | } 483 | } 484 | if ( touch ) this[ methodName ]( event, touch ); 485 | }; 486 | 487 | // ----- start event ----- // 488 | 489 | proto.onmousedown = function( event ) { 490 | this.pointerDown( event, event ); 491 | }; 492 | 493 | proto.ontouchstart = function( event ) { 494 | this.pointerDown( event, event.changedTouches[0] ); 495 | }; 496 | 497 | proto.onpointerdown = function( event ) { 498 | this.pointerDown( event, event ); 499 | }; 500 | 501 | // nodes that have text fields 502 | const cursorNodes = [ 'TEXTAREA', 'INPUT', 'SELECT', 'OPTION' ]; 503 | // input types that do not have text fields 504 | const clickTypes = [ 'radio', 'checkbox', 'button', 'submit', 'image', 'file' ]; 505 | 506 | /** 507 | * any time you set `event, pointer` it refers to: 508 | * @param {Event} event 509 | * @param {Event | Touch} pointer 510 | */ 511 | proto.pointerDown = function( event, pointer ) { 512 | // dismiss multi-touch taps, right clicks, and clicks on text fields 513 | let isCursorNode = cursorNodes.includes( event.target.nodeName ); 514 | let isClickType = clickTypes.includes( event.target.type ); 515 | let isOkayElement = !isCursorNode || isClickType; 516 | let isOkay = !this.isPointerDown && !event.button && isOkayElement; 517 | if ( !isOkay ) return; 518 | 519 | this.isPointerDown = true; 520 | // save pointer identifier to match up touch events 521 | this.pointerIdentifier = pointer.pointerId !== undefined ? 522 | // pointerId for pointer events, touch.indentifier for touch events 523 | pointer.pointerId : pointer.identifier; 524 | 525 | this.pointerDown( event, pointer ); 526 | this.bindActivePointerEvents(); 527 | this.emitEvent( 'pointerDown', [ event, pointer ] ); 528 | }; 529 | 530 | // ----- move ----- // 531 | 532 | proto.onmousemove = function( event ) { 533 | this.pointerMove( event, event ); 534 | }; 535 | 536 | proto.onpointermove = function( event ) { 537 | this.withPointer( 'pointerMove', event ); 538 | }; 539 | 540 | proto.ontouchmove = function( event ) { 541 | this.withTouch( 'pointerMove', event ); 542 | }; 543 | 544 | proto.pointerMove = function( event, pointer ) { 545 | let moveVector = { 546 | x: pointer.pageX - this.pointerDownPointer.pageX, 547 | y: pointer.pageY - this.pointerDownPointer.pageY, 548 | }; 549 | this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] ); 550 | // start drag if pointer has moved far enough to start drag 551 | let isDragStarting = !this.isDragging && this.hasDragStarted( moveVector ); 552 | if ( isDragStarting ) this.dragStart( event, pointer ); 553 | if ( this.isDragging ) this.dragMove( event, pointer, moveVector ); 554 | }; 555 | 556 | // condition if pointer has moved far enough to start drag 557 | proto.hasDragStarted = function( moveVector ) { 558 | return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3; 559 | }; 560 | 561 | // ----- drag ----- // 562 | 563 | proto.dragStart = function( event, pointer ) { 564 | this.isDragging = true; 565 | this.isPreventingClicks = true; // set flag to prevent clicks 566 | this.emitEvent( 'dragStart', [ event, pointer ] ); 567 | }; 568 | 569 | proto.dragMove = function( event, pointer, moveVector ) { 570 | this.emitEvent( 'dragMove', [ event, pointer, moveVector ] ); 571 | }; 572 | 573 | // ----- end ----- // 574 | 575 | proto.onmouseup = function( event ) { 576 | this.pointerUp( event, event ); 577 | }; 578 | 579 | proto.onpointerup = function( event ) { 580 | this.withPointer( 'pointerUp', event ); 581 | }; 582 | 583 | proto.ontouchend = function( event ) { 584 | this.withTouch( 'pointerUp', event ); 585 | }; 586 | 587 | proto.pointerUp = function( event, pointer ) { 588 | this.pointerDone(); 589 | this.emitEvent( 'pointerUp', [ event, pointer ] ); 590 | 591 | if ( this.isDragging ) { 592 | this.dragEnd( event, pointer ); 593 | } else { 594 | // pointer didn't move enough for drag to start 595 | this.staticClick( event, pointer ); 596 | } 597 | }; 598 | 599 | proto.dragEnd = function( event, pointer ) { 600 | this.isDragging = false; // reset flag 601 | // re-enable clicking async 602 | setTimeout( () => delete this.isPreventingClicks ); 603 | 604 | this.emitEvent( 'dragEnd', [ event, pointer ] ); 605 | }; 606 | 607 | // triggered on pointer up & pointer cancel 608 | proto.pointerDone = function() { 609 | this.isPointerDown = false; 610 | delete this.pointerIdentifier; 611 | this.unbindActivePointerEvents(); 612 | this.emitEvent('pointerDone'); 613 | }; 614 | 615 | // ----- cancel ----- // 616 | 617 | proto.onpointercancel = function( event ) { 618 | this.withPointer( 'pointerCancel', event ); 619 | }; 620 | 621 | proto.ontouchcancel = function( event ) { 622 | this.withTouch( 'pointerCancel', event ); 623 | }; 624 | 625 | proto.pointerCancel = function( event, pointer ) { 626 | this.pointerDone(); 627 | this.emitEvent( 'pointerCancel', [ event, pointer ] ); 628 | }; 629 | 630 | // ----- click ----- // 631 | 632 | // handle all clicks and prevent clicks when dragging 633 | proto.onclick = function( event ) { 634 | if ( this.isPreventingClicks ) event.preventDefault(); 635 | }; 636 | 637 | // triggered after pointer down & up with no/tiny movement 638 | proto.staticClick = function( event, pointer ) { 639 | // ignore emulated mouse up clicks 640 | let isMouseup = event.type == 'mouseup'; 641 | if ( isMouseup && this.isIgnoringMouseUp ) return; 642 | 643 | this.emitEvent( 'staticClick', [ event, pointer ] ); 644 | 645 | // set flag for emulated clicks 300ms after touchend 646 | if ( isMouseup ) { 647 | this.isIgnoringMouseUp = true; 648 | // reset flag after 400ms 649 | setTimeout( () => { 650 | delete this.isIgnoringMouseUp; 651 | }, 400 ); 652 | } 653 | }; 654 | 655 | // ----- ----- // 656 | 657 | return Unidragger; 658 | 659 | } ) ); 660 | /*! 661 | * Draggabilly v3.0.0 662 | * Make that shiz draggable 663 | * https://draggabilly.desandro.com 664 | * MIT license 665 | */ 666 | 667 | ( function( window, factory ) { 668 | // universal module definition 669 | if ( typeof module == 'object' && module.exports ) { 670 | // CommonJS 671 | module.exports = factory( 672 | window, 673 | require('get-size'), 674 | require('unidragger'), 675 | ); 676 | } else { 677 | // browser global 678 | window.Draggabilly = factory( 679 | window, 680 | window.getSize, 681 | window.Unidragger, 682 | ); 683 | } 684 | 685 | }( typeof window != 'undefined' ? window : this, 686 | function factory( window, getSize, Unidragger ) { 687 | 688 | // -------------------------- helpers & variables -------------------------- // 689 | 690 | function noop() {} 691 | 692 | let jQuery = window.jQuery; 693 | 694 | // -------------------------- Draggabilly -------------------------- // 695 | 696 | function Draggabilly( element, options ) { 697 | // querySelector if string 698 | this.element = typeof element == 'string' ? 699 | document.querySelector( element ) : element; 700 | 701 | if ( jQuery ) { 702 | this.$element = jQuery( this.element ); 703 | } 704 | 705 | // options 706 | this.options = {}; 707 | this.option( options ); 708 | 709 | this._create(); 710 | } 711 | 712 | // inherit Unidragger methods 713 | let proto = Draggabilly.prototype = Object.create( Unidragger.prototype ); 714 | 715 | /** 716 | * set options 717 | * @param {Object} opts 718 | */ 719 | proto.option = function( opts ) { 720 | this.options = { 721 | ...this.options, 722 | ...opts, 723 | }; 724 | }; 725 | 726 | // css position values that don't need to be set 727 | const positionValues = [ 'relative', 'absolute', 'fixed' ]; 728 | 729 | proto._create = function() { 730 | // properties 731 | this.position = {}; 732 | this._getPosition(); 733 | 734 | this.startPoint = { x: 0, y: 0 }; 735 | this.dragPoint = { x: 0, y: 0 }; 736 | 737 | this.startPosition = { ...this.position }; 738 | 739 | // set relative positioning 740 | let style = getComputedStyle( this.element ); 741 | if ( !positionValues.includes( style.position ) ) { 742 | this.element.style.position = 'relative'; 743 | } 744 | 745 | // events 746 | this.on( 'pointerDown', this.handlePointerDown ); 747 | this.on( 'pointerUp', this.handlePointerUp ); 748 | this.on( 'dragStart', this.handleDragStart ); 749 | this.on( 'dragMove', this.handleDragMove ); 750 | this.on( 'dragEnd', this.handleDragEnd ); 751 | 752 | this.setHandles(); 753 | this.enable(); 754 | }; 755 | 756 | // set this.handles and bind start events to 'em 757 | proto.setHandles = function() { 758 | let { handle } = this.options; 759 | if ( typeof handle == 'string' ) { 760 | this.handles = this.element.querySelectorAll( handle ); 761 | } else if ( typeof handle == 'object' && handle.length ) { 762 | this.handles = handle; 763 | } else if ( handle instanceof HTMLElement ) { 764 | this.handles = [ handle ]; 765 | } else { 766 | this.handles = [ this.element ]; 767 | } 768 | }; 769 | 770 | const cancelableEvents = [ 'dragStart', 'dragMove', 'dragEnd' ]; 771 | 772 | // duck-punch emitEvent to dispatch jQuery events as well 773 | let emitEvent = proto.emitEvent; 774 | proto.emitEvent = function( eventName, args ) { 775 | // do not emit cancelable events if dragging is disabled 776 | let isCanceled = !this.isEnabled && cancelableEvents.includes( eventName ); 777 | if ( isCanceled ) return; 778 | 779 | emitEvent.call( this, eventName, args ); 780 | 781 | // trigger jQuery event 782 | let jquery = window.jQuery; 783 | if ( !jquery || !this.$element ) return; 784 | // create jQuery event 785 | let event; 786 | let jqArgs = args; 787 | let isFirstArgEvent = args && args[0] instanceof Event; 788 | if ( isFirstArgEvent ) [ event, ...jqArgs ] = args; 789 | /* eslint-disable-next-line new-cap */ 790 | let $event = jquery.Event( event ); 791 | $event.type = eventName; 792 | this.$element.trigger( $event, jqArgs ); 793 | }; 794 | 795 | // -------------------------- position -------------------------- // 796 | 797 | // get x/y position from style 798 | proto._getPosition = function() { 799 | let style = getComputedStyle( this.element ); 800 | let x = this._getPositionCoord( style.left, 'width' ); 801 | let y = this._getPositionCoord( style.top, 'height' ); 802 | // clean up 'auto' or other non-integer values 803 | this.position.x = isNaN( x ) ? 0 : x; 804 | this.position.y = isNaN( y ) ? 0 : y; 805 | 806 | this._addTransformPosition( style ); 807 | }; 808 | 809 | proto._getPositionCoord = function( styleSide, measure ) { 810 | if ( styleSide.includes('%') ) { 811 | // convert percent into pixel for Safari, #75 812 | let parentSize = getSize( this.element.parentNode ); 813 | // prevent not-in-DOM element throwing bug, #131 814 | return !parentSize ? 0 : 815 | ( parseFloat( styleSide ) / 100 ) * parentSize[ measure ]; 816 | } 817 | return parseInt( styleSide, 10 ); 818 | }; 819 | 820 | // add transform: translate( x, y ) to position 821 | proto._addTransformPosition = function( style ) { 822 | let transform = style.transform; 823 | // bail out if value is 'none' 824 | if ( !transform.startsWith('matrix') ) return; 825 | 826 | // split matrix(1, 0, 0, 1, x, y) 827 | let matrixValues = transform.split(','); 828 | // translate X value is in 12th or 4th position 829 | let xIndex = transform.startsWith('matrix3d') ? 12 : 4; 830 | let translateX = parseInt( matrixValues[ xIndex ], 10 ); 831 | // translate Y value is in 13th or 5th position 832 | let translateY = parseInt( matrixValues[ xIndex + 1 ], 10 ); 833 | this.position.x += translateX; 834 | this.position.y += translateY; 835 | }; 836 | 837 | // -------------------------- events -------------------------- // 838 | 839 | proto.handlePointerDown = function( event, pointer ) { 840 | if ( !this.isEnabled ) return; 841 | // track start event position 842 | // Safari 9 overrides pageX and pageY. These values needs to be copied. flickity#842 843 | this.pointerDownPointer = { 844 | pageX: pointer.pageX, 845 | pageY: pointer.pageY, 846 | }; 847 | 848 | event.preventDefault(); 849 | document.activeElement.blur(); 850 | // bind move and end events 851 | this.bindActivePointerEvents( event ); 852 | this.element.classList.add('is-pointer-down'); 853 | }; 854 | 855 | proto.handleDragStart = function() { 856 | if ( !this.isEnabled ) return; 857 | 858 | this._getPosition(); 859 | this.measureContainment(); 860 | // position _when_ drag began 861 | this.startPosition.x = this.position.x; 862 | this.startPosition.y = this.position.y; 863 | // reset left/top style 864 | this.setLeftTop(); 865 | 866 | this.dragPoint.x = 0; 867 | this.dragPoint.y = 0; 868 | 869 | this.element.classList.add('is-dragging'); 870 | // start animation 871 | this.animate(); 872 | }; 873 | 874 | proto.measureContainment = function() { 875 | let container = this.getContainer(); 876 | if ( !container ) return; 877 | 878 | let elemSize = getSize( this.element ); 879 | let containerSize = getSize( container ); 880 | let { 881 | borderLeftWidth, 882 | borderRightWidth, 883 | borderTopWidth, 884 | borderBottomWidth, 885 | } = containerSize; 886 | let elemRect = this.element.getBoundingClientRect(); 887 | let containerRect = container.getBoundingClientRect(); 888 | 889 | let borderSizeX = borderLeftWidth + borderRightWidth; 890 | let borderSizeY = borderTopWidth + borderBottomWidth; 891 | 892 | let position = this.relativeStartPosition = { 893 | x: elemRect.left - ( containerRect.left + borderLeftWidth ), 894 | y: elemRect.top - ( containerRect.top + borderTopWidth ), 895 | }; 896 | 897 | this.containSize = { 898 | width: ( containerSize.width - borderSizeX ) - position.x - elemSize.width, 899 | height: ( containerSize.height - borderSizeY ) - position.y - elemSize.height, 900 | }; 901 | }; 902 | 903 | proto.getContainer = function() { 904 | let containment = this.options.containment; 905 | if ( !containment ) return; 906 | 907 | let isElement = containment instanceof HTMLElement; 908 | // use as element 909 | if ( isElement ) return containment; 910 | 911 | // querySelector if string 912 | if ( typeof containment == 'string' ) { 913 | return document.querySelector( containment ); 914 | } 915 | // fallback to parent element 916 | return this.element.parentNode; 917 | }; 918 | 919 | // ----- move event ----- // 920 | 921 | /** 922 | * drag move 923 | * @param {Event} event 924 | * @param {Event | Touch} pointer 925 | * @param {Object} moveVector - x and y coordinates 926 | */ 927 | proto.handleDragMove = function( event, pointer, moveVector ) { 928 | if ( !this.isEnabled ) return; 929 | 930 | let dragX = moveVector.x; 931 | let dragY = moveVector.y; 932 | 933 | let grid = this.options.grid; 934 | let gridX = grid && grid[0]; 935 | let gridY = grid && grid[1]; 936 | 937 | dragX = applyGrid( dragX, gridX ); 938 | dragY = applyGrid( dragY, gridY ); 939 | 940 | dragX = this.containDrag( 'x', dragX, gridX ); 941 | dragY = this.containDrag( 'y', dragY, gridY ); 942 | 943 | // constrain to axis 944 | dragX = this.options.axis == 'y' ? 0 : dragX; 945 | dragY = this.options.axis == 'x' ? 0 : dragY; 946 | 947 | this.position.x = this.startPosition.x + dragX; 948 | this.position.y = this.startPosition.y + dragY; 949 | // set dragPoint properties 950 | this.dragPoint.x = dragX; 951 | this.dragPoint.y = dragY; 952 | }; 953 | 954 | function applyGrid( value, grid, method ) { 955 | if ( !grid ) return value; 956 | 957 | method = method || 'round'; 958 | return Math[ method ]( value/grid ) * grid; 959 | } 960 | 961 | proto.containDrag = function( axis, drag, grid ) { 962 | if ( !this.options.containment ) return drag; 963 | 964 | let measure = axis == 'x' ? 'width' : 'height'; 965 | 966 | let rel = this.relativeStartPosition[ axis ]; 967 | let min = applyGrid( -rel, grid, 'ceil' ); 968 | let max = this.containSize[ measure ]; 969 | max = applyGrid( max, grid, 'floor' ); 970 | return Math.max( min, Math.min( max, drag ) ); 971 | }; 972 | 973 | // ----- end event ----- // 974 | 975 | proto.handlePointerUp = function() { 976 | this.element.classList.remove('is-pointer-down'); 977 | }; 978 | 979 | proto.handleDragEnd = function() { 980 | if ( !this.isEnabled ) return; 981 | 982 | // use top left position when complete 983 | this.element.style.transform = ''; 984 | this.setLeftTop(); 985 | this.element.classList.remove('is-dragging'); 986 | }; 987 | 988 | // -------------------------- animation -------------------------- // 989 | 990 | proto.animate = function() { 991 | // only render and animate if dragging 992 | if ( !this.isDragging ) return; 993 | 994 | this.positionDrag(); 995 | requestAnimationFrame( () => this.animate() ); 996 | }; 997 | 998 | // left/top positioning 999 | proto.setLeftTop = function() { 1000 | let { x, y } = this.position; 1001 | this.element.style.left = `${x}px`; 1002 | this.element.style.top = `${y}px`; 1003 | }; 1004 | 1005 | proto.positionDrag = function() { 1006 | let { x, y } = this.dragPoint; 1007 | this.element.style.transform = `translate3d(${x}px, ${y}px, 0)`; 1008 | }; 1009 | 1010 | // ----- methods ----- // 1011 | 1012 | /** 1013 | * @param {Number} x 1014 | * @param {Number} y 1015 | */ 1016 | proto.setPosition = function( x, y ) { 1017 | this.position.x = x; 1018 | this.position.y = y; 1019 | this.setLeftTop(); 1020 | }; 1021 | 1022 | proto.enable = function() { 1023 | if ( this.isEnabled ) return; 1024 | this.isEnabled = true; 1025 | this.bindHandles(); 1026 | }; 1027 | 1028 | proto.disable = function() { 1029 | if ( !this.isEnabled ) return; 1030 | this.isEnabled = false; 1031 | if ( this.isDragging ) this.dragEnd(); 1032 | this.unbindHandles(); 1033 | }; 1034 | 1035 | const resetCssProperties = [ 'transform', 'left', 'top', 'position' ]; 1036 | 1037 | proto.destroy = function() { 1038 | this.disable(); 1039 | // reset styles 1040 | resetCssProperties.forEach( ( prop ) => { 1041 | this.element.style[ prop ] = ''; 1042 | } ); 1043 | // unbind handles 1044 | this.unbindHandles(); 1045 | // remove jQuery data 1046 | if ( this.$element ) this.$element.removeData('draggabilly'); 1047 | }; 1048 | 1049 | // ----- jQuery bridget ----- // 1050 | 1051 | // required for jQuery bridget 1052 | proto._init = noop; 1053 | 1054 | if ( jQuery && jQuery.bridget ) { 1055 | jQuery.bridget( 'draggabilly', Draggabilly ); 1056 | } 1057 | 1058 | // ----- ----- // 1059 | 1060 | return Draggabilly; 1061 | 1062 | } ) ); 1063 | -------------------------------------------------------------------------------- /dist/draggabilly.pkgd.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Draggabilly PACKAGED v3.0.0 3 | * Make that shiz draggable 4 | * https://draggabilly.desandro.com 5 | * MIT license 6 | */ 7 | !function(t,i){"function"==typeof define&&define.amd?define(["jquery"],(function(e){return i(t,e)})):"object"==typeof module&&module.exports?module.exports=i(t,require("jquery")):t.jQueryBridget=i(t,t.jQuery)}(window,(function(t,i){"use strict";var e=Array.prototype.slice,n=t.console,o=void 0===n?function(){}:function(t){n.error(t)};function s(n,s,h){function a(t,i,e){var s,r="$()."+n+'("'+i+'")';return t.each((function(t,a){var d=h.data(a,n);if(d){var u=d[i];if(u&&"_"!=i.charAt(0)){var l=u.apply(d,e);s=void 0===s?l:s}else o(r+" is not a valid method")}else o(n+" not initialized. Cannot call methods, i.e. "+r)})),void 0!==s?s:t}function d(t,i){t.each((function(t,e){var o=h.data(e,n);o?(o.option(i),o._init()):(o=new s(e,i),h.data(e,n,o))}))}(h=h||i||t.jQuery)&&(s.prototype.option||(s.prototype.option=function(t){h.isPlainObject(t)&&(this.options=h.extend(!0,this.options,t))}),h.fn[n]=function(t){if("string"==typeof t){var i=e.call(arguments,1);return a(this,t,i)}return d(this,t),this},r(h))}function r(t){!t||t&&t.bridget||(t.bridget=s)}return r(i||t.jQuery),s})), 8 | /*! 9 | * Infinite Scroll v2.0.4 10 | * measure size of elements 11 | * MIT license 12 | */ 13 | function(t,i){"object"==typeof module&&module.exports?module.exports=i():t.getSize=i()}(window,(function(){function t(t){let i=parseFloat(t);return-1==t.indexOf("%")&&!isNaN(i)&&i}let i=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"];i.length;return function(e){if("string"==typeof e&&(e=document.querySelector(e)),!(e&&"object"==typeof e&&e.nodeType))return;let n=getComputedStyle(e);if("none"==n.display)return function(){let t={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0};return i.forEach((i=>{t[i]=0})),t}();let o={};o.width=e.offsetWidth,o.height=e.offsetHeight;let s=o.isBorderBox="border-box"==n.boxSizing;i.forEach((t=>{let i=n[t],e=parseFloat(i);o[t]=isNaN(e)?0:e}));let r=o.paddingLeft+o.paddingRight,h=o.paddingTop+o.paddingBottom,a=o.marginLeft+o.marginRight,d=o.marginTop+o.marginBottom,u=o.borderLeftWidth+o.borderRightWidth,l=o.borderTopWidth+o.borderBottomWidth,c=t(n.width);!1!==c&&(o.width=c+(s?0:r+u));let p=t(n.height);return!1!==p&&(o.height=p+(s?0:h+l)),o.innerWidth=o.width-(r+u),o.innerHeight=o.height-(h+l),o.outerWidth=o.width+a,o.outerHeight=o.height+d,o}})),function(t,i){"object"==typeof module&&module.exports?module.exports=i():t.EvEmitter=i()}("undefined"!=typeof window?window:this,(function(){function t(){}let i=t.prototype;return i.on=function(t,i){if(!t||!i)return this;let e=this._events=this._events||{},n=e[t]=e[t]||[];return n.includes(i)||n.push(i),this},i.once=function(t,i){if(!t||!i)return this;this.on(t,i);let e=this._onceEvents=this._onceEvents||{};return(e[t]=e[t]||{})[i]=!0,this},i.off=function(t,i){let e=this._events&&this._events[t];if(!e||!e.length)return this;let n=e.indexOf(i);return-1!=n&&e.splice(n,1),this},i.emitEvent=function(t,i){let e=this._events&&this._events[t];if(!e||!e.length)return this;e=e.slice(0),i=i||[];let n=this._onceEvents&&this._onceEvents[t];for(let o of e){n&&n[o]&&(this.off(t,o),delete n[o]),o.apply(this,i)}return this},i.allOff=function(){return delete this._events,delete this._onceEvents,this},t})), 14 | /*! 15 | * Unidragger v3.0.0 16 | * Draggable base class 17 | * MIT license 18 | */ 19 | function(t,i){"object"==typeof module&&module.exports?module.exports=i(t,require("ev-emitter")):t.Unidragger=i(t,t.EvEmitter)}("undefined"!=typeof window?window:this,(function(t,i){function e(){}let n,o,s=e.prototype=Object.create(i.prototype);s.handleEvent=function(t){let i="on"+t.type;this[i]&&this[i](t)},"ontouchstart"in t?(n="touchstart",o=["touchmove","touchend","touchcancel"]):t.PointerEvent?(n="pointerdown",o=["pointermove","pointerup","pointercancel"]):(n="mousedown",o=["mousemove","mouseup"]),s.touchActionValue="none",s.bindHandles=function(){this._bindHandles("addEventListener",this.touchActionValue)},s.unbindHandles=function(){this._bindHandles("removeEventListener","")},s._bindHandles=function(i,e){this.handles.forEach((o=>{o[i](n,this),o[i]("click",this),t.PointerEvent&&(o.style.touchAction=e)}))},s.bindActivePointerEvents=function(){o.forEach((i=>{t.addEventListener(i,this)}))},s.unbindActivePointerEvents=function(){o.forEach((i=>{t.removeEventListener(i,this)}))},s.withPointer=function(t,i){i.pointerId==this.pointerIdentifier&&this[t](i,i)},s.withTouch=function(t,i){let e;for(let t of i.changedTouches)t.identifier==this.pointerIdentifier&&(e=t);e&&this[t](i,e)},s.onmousedown=function(t){this.pointerDown(t,t)},s.ontouchstart=function(t){this.pointerDown(t,t.changedTouches[0])},s.onpointerdown=function(t){this.pointerDown(t,t)};const r=["TEXTAREA","INPUT","SELECT","OPTION"],h=["radio","checkbox","button","submit","image","file"];return s.pointerDown=function(t,i){let e=r.includes(t.target.nodeName),n=h.includes(t.target.type),o=!e||n;!this.isPointerDown&&!t.button&&o&&(this.isPointerDown=!0,this.pointerIdentifier=void 0!==i.pointerId?i.pointerId:i.identifier,this.pointerDown(t,i),this.bindActivePointerEvents(),this.emitEvent("pointerDown",[t,i]))},s.onmousemove=function(t){this.pointerMove(t,t)},s.onpointermove=function(t){this.withPointer("pointerMove",t)},s.ontouchmove=function(t){this.withTouch("pointerMove",t)},s.pointerMove=function(t,i){let e={x:i.pageX-this.pointerDownPointer.pageX,y:i.pageY-this.pointerDownPointer.pageY};this.emitEvent("pointerMove",[t,i,e]),!this.isDragging&&this.hasDragStarted(e)&&this.dragStart(t,i),this.isDragging&&this.dragMove(t,i,e)},s.hasDragStarted=function(t){return Math.abs(t.x)>3||Math.abs(t.y)>3},s.dragStart=function(t,i){this.isDragging=!0,this.isPreventingClicks=!0,this.emitEvent("dragStart",[t,i])},s.dragMove=function(t,i,e){this.emitEvent("dragMove",[t,i,e])},s.onmouseup=function(t){this.pointerUp(t,t)},s.onpointerup=function(t){this.withPointer("pointerUp",t)},s.ontouchend=function(t){this.withTouch("pointerUp",t)},s.pointerUp=function(t,i){this.pointerDone(),this.emitEvent("pointerUp",[t,i]),this.isDragging?this.dragEnd(t,i):this.staticClick(t,i)},s.dragEnd=function(t,i){this.isDragging=!1,setTimeout((()=>delete this.isPreventingClicks)),this.emitEvent("dragEnd",[t,i])},s.pointerDone=function(){this.isPointerDown=!1,delete this.pointerIdentifier,this.unbindActivePointerEvents(),this.emitEvent("pointerDone")},s.onpointercancel=function(t){this.withPointer("pointerCancel",t)},s.ontouchcancel=function(t){this.withTouch("pointerCancel",t)},s.pointerCancel=function(t,i){this.pointerDone(),this.emitEvent("pointerCancel",[t,i])},s.onclick=function(t){this.isPreventingClicks&&t.preventDefault()},s.staticClick=function(t,i){let e="mouseup"==t.type;e&&this.isIgnoringMouseUp||(this.emitEvent("staticClick",[t,i]),e&&(this.isIgnoringMouseUp=!0,setTimeout((()=>{delete this.isIgnoringMouseUp}),400)))},e})), 20 | /*! 21 | * Draggabilly v3.0.0 22 | * Make that shiz draggable 23 | * https://draggabilly.desandro.com 24 | * MIT license 25 | */ 26 | function(t,i){"object"==typeof module&&module.exports?module.exports=i(t,require("get-size"),require("unidragger")):t.Draggabilly=i(t,t.getSize,t.Unidragger)}("undefined"!=typeof window?window:this,(function(t,i,e){let n=t.jQuery;function o(t,i){this.element="string"==typeof t?document.querySelector(t):t,n&&(this.$element=n(this.element)),this.options={},this.option(i),this._create()}let s=o.prototype=Object.create(e.prototype);s.option=function(t){this.options={...this.options,...t}};const r=["relative","absolute","fixed"];s._create=function(){this.position={},this._getPosition(),this.startPoint={x:0,y:0},this.dragPoint={x:0,y:0},this.startPosition={...this.position};let t=getComputedStyle(this.element);r.includes(t.position)||(this.element.style.position="relative"),this.on("pointerDown",this.handlePointerDown),this.on("pointerUp",this.handlePointerUp),this.on("dragStart",this.handleDragStart),this.on("dragMove",this.handleDragMove),this.on("dragEnd",this.handleDragEnd),this.setHandles(),this.enable()},s.setHandles=function(){let{handle:t}=this.options;"string"==typeof t?this.handles=this.element.querySelectorAll(t):"object"==typeof t&&t.length?this.handles=t:t instanceof HTMLElement?this.handles=[t]:this.handles=[this.element]};const h=["dragStart","dragMove","dragEnd"];let a=s.emitEvent;function d(t,i,e){return i?(e=e||"round",Math[e](t/i)*i):t}s.emitEvent=function(i,e){if(!this.isEnabled&&h.includes(i))return;a.call(this,i,e);let n,o=t.jQuery;if(!o||!this.$element)return;let s=e;e&&e[0]instanceof Event&&([n,...s]=e);let r=o.Event(n);r.type=i,this.$element.trigger(r,s)},s._getPosition=function(){let t=getComputedStyle(this.element),i=this._getPositionCoord(t.left,"width"),e=this._getPositionCoord(t.top,"height");this.position.x=isNaN(i)?0:i,this.position.y=isNaN(e)?0:e,this._addTransformPosition(t)},s._getPositionCoord=function(t,e){if(t.includes("%")){let n=i(this.element.parentNode);return n?parseFloat(t)/100*n[e]:0}return parseInt(t,10)},s._addTransformPosition=function(t){let i=t.transform;if(!i.startsWith("matrix"))return;let e=i.split(","),n=i.startsWith("matrix3d")?12:4,o=parseInt(e[n],10),s=parseInt(e[n+1],10);this.position.x+=o,this.position.y+=s},s.handlePointerDown=function(t,i){this.isEnabled&&(this.pointerDownPointer={pageX:i.pageX,pageY:i.pageY},t.preventDefault(),document.activeElement.blur(),this.bindActivePointerEvents(t),this.element.classList.add("is-pointer-down"))},s.handleDragStart=function(){this.isEnabled&&(this._getPosition(),this.measureContainment(),this.startPosition.x=this.position.x,this.startPosition.y=this.position.y,this.setLeftTop(),this.dragPoint.x=0,this.dragPoint.y=0,this.element.classList.add("is-dragging"),this.animate())},s.measureContainment=function(){let t=this.getContainer();if(!t)return;let e=i(this.element),n=i(t),{borderLeftWidth:o,borderRightWidth:s,borderTopWidth:r,borderBottomWidth:h}=n,a=this.element.getBoundingClientRect(),d=t.getBoundingClientRect(),u=o+s,l=r+h,c=this.relativeStartPosition={x:a.left-(d.left+o),y:a.top-(d.top+r)};this.containSize={width:n.width-u-c.x-e.width,height:n.height-l-c.y-e.height}},s.getContainer=function(){let t=this.options.containment;if(t)return t instanceof HTMLElement?t:"string"==typeof t?document.querySelector(t):this.element.parentNode},s.handleDragMove=function(t,i,e){if(!this.isEnabled)return;let n=e.x,o=e.y,s=this.options.grid,r=s&&s[0],h=s&&s[1];n=d(n,r),o=d(o,h),n=this.containDrag("x",n,r),o=this.containDrag("y",o,h),n="y"==this.options.axis?0:n,o="x"==this.options.axis?0:o,this.position.x=this.startPosition.x+n,this.position.y=this.startPosition.y+o,this.dragPoint.x=n,this.dragPoint.y=o},s.containDrag=function(t,i,e){if(!this.options.containment)return i;let n="x"==t?"width":"height",o=d(-this.relativeStartPosition[t],e,"ceil"),s=this.containSize[n];return s=d(s,e,"floor"),Math.max(o,Math.min(s,i))},s.handlePointerUp=function(){this.element.classList.remove("is-pointer-down")},s.handleDragEnd=function(){this.isEnabled&&(this.element.style.transform="",this.setLeftTop(),this.element.classList.remove("is-dragging"))},s.animate=function(){this.isDragging&&(this.positionDrag(),requestAnimationFrame((()=>this.animate())))},s.setLeftTop=function(){let{x:t,y:i}=this.position;this.element.style.left=`${t}px`,this.element.style.top=`${i}px`},s.positionDrag=function(){let{x:t,y:i}=this.dragPoint;this.element.style.transform=`translate3d(${t}px, ${i}px, 0)`},s.setPosition=function(t,i){this.position.x=t,this.position.y=i,this.setLeftTop()},s.enable=function(){this.isEnabled||(this.isEnabled=!0,this.bindHandles())},s.disable=function(){this.isEnabled&&(this.isEnabled=!1,this.isDragging&&this.dragEnd(),this.unbindHandles())};const u=["transform","left","top","position"];return s.destroy=function(){this.disable(),u.forEach((t=>{this.element.style[t]=""})),this.unbindHandles(),this.$element&&this.$element.removeData("draggabilly")},s._init=function(){},n&&n.bridget&&n.bridget("draggabilly",o),o})); -------------------------------------------------------------------------------- /draggabilly.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Draggabilly v3.0.0 3 | * Make that shiz draggable 4 | * https://draggabilly.desandro.com 5 | * MIT license 6 | */ 7 | 8 | ( function( window, factory ) { 9 | // universal module definition 10 | if ( typeof module == 'object' && module.exports ) { 11 | // CommonJS 12 | module.exports = factory( 13 | window, 14 | require('get-size'), 15 | require('unidragger'), 16 | ); 17 | } else { 18 | // browser global 19 | window.Draggabilly = factory( 20 | window, 21 | window.getSize, 22 | window.Unidragger, 23 | ); 24 | } 25 | 26 | }( typeof window != 'undefined' ? window : this, 27 | function factory( window, getSize, Unidragger ) { 28 | 29 | // -------------------------- helpers & variables -------------------------- // 30 | 31 | function noop() {} 32 | 33 | let jQuery = window.jQuery; 34 | 35 | // -------------------------- Draggabilly -------------------------- // 36 | 37 | function Draggabilly( element, options ) { 38 | // querySelector if string 39 | this.element = typeof element == 'string' ? 40 | document.querySelector( element ) : element; 41 | 42 | if ( jQuery ) { 43 | this.$element = jQuery( this.element ); 44 | } 45 | 46 | // options 47 | this.options = {}; 48 | this.option( options ); 49 | 50 | this._create(); 51 | } 52 | 53 | // inherit Unidragger methods 54 | let proto = Draggabilly.prototype = Object.create( Unidragger.prototype ); 55 | 56 | /** 57 | * set options 58 | * @param {Object} opts 59 | */ 60 | proto.option = function( opts ) { 61 | this.options = { 62 | ...this.options, 63 | ...opts, 64 | }; 65 | }; 66 | 67 | // css position values that don't need to be set 68 | const positionValues = [ 'relative', 'absolute', 'fixed' ]; 69 | 70 | proto._create = function() { 71 | // properties 72 | this.position = {}; 73 | this._getPosition(); 74 | 75 | this.startPoint = { x: 0, y: 0 }; 76 | this.dragPoint = { x: 0, y: 0 }; 77 | 78 | this.startPosition = { ...this.position }; 79 | 80 | // set relative positioning 81 | let style = getComputedStyle( this.element ); 82 | if ( !positionValues.includes( style.position ) ) { 83 | this.element.style.position = 'relative'; 84 | } 85 | 86 | // events 87 | this.on( 'pointerDown', this.handlePointerDown ); 88 | this.on( 'pointerUp', this.handlePointerUp ); 89 | this.on( 'dragStart', this.handleDragStart ); 90 | this.on( 'dragMove', this.handleDragMove ); 91 | this.on( 'dragEnd', this.handleDragEnd ); 92 | 93 | this.setHandles(); 94 | this.enable(); 95 | }; 96 | 97 | // set this.handles and bind start events to 'em 98 | proto.setHandles = function() { 99 | let { handle } = this.options; 100 | if ( typeof handle == 'string' ) { 101 | this.handles = this.element.querySelectorAll( handle ); 102 | } else if ( typeof handle == 'object' && handle.length ) { 103 | this.handles = handle; 104 | } else if ( handle instanceof HTMLElement ) { 105 | this.handles = [ handle ]; 106 | } else { 107 | this.handles = [ this.element ]; 108 | } 109 | }; 110 | 111 | const cancelableEvents = [ 'dragStart', 'dragMove', 'dragEnd' ]; 112 | 113 | // duck-punch emitEvent to dispatch jQuery events as well 114 | let emitEvent = proto.emitEvent; 115 | proto.emitEvent = function( eventName, args ) { 116 | // do not emit cancelable events if dragging is disabled 117 | let isCanceled = !this.isEnabled && cancelableEvents.includes( eventName ); 118 | if ( isCanceled ) return; 119 | 120 | emitEvent.call( this, eventName, args ); 121 | 122 | // trigger jQuery event 123 | let jquery = window.jQuery; 124 | if ( !jquery || !this.$element ) return; 125 | // create jQuery event 126 | let event; 127 | let jqArgs = args; 128 | let isFirstArgEvent = args && args[0] instanceof Event; 129 | if ( isFirstArgEvent ) [ event, ...jqArgs ] = args; 130 | /* eslint-disable-next-line new-cap */ 131 | let $event = jquery.Event( event ); 132 | $event.type = eventName; 133 | this.$element.trigger( $event, jqArgs ); 134 | }; 135 | 136 | // -------------------------- position -------------------------- // 137 | 138 | // get x/y position from style 139 | proto._getPosition = function() { 140 | let style = getComputedStyle( this.element ); 141 | let x = this._getPositionCoord( style.left, 'width' ); 142 | let y = this._getPositionCoord( style.top, 'height' ); 143 | // clean up 'auto' or other non-integer values 144 | this.position.x = isNaN( x ) ? 0 : x; 145 | this.position.y = isNaN( y ) ? 0 : y; 146 | 147 | this._addTransformPosition( style ); 148 | }; 149 | 150 | proto._getPositionCoord = function( styleSide, measure ) { 151 | if ( styleSide.includes('%') ) { 152 | // convert percent into pixel for Safari, #75 153 | let parentSize = getSize( this.element.parentNode ); 154 | // prevent not-in-DOM element throwing bug, #131 155 | return !parentSize ? 0 : 156 | ( parseFloat( styleSide ) / 100 ) * parentSize[ measure ]; 157 | } 158 | return parseInt( styleSide, 10 ); 159 | }; 160 | 161 | // add transform: translate( x, y ) to position 162 | proto._addTransformPosition = function( style ) { 163 | let transform = style.transform; 164 | // bail out if value is 'none' 165 | if ( !transform.startsWith('matrix') ) return; 166 | 167 | // split matrix(1, 0, 0, 1, x, y) 168 | let matrixValues = transform.split(','); 169 | // translate X value is in 12th or 4th position 170 | let xIndex = transform.startsWith('matrix3d') ? 12 : 4; 171 | let translateX = parseInt( matrixValues[ xIndex ], 10 ); 172 | // translate Y value is in 13th or 5th position 173 | let translateY = parseInt( matrixValues[ xIndex + 1 ], 10 ); 174 | this.position.x += translateX; 175 | this.position.y += translateY; 176 | }; 177 | 178 | // -------------------------- events -------------------------- // 179 | 180 | proto.handlePointerDown = function( event, pointer ) { 181 | if ( !this.isEnabled ) return; 182 | // track start event position 183 | // Safari 9 overrides pageX and pageY. These values needs to be copied. flickity#842 184 | this.pointerDownPointer = { 185 | pageX: pointer.pageX, 186 | pageY: pointer.pageY, 187 | }; 188 | 189 | event.preventDefault(); 190 | document.activeElement.blur(); 191 | // bind move and end events 192 | this.bindActivePointerEvents( event ); 193 | this.element.classList.add('is-pointer-down'); 194 | }; 195 | 196 | proto.handleDragStart = function() { 197 | if ( !this.isEnabled ) return; 198 | 199 | this._getPosition(); 200 | this.measureContainment(); 201 | // position _when_ drag began 202 | this.startPosition.x = this.position.x; 203 | this.startPosition.y = this.position.y; 204 | // reset left/top style 205 | this.setLeftTop(); 206 | 207 | this.dragPoint.x = 0; 208 | this.dragPoint.y = 0; 209 | 210 | this.element.classList.add('is-dragging'); 211 | // start animation 212 | this.animate(); 213 | }; 214 | 215 | proto.measureContainment = function() { 216 | let container = this.getContainer(); 217 | if ( !container ) return; 218 | 219 | let elemSize = getSize( this.element ); 220 | let containerSize = getSize( container ); 221 | let { 222 | borderLeftWidth, 223 | borderRightWidth, 224 | borderTopWidth, 225 | borderBottomWidth, 226 | } = containerSize; 227 | let elemRect = this.element.getBoundingClientRect(); 228 | let containerRect = container.getBoundingClientRect(); 229 | 230 | let borderSizeX = borderLeftWidth + borderRightWidth; 231 | let borderSizeY = borderTopWidth + borderBottomWidth; 232 | 233 | let position = this.relativeStartPosition = { 234 | x: elemRect.left - ( containerRect.left + borderLeftWidth ), 235 | y: elemRect.top - ( containerRect.top + borderTopWidth ), 236 | }; 237 | 238 | this.containSize = { 239 | width: ( containerSize.width - borderSizeX ) - position.x - elemSize.width, 240 | height: ( containerSize.height - borderSizeY ) - position.y - elemSize.height, 241 | }; 242 | }; 243 | 244 | proto.getContainer = function() { 245 | let containment = this.options.containment; 246 | if ( !containment ) return; 247 | 248 | let isElement = containment instanceof HTMLElement; 249 | // use as element 250 | if ( isElement ) return containment; 251 | 252 | // querySelector if string 253 | if ( typeof containment == 'string' ) { 254 | return document.querySelector( containment ); 255 | } 256 | // fallback to parent element 257 | return this.element.parentNode; 258 | }; 259 | 260 | // ----- move event ----- // 261 | 262 | /** 263 | * drag move 264 | * @param {Event} event 265 | * @param {Event | Touch} pointer 266 | * @param {Object} moveVector - x and y coordinates 267 | */ 268 | proto.handleDragMove = function( event, pointer, moveVector ) { 269 | if ( !this.isEnabled ) return; 270 | 271 | let dragX = moveVector.x; 272 | let dragY = moveVector.y; 273 | 274 | let grid = this.options.grid; 275 | let gridX = grid && grid[0]; 276 | let gridY = grid && grid[1]; 277 | 278 | dragX = applyGrid( dragX, gridX ); 279 | dragY = applyGrid( dragY, gridY ); 280 | 281 | dragX = this.containDrag( 'x', dragX, gridX ); 282 | dragY = this.containDrag( 'y', dragY, gridY ); 283 | 284 | // constrain to axis 285 | dragX = this.options.axis == 'y' ? 0 : dragX; 286 | dragY = this.options.axis == 'x' ? 0 : dragY; 287 | 288 | this.position.x = this.startPosition.x + dragX; 289 | this.position.y = this.startPosition.y + dragY; 290 | // set dragPoint properties 291 | this.dragPoint.x = dragX; 292 | this.dragPoint.y = dragY; 293 | }; 294 | 295 | function applyGrid( value, grid, method ) { 296 | if ( !grid ) return value; 297 | 298 | method = method || 'round'; 299 | return Math[ method ]( value/grid ) * grid; 300 | } 301 | 302 | proto.containDrag = function( axis, drag, grid ) { 303 | if ( !this.options.containment ) return drag; 304 | 305 | let measure = axis == 'x' ? 'width' : 'height'; 306 | 307 | let rel = this.relativeStartPosition[ axis ]; 308 | let min = applyGrid( -rel, grid, 'ceil' ); 309 | let max = this.containSize[ measure ]; 310 | max = applyGrid( max, grid, 'floor' ); 311 | return Math.max( min, Math.min( max, drag ) ); 312 | }; 313 | 314 | // ----- end event ----- // 315 | 316 | proto.handlePointerUp = function() { 317 | this.element.classList.remove('is-pointer-down'); 318 | }; 319 | 320 | proto.handleDragEnd = function() { 321 | if ( !this.isEnabled ) return; 322 | 323 | // use top left position when complete 324 | this.element.style.transform = ''; 325 | this.setLeftTop(); 326 | this.element.classList.remove('is-dragging'); 327 | }; 328 | 329 | // -------------------------- animation -------------------------- // 330 | 331 | proto.animate = function() { 332 | // only render and animate if dragging 333 | if ( !this.isDragging ) return; 334 | 335 | this.positionDrag(); 336 | requestAnimationFrame( () => this.animate() ); 337 | }; 338 | 339 | // left/top positioning 340 | proto.setLeftTop = function() { 341 | let { x, y } = this.position; 342 | this.element.style.left = `${x}px`; 343 | this.element.style.top = `${y}px`; 344 | }; 345 | 346 | proto.positionDrag = function() { 347 | let { x, y } = this.dragPoint; 348 | this.element.style.transform = `translate3d(${x}px, ${y}px, 0)`; 349 | }; 350 | 351 | // ----- methods ----- // 352 | 353 | /** 354 | * @param {Number} x 355 | * @param {Number} y 356 | */ 357 | proto.setPosition = function( x, y ) { 358 | this.position.x = x; 359 | this.position.y = y; 360 | this.setLeftTop(); 361 | }; 362 | 363 | proto.enable = function() { 364 | if ( this.isEnabled ) return; 365 | this.isEnabled = true; 366 | this.bindHandles(); 367 | }; 368 | 369 | proto.disable = function() { 370 | if ( !this.isEnabled ) return; 371 | this.isEnabled = false; 372 | if ( this.isDragging ) this.dragEnd(); 373 | this.unbindHandles(); 374 | }; 375 | 376 | const resetCssProperties = [ 'transform', 'left', 'top', 'position' ]; 377 | 378 | proto.destroy = function() { 379 | this.disable(); 380 | // reset styles 381 | resetCssProperties.forEach( ( prop ) => { 382 | this.element.style[ prop ] = ''; 383 | } ); 384 | // unbind handles 385 | this.unbindHandles(); 386 | // remove jQuery data 387 | if ( this.$element ) this.$element.removeData('draggabilly'); 388 | }; 389 | 390 | // ----- jQuery bridget ----- // 391 | 392 | // required for jQuery bridget 393 | proto._init = noop; 394 | 395 | if ( jQuery && jQuery.bridget ) { 396 | jQuery.bridget( 'draggabilly', Draggabilly ); 397 | } 398 | 399 | // ----- ----- // 400 | 401 | return Draggabilly; 402 | 403 | } ) ); 404 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "draggabilly", 3 | "version": "3.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "version": "3.0.0", 9 | "license": "MIT", 10 | "dependencies": { 11 | "get-size": "^3.0.0", 12 | "unidragger": "^3.0.0" 13 | }, 14 | "devDependencies": { 15 | "eslint": "^7.0.0", 16 | "eslint-plugin-metafizzy": "^1.0.0", 17 | "jquery-bridget": "^2.0.1", 18 | "qunit": "^2.10.0", 19 | "terser": "^5.10.0" 20 | } 21 | }, 22 | "node_modules/@babel/code-frame": { 23 | "version": "7.12.11", 24 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", 25 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", 26 | "dev": true, 27 | "dependencies": { 28 | "@babel/highlight": "^7.10.4" 29 | } 30 | }, 31 | "node_modules/@babel/helper-validator-identifier": { 32 | "version": "7.15.7", 33 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", 34 | "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", 35 | "dev": true, 36 | "engines": { 37 | "node": ">=6.9.0" 38 | } 39 | }, 40 | "node_modules/@babel/highlight": { 41 | "version": "7.16.0", 42 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", 43 | "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", 44 | "dev": true, 45 | "dependencies": { 46 | "@babel/helper-validator-identifier": "^7.15.7", 47 | "chalk": "^2.0.0", 48 | "js-tokens": "^4.0.0" 49 | }, 50 | "engines": { 51 | "node": ">=6.9.0" 52 | } 53 | }, 54 | "node_modules/@eslint/eslintrc": { 55 | "version": "0.4.3", 56 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", 57 | "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", 58 | "dev": true, 59 | "dependencies": { 60 | "ajv": "^6.12.4", 61 | "debug": "^4.1.1", 62 | "espree": "^7.3.0", 63 | "globals": "^13.9.0", 64 | "ignore": "^4.0.6", 65 | "import-fresh": "^3.2.1", 66 | "js-yaml": "^3.13.1", 67 | "minimatch": "^3.0.4", 68 | "strip-json-comments": "^3.1.1" 69 | }, 70 | "engines": { 71 | "node": "^10.12.0 || >=12.0.0" 72 | } 73 | }, 74 | "node_modules/@humanwhocodes/config-array": { 75 | "version": "0.5.0", 76 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", 77 | "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", 78 | "dev": true, 79 | "dependencies": { 80 | "@humanwhocodes/object-schema": "^1.2.0", 81 | "debug": "^4.1.1", 82 | "minimatch": "^3.0.4" 83 | }, 84 | "engines": { 85 | "node": ">=10.10.0" 86 | } 87 | }, 88 | "node_modules/@humanwhocodes/object-schema": { 89 | "version": "1.2.1", 90 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 91 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 92 | "dev": true 93 | }, 94 | "node_modules/@types/color-name": { 95 | "version": "1.1.1", 96 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 97 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 98 | "dev": true 99 | }, 100 | "node_modules/acorn": { 101 | "version": "8.7.0", 102 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", 103 | "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", 104 | "dev": true, 105 | "peer": true, 106 | "bin": { 107 | "acorn": "bin/acorn" 108 | }, 109 | "engines": { 110 | "node": ">=0.4.0" 111 | } 112 | }, 113 | "node_modules/acorn-jsx": { 114 | "version": "5.3.2", 115 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 116 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 117 | "dev": true, 118 | "peerDependencies": { 119 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 120 | } 121 | }, 122 | "node_modules/ajv": { 123 | "version": "6.12.6", 124 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 125 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 126 | "dev": true, 127 | "dependencies": { 128 | "fast-deep-equal": "^3.1.1", 129 | "fast-json-stable-stringify": "^2.0.0", 130 | "json-schema-traverse": "^0.4.1", 131 | "uri-js": "^4.2.2" 132 | }, 133 | "funding": { 134 | "type": "github", 135 | "url": "https://github.com/sponsors/epoberezkin" 136 | } 137 | }, 138 | "node_modules/ansi-colors": { 139 | "version": "4.1.1", 140 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 141 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 142 | "dev": true, 143 | "engines": { 144 | "node": ">=6" 145 | } 146 | }, 147 | "node_modules/ansi-regex": { 148 | "version": "5.0.1", 149 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 150 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 151 | "dev": true, 152 | "engines": { 153 | "node": ">=8" 154 | } 155 | }, 156 | "node_modules/ansi-styles": { 157 | "version": "3.2.1", 158 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 159 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 160 | "dev": true, 161 | "dependencies": { 162 | "color-convert": "^1.9.0" 163 | }, 164 | "engines": { 165 | "node": ">=4" 166 | } 167 | }, 168 | "node_modules/argparse": { 169 | "version": "1.0.10", 170 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 171 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 172 | "dev": true, 173 | "dependencies": { 174 | "sprintf-js": "~1.0.2" 175 | } 176 | }, 177 | "node_modules/astral-regex": { 178 | "version": "2.0.0", 179 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 180 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 181 | "dev": true, 182 | "engines": { 183 | "node": ">=8" 184 | } 185 | }, 186 | "node_modules/balanced-match": { 187 | "version": "1.0.0", 188 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 189 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 190 | "dev": true 191 | }, 192 | "node_modules/brace-expansion": { 193 | "version": "1.1.11", 194 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 195 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 196 | "dev": true, 197 | "dependencies": { 198 | "balanced-match": "^1.0.0", 199 | "concat-map": "0.0.1" 200 | } 201 | }, 202 | "node_modules/buffer-from": { 203 | "version": "1.1.2", 204 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 205 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 206 | "dev": true 207 | }, 208 | "node_modules/callsites": { 209 | "version": "3.1.0", 210 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 211 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 212 | "dev": true, 213 | "engines": { 214 | "node": ">=6" 215 | } 216 | }, 217 | "node_modules/chalk": { 218 | "version": "2.4.2", 219 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 220 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 221 | "dev": true, 222 | "dependencies": { 223 | "ansi-styles": "^3.2.1", 224 | "escape-string-regexp": "^1.0.5", 225 | "supports-color": "^5.3.0" 226 | }, 227 | "engines": { 228 | "node": ">=4" 229 | } 230 | }, 231 | "node_modules/chalk/node_modules/escape-string-regexp": { 232 | "version": "1.0.5", 233 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 234 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 235 | "dev": true, 236 | "engines": { 237 | "node": ">=0.8.0" 238 | } 239 | }, 240 | "node_modules/color-convert": { 241 | "version": "1.9.3", 242 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 243 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 244 | "dev": true, 245 | "dependencies": { 246 | "color-name": "1.1.3" 247 | } 248 | }, 249 | "node_modules/color-name": { 250 | "version": "1.1.3", 251 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 252 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 253 | "dev": true 254 | }, 255 | "node_modules/commander": { 256 | "version": "2.20.3", 257 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 258 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 259 | "dev": true 260 | }, 261 | "node_modules/concat-map": { 262 | "version": "0.0.1", 263 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 264 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 265 | "dev": true 266 | }, 267 | "node_modules/cross-spawn": { 268 | "version": "7.0.2", 269 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", 270 | "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", 271 | "dev": true, 272 | "dependencies": { 273 | "path-key": "^3.1.0", 274 | "shebang-command": "^2.0.0", 275 | "which": "^2.0.1" 276 | }, 277 | "engines": { 278 | "node": ">= 8" 279 | } 280 | }, 281 | "node_modules/cross-spawn/node_modules/which": { 282 | "version": "2.0.2", 283 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 284 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 285 | "dev": true, 286 | "dependencies": { 287 | "isexe": "^2.0.0" 288 | }, 289 | "bin": { 290 | "node-which": "bin/node-which" 291 | }, 292 | "engines": { 293 | "node": ">= 8" 294 | } 295 | }, 296 | "node_modules/debug": { 297 | "version": "4.3.3", 298 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 299 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 300 | "dev": true, 301 | "dependencies": { 302 | "ms": "2.1.2" 303 | }, 304 | "engines": { 305 | "node": ">=6.0" 306 | }, 307 | "peerDependenciesMeta": { 308 | "supports-color": { 309 | "optional": true 310 | } 311 | } 312 | }, 313 | "node_modules/deep-is": { 314 | "version": "0.1.3", 315 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 316 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 317 | "dev": true 318 | }, 319 | "node_modules/doctrine": { 320 | "version": "3.0.0", 321 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 322 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 323 | "dev": true, 324 | "dependencies": { 325 | "esutils": "^2.0.2" 326 | }, 327 | "engines": { 328 | "node": ">=6.0.0" 329 | } 330 | }, 331 | "node_modules/emoji-regex": { 332 | "version": "8.0.0", 333 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 334 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 335 | "dev": true 336 | }, 337 | "node_modules/enquirer": { 338 | "version": "2.3.6", 339 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 340 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 341 | "dev": true, 342 | "dependencies": { 343 | "ansi-colors": "^4.1.1" 344 | }, 345 | "engines": { 346 | "node": ">=8.6" 347 | } 348 | }, 349 | "node_modules/escape-string-regexp": { 350 | "version": "4.0.0", 351 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 352 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 353 | "dev": true, 354 | "engines": { 355 | "node": ">=10" 356 | }, 357 | "funding": { 358 | "url": "https://github.com/sponsors/sindresorhus" 359 | } 360 | }, 361 | "node_modules/eslint": { 362 | "version": "7.32.0", 363 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", 364 | "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", 365 | "dev": true, 366 | "dependencies": { 367 | "@babel/code-frame": "7.12.11", 368 | "@eslint/eslintrc": "^0.4.3", 369 | "@humanwhocodes/config-array": "^0.5.0", 370 | "ajv": "^6.10.0", 371 | "chalk": "^4.0.0", 372 | "cross-spawn": "^7.0.2", 373 | "debug": "^4.0.1", 374 | "doctrine": "^3.0.0", 375 | "enquirer": "^2.3.5", 376 | "escape-string-regexp": "^4.0.0", 377 | "eslint-scope": "^5.1.1", 378 | "eslint-utils": "^2.1.0", 379 | "eslint-visitor-keys": "^2.0.0", 380 | "espree": "^7.3.1", 381 | "esquery": "^1.4.0", 382 | "esutils": "^2.0.2", 383 | "fast-deep-equal": "^3.1.3", 384 | "file-entry-cache": "^6.0.1", 385 | "functional-red-black-tree": "^1.0.1", 386 | "glob-parent": "^5.1.2", 387 | "globals": "^13.6.0", 388 | "ignore": "^4.0.6", 389 | "import-fresh": "^3.0.0", 390 | "imurmurhash": "^0.1.4", 391 | "is-glob": "^4.0.0", 392 | "js-yaml": "^3.13.1", 393 | "json-stable-stringify-without-jsonify": "^1.0.1", 394 | "levn": "^0.4.1", 395 | "lodash.merge": "^4.6.2", 396 | "minimatch": "^3.0.4", 397 | "natural-compare": "^1.4.0", 398 | "optionator": "^0.9.1", 399 | "progress": "^2.0.0", 400 | "regexpp": "^3.1.0", 401 | "semver": "^7.2.1", 402 | "strip-ansi": "^6.0.0", 403 | "strip-json-comments": "^3.1.0", 404 | "table": "^6.0.9", 405 | "text-table": "^0.2.0", 406 | "v8-compile-cache": "^2.0.3" 407 | }, 408 | "bin": { 409 | "eslint": "bin/eslint.js" 410 | }, 411 | "engines": { 412 | "node": "^10.12.0 || >=12.0.0" 413 | }, 414 | "funding": { 415 | "url": "https://opencollective.com/eslint" 416 | } 417 | }, 418 | "node_modules/eslint-plugin-metafizzy": { 419 | "version": "1.2.1", 420 | "resolved": "https://registry.npmjs.org/eslint-plugin-metafizzy/-/eslint-plugin-metafizzy-1.2.1.tgz", 421 | "integrity": "sha512-xl+JvruIUIqiBKAe3PcFoBPEESHjYFM08Nss57qs7P4iC392XLCUpruaGXWzy/sEwRWwH14jPp6aN1flNca6AA==", 422 | "dev": true, 423 | "peerDependencies": { 424 | "eslint": ">=6.8.0 <8.0.0" 425 | } 426 | }, 427 | "node_modules/eslint-scope": { 428 | "version": "5.1.1", 429 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 430 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 431 | "dev": true, 432 | "dependencies": { 433 | "esrecurse": "^4.3.0", 434 | "estraverse": "^4.1.1" 435 | }, 436 | "engines": { 437 | "node": ">=8.0.0" 438 | } 439 | }, 440 | "node_modules/eslint-utils": { 441 | "version": "2.1.0", 442 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 443 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 444 | "dev": true, 445 | "dependencies": { 446 | "eslint-visitor-keys": "^1.1.0" 447 | }, 448 | "engines": { 449 | "node": ">=6" 450 | }, 451 | "funding": { 452 | "url": "https://github.com/sponsors/mysticatea" 453 | } 454 | }, 455 | "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 456 | "version": "1.3.0", 457 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 458 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 459 | "dev": true, 460 | "engines": { 461 | "node": ">=4" 462 | } 463 | }, 464 | "node_modules/eslint-visitor-keys": { 465 | "version": "2.1.0", 466 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 467 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 468 | "dev": true, 469 | "engines": { 470 | "node": ">=10" 471 | } 472 | }, 473 | "node_modules/eslint/node_modules/ansi-styles": { 474 | "version": "4.2.1", 475 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 476 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 477 | "dev": true, 478 | "dependencies": { 479 | "@types/color-name": "^1.1.1", 480 | "color-convert": "^2.0.1" 481 | }, 482 | "engines": { 483 | "node": ">=8" 484 | }, 485 | "funding": { 486 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 487 | } 488 | }, 489 | "node_modules/eslint/node_modules/chalk": { 490 | "version": "4.0.0", 491 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", 492 | "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", 493 | "dev": true, 494 | "dependencies": { 495 | "ansi-styles": "^4.1.0", 496 | "supports-color": "^7.1.0" 497 | }, 498 | "engines": { 499 | "node": ">=10" 500 | }, 501 | "funding": { 502 | "url": "https://github.com/chalk/chalk?sponsor=1" 503 | } 504 | }, 505 | "node_modules/eslint/node_modules/color-convert": { 506 | "version": "2.0.1", 507 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 508 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 509 | "dev": true, 510 | "dependencies": { 511 | "color-name": "~1.1.4" 512 | }, 513 | "engines": { 514 | "node": ">=7.0.0" 515 | } 516 | }, 517 | "node_modules/eslint/node_modules/color-name": { 518 | "version": "1.1.4", 519 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 520 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 521 | "dev": true 522 | }, 523 | "node_modules/eslint/node_modules/has-flag": { 524 | "version": "4.0.0", 525 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 526 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 527 | "dev": true, 528 | "engines": { 529 | "node": ">=8" 530 | } 531 | }, 532 | "node_modules/eslint/node_modules/is-glob": { 533 | "version": "4.0.1", 534 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 535 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 536 | "dev": true, 537 | "dependencies": { 538 | "is-extglob": "^2.1.1" 539 | }, 540 | "engines": { 541 | "node": ">=0.10.0" 542 | } 543 | }, 544 | "node_modules/eslint/node_modules/semver": { 545 | "version": "7.3.2", 546 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", 547 | "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", 548 | "dev": true, 549 | "bin": { 550 | "semver": "bin/semver.js" 551 | }, 552 | "engines": { 553 | "node": ">=10" 554 | } 555 | }, 556 | "node_modules/eslint/node_modules/supports-color": { 557 | "version": "7.1.0", 558 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 559 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 560 | "dev": true, 561 | "dependencies": { 562 | "has-flag": "^4.0.0" 563 | }, 564 | "engines": { 565 | "node": ">=8" 566 | } 567 | }, 568 | "node_modules/espree": { 569 | "version": "7.3.1", 570 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", 571 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", 572 | "dev": true, 573 | "dependencies": { 574 | "acorn": "^7.4.0", 575 | "acorn-jsx": "^5.3.1", 576 | "eslint-visitor-keys": "^1.3.0" 577 | }, 578 | "engines": { 579 | "node": "^10.12.0 || >=12.0.0" 580 | } 581 | }, 582 | "node_modules/espree/node_modules/acorn": { 583 | "version": "7.4.1", 584 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 585 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 586 | "dev": true, 587 | "bin": { 588 | "acorn": "bin/acorn" 589 | }, 590 | "engines": { 591 | "node": ">=0.4.0" 592 | } 593 | }, 594 | "node_modules/espree/node_modules/eslint-visitor-keys": { 595 | "version": "1.3.0", 596 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 597 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 598 | "dev": true, 599 | "engines": { 600 | "node": ">=4" 601 | } 602 | }, 603 | "node_modules/esprima": { 604 | "version": "4.0.1", 605 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 606 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 607 | "dev": true, 608 | "bin": { 609 | "esparse": "bin/esparse.js", 610 | "esvalidate": "bin/esvalidate.js" 611 | }, 612 | "engines": { 613 | "node": ">=4" 614 | } 615 | }, 616 | "node_modules/esquery": { 617 | "version": "1.4.0", 618 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 619 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 620 | "dev": true, 621 | "dependencies": { 622 | "estraverse": "^5.1.0" 623 | }, 624 | "engines": { 625 | "node": ">=0.10" 626 | } 627 | }, 628 | "node_modules/esquery/node_modules/estraverse": { 629 | "version": "5.3.0", 630 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 631 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 632 | "dev": true, 633 | "engines": { 634 | "node": ">=4.0" 635 | } 636 | }, 637 | "node_modules/esrecurse": { 638 | "version": "4.3.0", 639 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 640 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 641 | "dev": true, 642 | "dependencies": { 643 | "estraverse": "^5.2.0" 644 | }, 645 | "engines": { 646 | "node": ">=4.0" 647 | } 648 | }, 649 | "node_modules/esrecurse/node_modules/estraverse": { 650 | "version": "5.3.0", 651 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 652 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 653 | "dev": true, 654 | "engines": { 655 | "node": ">=4.0" 656 | } 657 | }, 658 | "node_modules/estraverse": { 659 | "version": "4.3.0", 660 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 661 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 662 | "dev": true, 663 | "engines": { 664 | "node": ">=4.0" 665 | } 666 | }, 667 | "node_modules/esutils": { 668 | "version": "2.0.3", 669 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 670 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 671 | "dev": true, 672 | "engines": { 673 | "node": ">=0.10.0" 674 | } 675 | }, 676 | "node_modules/ev-emitter": { 677 | "version": "2.1.2", 678 | "resolved": "https://registry.npmjs.org/ev-emitter/-/ev-emitter-2.1.2.tgz", 679 | "integrity": "sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q==" 680 | }, 681 | "node_modules/fast-deep-equal": { 682 | "version": "3.1.3", 683 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 684 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 685 | "dev": true 686 | }, 687 | "node_modules/fast-json-stable-stringify": { 688 | "version": "2.1.0", 689 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 690 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 691 | "dev": true 692 | }, 693 | "node_modules/fast-levenshtein": { 694 | "version": "2.0.6", 695 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 696 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 697 | "dev": true 698 | }, 699 | "node_modules/file-entry-cache": { 700 | "version": "6.0.1", 701 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 702 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 703 | "dev": true, 704 | "dependencies": { 705 | "flat-cache": "^3.0.4" 706 | }, 707 | "engines": { 708 | "node": "^10.12.0 || >=12.0.0" 709 | } 710 | }, 711 | "node_modules/flat-cache": { 712 | "version": "3.0.4", 713 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 714 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 715 | "dev": true, 716 | "dependencies": { 717 | "flatted": "^3.1.0", 718 | "rimraf": "^3.0.2" 719 | }, 720 | "engines": { 721 | "node": "^10.12.0 || >=12.0.0" 722 | } 723 | }, 724 | "node_modules/flatted": { 725 | "version": "3.2.4", 726 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", 727 | "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", 728 | "dev": true 729 | }, 730 | "node_modules/fs.realpath": { 731 | "version": "1.0.0", 732 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 733 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 734 | "dev": true 735 | }, 736 | "node_modules/functional-red-black-tree": { 737 | "version": "1.0.1", 738 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 739 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 740 | "dev": true 741 | }, 742 | "node_modules/get-size": { 743 | "version": "3.0.0", 744 | "resolved": "https://registry.npmjs.org/get-size/-/get-size-3.0.0.tgz", 745 | "integrity": "sha512-Y8aiXLq4leR7807UY0yuKEwif5s3kbVp1nTv+i4jBeoUzByTLKkLWu/HorS6/pB+7gsB0o7OTogC8AoOOeT0Hw==" 746 | }, 747 | "node_modules/glob": { 748 | "version": "7.2.0", 749 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 750 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 751 | "dev": true, 752 | "dependencies": { 753 | "fs.realpath": "^1.0.0", 754 | "inflight": "^1.0.4", 755 | "inherits": "2", 756 | "minimatch": "^3.0.4", 757 | "once": "^1.3.0", 758 | "path-is-absolute": "^1.0.0" 759 | }, 760 | "engines": { 761 | "node": "*" 762 | }, 763 | "funding": { 764 | "url": "https://github.com/sponsors/isaacs" 765 | } 766 | }, 767 | "node_modules/glob-parent": { 768 | "version": "5.1.2", 769 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 770 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 771 | "dev": true, 772 | "dependencies": { 773 | "is-glob": "^4.0.1" 774 | }, 775 | "engines": { 776 | "node": ">= 6" 777 | } 778 | }, 779 | "node_modules/glob-parent/node_modules/is-glob": { 780 | "version": "4.0.1", 781 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 782 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 783 | "dev": true, 784 | "dependencies": { 785 | "is-extglob": "^2.1.1" 786 | }, 787 | "engines": { 788 | "node": ">=0.10.0" 789 | } 790 | }, 791 | "node_modules/globals": { 792 | "version": "13.12.0", 793 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", 794 | "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", 795 | "dev": true, 796 | "dependencies": { 797 | "type-fest": "^0.20.2" 798 | }, 799 | "engines": { 800 | "node": ">=8" 801 | }, 802 | "funding": { 803 | "url": "https://github.com/sponsors/sindresorhus" 804 | } 805 | }, 806 | "node_modules/has-flag": { 807 | "version": "3.0.0", 808 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 809 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 810 | "dev": true, 811 | "engines": { 812 | "node": ">=4" 813 | } 814 | }, 815 | "node_modules/ignore": { 816 | "version": "4.0.6", 817 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 818 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 819 | "dev": true, 820 | "engines": { 821 | "node": ">= 4" 822 | } 823 | }, 824 | "node_modules/import-fresh": { 825 | "version": "3.2.1", 826 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 827 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 828 | "dev": true, 829 | "dependencies": { 830 | "parent-module": "^1.0.0", 831 | "resolve-from": "^4.0.0" 832 | }, 833 | "engines": { 834 | "node": ">=6" 835 | } 836 | }, 837 | "node_modules/imurmurhash": { 838 | "version": "0.1.4", 839 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 840 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 841 | "dev": true, 842 | "engines": { 843 | "node": ">=0.8.19" 844 | } 845 | }, 846 | "node_modules/inflight": { 847 | "version": "1.0.6", 848 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 849 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 850 | "dev": true, 851 | "dependencies": { 852 | "once": "^1.3.0", 853 | "wrappy": "1" 854 | } 855 | }, 856 | "node_modules/inherits": { 857 | "version": "2.0.4", 858 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 859 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 860 | "dev": true 861 | }, 862 | "node_modules/is-extglob": { 863 | "version": "2.1.1", 864 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 865 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 866 | "dev": true, 867 | "engines": { 868 | "node": ">=0.10.0" 869 | } 870 | }, 871 | "node_modules/is-fullwidth-code-point": { 872 | "version": "3.0.0", 873 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 874 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 875 | "dev": true, 876 | "engines": { 877 | "node": ">=8" 878 | } 879 | }, 880 | "node_modules/isexe": { 881 | "version": "2.0.0", 882 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 883 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 884 | "dev": true 885 | }, 886 | "node_modules/jquery": { 887 | "version": "3.5.1", 888 | "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", 889 | "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==", 890 | "dev": true 891 | }, 892 | "node_modules/jquery-bridget": { 893 | "version": "2.0.1", 894 | "resolved": "https://registry.npmjs.org/jquery-bridget/-/jquery-bridget-2.0.1.tgz", 895 | "integrity": "sha1-eE0XqF5kF4DF2JrD+KfrR7C84fw=", 896 | "dev": true, 897 | "dependencies": { 898 | "jquery": ">=1.4.2 <4" 899 | } 900 | }, 901 | "node_modules/js-reporters": { 902 | "version": "1.2.1", 903 | "resolved": "https://registry.npmjs.org/js-reporters/-/js-reporters-1.2.1.tgz", 904 | "integrity": "sha1-+IxgjjJKM3OpW8xFrTBeXJecRZs=", 905 | "dev": true 906 | }, 907 | "node_modules/js-tokens": { 908 | "version": "4.0.0", 909 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 910 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 911 | "dev": true 912 | }, 913 | "node_modules/js-yaml": { 914 | "version": "3.13.1", 915 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 916 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 917 | "dev": true, 918 | "dependencies": { 919 | "argparse": "^1.0.7", 920 | "esprima": "^4.0.0" 921 | }, 922 | "bin": { 923 | "js-yaml": "bin/js-yaml.js" 924 | } 925 | }, 926 | "node_modules/json-schema-traverse": { 927 | "version": "0.4.1", 928 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 929 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 930 | "dev": true 931 | }, 932 | "node_modules/json-stable-stringify-without-jsonify": { 933 | "version": "1.0.1", 934 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 935 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 936 | "dev": true 937 | }, 938 | "node_modules/levn": { 939 | "version": "0.4.1", 940 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 941 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 942 | "dev": true, 943 | "dependencies": { 944 | "prelude-ls": "^1.2.1", 945 | "type-check": "~0.4.0" 946 | }, 947 | "engines": { 948 | "node": ">= 0.8.0" 949 | } 950 | }, 951 | "node_modules/lodash.merge": { 952 | "version": "4.6.2", 953 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 954 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 955 | "dev": true 956 | }, 957 | "node_modules/lodash.truncate": { 958 | "version": "4.4.2", 959 | "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", 960 | "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", 961 | "dev": true 962 | }, 963 | "node_modules/minimatch": { 964 | "version": "3.0.4", 965 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 966 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 967 | "dev": true, 968 | "dependencies": { 969 | "brace-expansion": "^1.1.7" 970 | }, 971 | "engines": { 972 | "node": "*" 973 | } 974 | }, 975 | "node_modules/ms": { 976 | "version": "2.1.2", 977 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 978 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 979 | "dev": true 980 | }, 981 | "node_modules/natural-compare": { 982 | "version": "1.4.0", 983 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 984 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 985 | "dev": true 986 | }, 987 | "node_modules/node-watch": { 988 | "version": "0.6.1", 989 | "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.6.1.tgz", 990 | "integrity": "sha512-gwQiR7weFRV8mAtT0x0kXkZ18dfRLB45xH7q0hCOVQMLfLb2f1ZaSvR57q4/b/Vj6B0RwMNJYbvb69e1yM7qEA==", 991 | "dev": true, 992 | "engines": { 993 | "node": ">=6" 994 | } 995 | }, 996 | "node_modules/once": { 997 | "version": "1.4.0", 998 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 999 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1000 | "dev": true, 1001 | "dependencies": { 1002 | "wrappy": "1" 1003 | } 1004 | }, 1005 | "node_modules/optionator": { 1006 | "version": "0.9.1", 1007 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1008 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1009 | "dev": true, 1010 | "dependencies": { 1011 | "deep-is": "^0.1.3", 1012 | "fast-levenshtein": "^2.0.6", 1013 | "levn": "^0.4.1", 1014 | "prelude-ls": "^1.2.1", 1015 | "type-check": "^0.4.0", 1016 | "word-wrap": "^1.2.3" 1017 | }, 1018 | "engines": { 1019 | "node": ">= 0.8.0" 1020 | } 1021 | }, 1022 | "node_modules/parent-module": { 1023 | "version": "1.0.1", 1024 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1025 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1026 | "dev": true, 1027 | "dependencies": { 1028 | "callsites": "^3.0.0" 1029 | }, 1030 | "engines": { 1031 | "node": ">=6" 1032 | } 1033 | }, 1034 | "node_modules/path-is-absolute": { 1035 | "version": "1.0.1", 1036 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1037 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1038 | "dev": true, 1039 | "engines": { 1040 | "node": ">=0.10.0" 1041 | } 1042 | }, 1043 | "node_modules/path-key": { 1044 | "version": "3.1.1", 1045 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1046 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1047 | "dev": true, 1048 | "engines": { 1049 | "node": ">=8" 1050 | } 1051 | }, 1052 | "node_modules/path-parse": { 1053 | "version": "1.0.7", 1054 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1055 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1056 | "dev": true 1057 | }, 1058 | "node_modules/prelude-ls": { 1059 | "version": "1.2.1", 1060 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1061 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1062 | "dev": true, 1063 | "engines": { 1064 | "node": ">= 0.8.0" 1065 | } 1066 | }, 1067 | "node_modules/progress": { 1068 | "version": "2.0.3", 1069 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1070 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1071 | "dev": true, 1072 | "engines": { 1073 | "node": ">=0.4.0" 1074 | } 1075 | }, 1076 | "node_modules/punycode": { 1077 | "version": "2.1.1", 1078 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1079 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1080 | "dev": true, 1081 | "engines": { 1082 | "node": ">=6" 1083 | } 1084 | }, 1085 | "node_modules/qunit": { 1086 | "version": "2.10.0", 1087 | "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.10.0.tgz", 1088 | "integrity": "sha512-EP9Q9Kf45z4l/X02ZJtyTQU9DBc82pEWAncSNx7Weo/73BDpX71xqbsdDAQrtEeeilK70cib7CY/lniJV6Cwwg==", 1089 | "dev": true, 1090 | "dependencies": { 1091 | "commander": "2.12.2", 1092 | "js-reporters": "1.2.1", 1093 | "minimatch": "3.0.4", 1094 | "node-watch": "0.6.1", 1095 | "resolve": "1.9.0" 1096 | }, 1097 | "bin": { 1098 | "qunit": "bin/qunit.js" 1099 | }, 1100 | "engines": { 1101 | "node": ">=6" 1102 | } 1103 | }, 1104 | "node_modules/qunit/node_modules/commander": { 1105 | "version": "2.12.2", 1106 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", 1107 | "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", 1108 | "dev": true 1109 | }, 1110 | "node_modules/qunit/node_modules/resolve": { 1111 | "version": "1.9.0", 1112 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", 1113 | "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", 1114 | "dev": true, 1115 | "dependencies": { 1116 | "path-parse": "^1.0.6" 1117 | } 1118 | }, 1119 | "node_modules/regexpp": { 1120 | "version": "3.1.0", 1121 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 1122 | "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 1123 | "dev": true, 1124 | "engines": { 1125 | "node": ">=8" 1126 | }, 1127 | "funding": { 1128 | "url": "https://github.com/sponsors/mysticatea" 1129 | } 1130 | }, 1131 | "node_modules/require-from-string": { 1132 | "version": "2.0.2", 1133 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 1134 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 1135 | "dev": true, 1136 | "engines": { 1137 | "node": ">=0.10.0" 1138 | } 1139 | }, 1140 | "node_modules/resolve-from": { 1141 | "version": "4.0.0", 1142 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1143 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1144 | "dev": true, 1145 | "engines": { 1146 | "node": ">=4" 1147 | } 1148 | }, 1149 | "node_modules/rimraf": { 1150 | "version": "3.0.2", 1151 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1152 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1153 | "dev": true, 1154 | "dependencies": { 1155 | "glob": "^7.1.3" 1156 | }, 1157 | "bin": { 1158 | "rimraf": "bin.js" 1159 | }, 1160 | "funding": { 1161 | "url": "https://github.com/sponsors/isaacs" 1162 | } 1163 | }, 1164 | "node_modules/shebang-command": { 1165 | "version": "2.0.0", 1166 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1167 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1168 | "dev": true, 1169 | "dependencies": { 1170 | "shebang-regex": "^3.0.0" 1171 | }, 1172 | "engines": { 1173 | "node": ">=8" 1174 | } 1175 | }, 1176 | "node_modules/shebang-regex": { 1177 | "version": "3.0.0", 1178 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1179 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1180 | "dev": true, 1181 | "engines": { 1182 | "node": ">=8" 1183 | } 1184 | }, 1185 | "node_modules/slice-ansi": { 1186 | "version": "4.0.0", 1187 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 1188 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 1189 | "dev": true, 1190 | "dependencies": { 1191 | "ansi-styles": "^4.0.0", 1192 | "astral-regex": "^2.0.0", 1193 | "is-fullwidth-code-point": "^3.0.0" 1194 | }, 1195 | "engines": { 1196 | "node": ">=10" 1197 | }, 1198 | "funding": { 1199 | "url": "https://github.com/chalk/slice-ansi?sponsor=1" 1200 | } 1201 | }, 1202 | "node_modules/slice-ansi/node_modules/ansi-styles": { 1203 | "version": "4.3.0", 1204 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1205 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1206 | "dev": true, 1207 | "dependencies": { 1208 | "color-convert": "^2.0.1" 1209 | }, 1210 | "engines": { 1211 | "node": ">=8" 1212 | }, 1213 | "funding": { 1214 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1215 | } 1216 | }, 1217 | "node_modules/slice-ansi/node_modules/color-convert": { 1218 | "version": "2.0.1", 1219 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1220 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1221 | "dev": true, 1222 | "dependencies": { 1223 | "color-name": "~1.1.4" 1224 | }, 1225 | "engines": { 1226 | "node": ">=7.0.0" 1227 | } 1228 | }, 1229 | "node_modules/slice-ansi/node_modules/color-name": { 1230 | "version": "1.1.4", 1231 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1232 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1233 | "dev": true 1234 | }, 1235 | "node_modules/source-map": { 1236 | "version": "0.7.3", 1237 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", 1238 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", 1239 | "dev": true, 1240 | "engines": { 1241 | "node": ">= 8" 1242 | } 1243 | }, 1244 | "node_modules/source-map-support": { 1245 | "version": "0.5.21", 1246 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 1247 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 1248 | "dev": true, 1249 | "dependencies": { 1250 | "buffer-from": "^1.0.0", 1251 | "source-map": "^0.6.0" 1252 | } 1253 | }, 1254 | "node_modules/source-map-support/node_modules/source-map": { 1255 | "version": "0.6.1", 1256 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1257 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1258 | "dev": true, 1259 | "engines": { 1260 | "node": ">=0.10.0" 1261 | } 1262 | }, 1263 | "node_modules/sprintf-js": { 1264 | "version": "1.0.3", 1265 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1266 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1267 | "dev": true 1268 | }, 1269 | "node_modules/string-width": { 1270 | "version": "4.2.3", 1271 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1272 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1273 | "dev": true, 1274 | "dependencies": { 1275 | "emoji-regex": "^8.0.0", 1276 | "is-fullwidth-code-point": "^3.0.0", 1277 | "strip-ansi": "^6.0.1" 1278 | }, 1279 | "engines": { 1280 | "node": ">=8" 1281 | } 1282 | }, 1283 | "node_modules/strip-ansi": { 1284 | "version": "6.0.1", 1285 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1286 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1287 | "dev": true, 1288 | "dependencies": { 1289 | "ansi-regex": "^5.0.1" 1290 | }, 1291 | "engines": { 1292 | "node": ">=8" 1293 | } 1294 | }, 1295 | "node_modules/strip-json-comments": { 1296 | "version": "3.1.1", 1297 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1298 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1299 | "dev": true, 1300 | "engines": { 1301 | "node": ">=8" 1302 | }, 1303 | "funding": { 1304 | "url": "https://github.com/sponsors/sindresorhus" 1305 | } 1306 | }, 1307 | "node_modules/supports-color": { 1308 | "version": "5.5.0", 1309 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1310 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1311 | "dev": true, 1312 | "dependencies": { 1313 | "has-flag": "^3.0.0" 1314 | }, 1315 | "engines": { 1316 | "node": ">=4" 1317 | } 1318 | }, 1319 | "node_modules/table": { 1320 | "version": "6.7.5", 1321 | "resolved": "https://registry.npmjs.org/table/-/table-6.7.5.tgz", 1322 | "integrity": "sha512-LFNeryOqiQHqCVKzhkymKwt6ozeRhlm8IL1mE8rNUurkir4heF6PzMyRgaTa4tlyPTGGgXuvVOF/OLWiH09Lqw==", 1323 | "dev": true, 1324 | "dependencies": { 1325 | "ajv": "^8.0.1", 1326 | "lodash.truncate": "^4.4.2", 1327 | "slice-ansi": "^4.0.0", 1328 | "string-width": "^4.2.3", 1329 | "strip-ansi": "^6.0.1" 1330 | }, 1331 | "engines": { 1332 | "node": ">=10.0.0" 1333 | } 1334 | }, 1335 | "node_modules/table/node_modules/ajv": { 1336 | "version": "8.8.2", 1337 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", 1338 | "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", 1339 | "dev": true, 1340 | "dependencies": { 1341 | "fast-deep-equal": "^3.1.1", 1342 | "json-schema-traverse": "^1.0.0", 1343 | "require-from-string": "^2.0.2", 1344 | "uri-js": "^4.2.2" 1345 | }, 1346 | "funding": { 1347 | "type": "github", 1348 | "url": "https://github.com/sponsors/epoberezkin" 1349 | } 1350 | }, 1351 | "node_modules/table/node_modules/json-schema-traverse": { 1352 | "version": "1.0.0", 1353 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 1354 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 1355 | "dev": true 1356 | }, 1357 | "node_modules/terser": { 1358 | "version": "5.10.0", 1359 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", 1360 | "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", 1361 | "dev": true, 1362 | "dependencies": { 1363 | "commander": "^2.20.0", 1364 | "source-map": "~0.7.2", 1365 | "source-map-support": "~0.5.20" 1366 | }, 1367 | "bin": { 1368 | "terser": "bin/terser" 1369 | }, 1370 | "engines": { 1371 | "node": ">=10" 1372 | }, 1373 | "peerDependencies": { 1374 | "acorn": "^8.5.0" 1375 | }, 1376 | "peerDependenciesMeta": { 1377 | "acorn": { 1378 | "optional": true 1379 | } 1380 | } 1381 | }, 1382 | "node_modules/text-table": { 1383 | "version": "0.2.0", 1384 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1385 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1386 | "dev": true 1387 | }, 1388 | "node_modules/type-check": { 1389 | "version": "0.4.0", 1390 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1391 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1392 | "dev": true, 1393 | "dependencies": { 1394 | "prelude-ls": "^1.2.1" 1395 | }, 1396 | "engines": { 1397 | "node": ">= 0.8.0" 1398 | } 1399 | }, 1400 | "node_modules/type-fest": { 1401 | "version": "0.20.2", 1402 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1403 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1404 | "dev": true, 1405 | "engines": { 1406 | "node": ">=10" 1407 | }, 1408 | "funding": { 1409 | "url": "https://github.com/sponsors/sindresorhus" 1410 | } 1411 | }, 1412 | "node_modules/unidragger": { 1413 | "version": "3.0.0", 1414 | "resolved": "https://registry.npmjs.org/unidragger/-/unidragger-3.0.0.tgz", 1415 | "integrity": "sha512-qUGjvQQUhJHh08OvtZpMD1SJVxU+HNZFtPr9kIhESOSVNL26tS6KzgfSrplH33C4ZbpnQVWfnCcYzI5AUKXqzA==", 1416 | "dependencies": { 1417 | "ev-emitter": "^2.0.0" 1418 | } 1419 | }, 1420 | "node_modules/uri-js": { 1421 | "version": "4.4.1", 1422 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1423 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1424 | "dev": true, 1425 | "dependencies": { 1426 | "punycode": "^2.1.0" 1427 | } 1428 | }, 1429 | "node_modules/v8-compile-cache": { 1430 | "version": "2.1.0", 1431 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 1432 | "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 1433 | "dev": true 1434 | }, 1435 | "node_modules/word-wrap": { 1436 | "version": "1.2.3", 1437 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1438 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1439 | "dev": true, 1440 | "engines": { 1441 | "node": ">=0.10.0" 1442 | } 1443 | }, 1444 | "node_modules/wrappy": { 1445 | "version": "1.0.2", 1446 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1447 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1448 | "dev": true 1449 | } 1450 | }, 1451 | "dependencies": { 1452 | "@babel/code-frame": { 1453 | "version": "7.12.11", 1454 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", 1455 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", 1456 | "dev": true, 1457 | "requires": { 1458 | "@babel/highlight": "^7.10.4" 1459 | } 1460 | }, 1461 | "@babel/helper-validator-identifier": { 1462 | "version": "7.15.7", 1463 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", 1464 | "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", 1465 | "dev": true 1466 | }, 1467 | "@babel/highlight": { 1468 | "version": "7.16.0", 1469 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", 1470 | "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", 1471 | "dev": true, 1472 | "requires": { 1473 | "@babel/helper-validator-identifier": "^7.15.7", 1474 | "chalk": "^2.0.0", 1475 | "js-tokens": "^4.0.0" 1476 | } 1477 | }, 1478 | "@eslint/eslintrc": { 1479 | "version": "0.4.3", 1480 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", 1481 | "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", 1482 | "dev": true, 1483 | "requires": { 1484 | "ajv": "^6.12.4", 1485 | "debug": "^4.1.1", 1486 | "espree": "^7.3.0", 1487 | "globals": "^13.9.0", 1488 | "ignore": "^4.0.6", 1489 | "import-fresh": "^3.2.1", 1490 | "js-yaml": "^3.13.1", 1491 | "minimatch": "^3.0.4", 1492 | "strip-json-comments": "^3.1.1" 1493 | } 1494 | }, 1495 | "@humanwhocodes/config-array": { 1496 | "version": "0.5.0", 1497 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", 1498 | "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", 1499 | "dev": true, 1500 | "requires": { 1501 | "@humanwhocodes/object-schema": "^1.2.0", 1502 | "debug": "^4.1.1", 1503 | "minimatch": "^3.0.4" 1504 | } 1505 | }, 1506 | "@humanwhocodes/object-schema": { 1507 | "version": "1.2.1", 1508 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 1509 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 1510 | "dev": true 1511 | }, 1512 | "@types/color-name": { 1513 | "version": "1.1.1", 1514 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 1515 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 1516 | "dev": true 1517 | }, 1518 | "acorn": { 1519 | "version": "8.7.0", 1520 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", 1521 | "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", 1522 | "dev": true, 1523 | "peer": true 1524 | }, 1525 | "acorn-jsx": { 1526 | "version": "5.3.2", 1527 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1528 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1529 | "dev": true, 1530 | "requires": {} 1531 | }, 1532 | "ajv": { 1533 | "version": "6.12.6", 1534 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1535 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1536 | "dev": true, 1537 | "requires": { 1538 | "fast-deep-equal": "^3.1.1", 1539 | "fast-json-stable-stringify": "^2.0.0", 1540 | "json-schema-traverse": "^0.4.1", 1541 | "uri-js": "^4.2.2" 1542 | } 1543 | }, 1544 | "ansi-colors": { 1545 | "version": "4.1.1", 1546 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 1547 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 1548 | "dev": true 1549 | }, 1550 | "ansi-regex": { 1551 | "version": "5.0.1", 1552 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1553 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1554 | "dev": true 1555 | }, 1556 | "ansi-styles": { 1557 | "version": "3.2.1", 1558 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1559 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1560 | "dev": true, 1561 | "requires": { 1562 | "color-convert": "^1.9.0" 1563 | } 1564 | }, 1565 | "argparse": { 1566 | "version": "1.0.10", 1567 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 1568 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 1569 | "dev": true, 1570 | "requires": { 1571 | "sprintf-js": "~1.0.2" 1572 | } 1573 | }, 1574 | "astral-regex": { 1575 | "version": "2.0.0", 1576 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 1577 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 1578 | "dev": true 1579 | }, 1580 | "balanced-match": { 1581 | "version": "1.0.0", 1582 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 1583 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 1584 | "dev": true 1585 | }, 1586 | "brace-expansion": { 1587 | "version": "1.1.11", 1588 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1589 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1590 | "dev": true, 1591 | "requires": { 1592 | "balanced-match": "^1.0.0", 1593 | "concat-map": "0.0.1" 1594 | } 1595 | }, 1596 | "buffer-from": { 1597 | "version": "1.1.2", 1598 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1599 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 1600 | "dev": true 1601 | }, 1602 | "callsites": { 1603 | "version": "3.1.0", 1604 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1605 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1606 | "dev": true 1607 | }, 1608 | "chalk": { 1609 | "version": "2.4.2", 1610 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1611 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1612 | "dev": true, 1613 | "requires": { 1614 | "ansi-styles": "^3.2.1", 1615 | "escape-string-regexp": "^1.0.5", 1616 | "supports-color": "^5.3.0" 1617 | }, 1618 | "dependencies": { 1619 | "escape-string-regexp": { 1620 | "version": "1.0.5", 1621 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1622 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1623 | "dev": true 1624 | } 1625 | } 1626 | }, 1627 | "color-convert": { 1628 | "version": "1.9.3", 1629 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1630 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1631 | "dev": true, 1632 | "requires": { 1633 | "color-name": "1.1.3" 1634 | } 1635 | }, 1636 | "color-name": { 1637 | "version": "1.1.3", 1638 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1639 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1640 | "dev": true 1641 | }, 1642 | "commander": { 1643 | "version": "2.20.3", 1644 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 1645 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 1646 | "dev": true 1647 | }, 1648 | "concat-map": { 1649 | "version": "0.0.1", 1650 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1651 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 1652 | "dev": true 1653 | }, 1654 | "cross-spawn": { 1655 | "version": "7.0.2", 1656 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", 1657 | "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", 1658 | "dev": true, 1659 | "requires": { 1660 | "path-key": "^3.1.0", 1661 | "shebang-command": "^2.0.0", 1662 | "which": "^2.0.1" 1663 | }, 1664 | "dependencies": { 1665 | "which": { 1666 | "version": "2.0.2", 1667 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1668 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1669 | "dev": true, 1670 | "requires": { 1671 | "isexe": "^2.0.0" 1672 | } 1673 | } 1674 | } 1675 | }, 1676 | "debug": { 1677 | "version": "4.3.3", 1678 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 1679 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 1680 | "dev": true, 1681 | "requires": { 1682 | "ms": "2.1.2" 1683 | } 1684 | }, 1685 | "deep-is": { 1686 | "version": "0.1.3", 1687 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 1688 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 1689 | "dev": true 1690 | }, 1691 | "doctrine": { 1692 | "version": "3.0.0", 1693 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1694 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1695 | "dev": true, 1696 | "requires": { 1697 | "esutils": "^2.0.2" 1698 | } 1699 | }, 1700 | "emoji-regex": { 1701 | "version": "8.0.0", 1702 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1703 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1704 | "dev": true 1705 | }, 1706 | "enquirer": { 1707 | "version": "2.3.6", 1708 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 1709 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 1710 | "dev": true, 1711 | "requires": { 1712 | "ansi-colors": "^4.1.1" 1713 | } 1714 | }, 1715 | "escape-string-regexp": { 1716 | "version": "4.0.0", 1717 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1718 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1719 | "dev": true 1720 | }, 1721 | "eslint": { 1722 | "version": "7.32.0", 1723 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", 1724 | "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", 1725 | "dev": true, 1726 | "requires": { 1727 | "@babel/code-frame": "7.12.11", 1728 | "@eslint/eslintrc": "^0.4.3", 1729 | "@humanwhocodes/config-array": "^0.5.0", 1730 | "ajv": "^6.10.0", 1731 | "chalk": "^4.0.0", 1732 | "cross-spawn": "^7.0.2", 1733 | "debug": "^4.0.1", 1734 | "doctrine": "^3.0.0", 1735 | "enquirer": "^2.3.5", 1736 | "escape-string-regexp": "^4.0.0", 1737 | "eslint-scope": "^5.1.1", 1738 | "eslint-utils": "^2.1.0", 1739 | "eslint-visitor-keys": "^2.0.0", 1740 | "espree": "^7.3.1", 1741 | "esquery": "^1.4.0", 1742 | "esutils": "^2.0.2", 1743 | "fast-deep-equal": "^3.1.3", 1744 | "file-entry-cache": "^6.0.1", 1745 | "functional-red-black-tree": "^1.0.1", 1746 | "glob-parent": "^5.1.2", 1747 | "globals": "^13.6.0", 1748 | "ignore": "^4.0.6", 1749 | "import-fresh": "^3.0.0", 1750 | "imurmurhash": "^0.1.4", 1751 | "is-glob": "^4.0.0", 1752 | "js-yaml": "^3.13.1", 1753 | "json-stable-stringify-without-jsonify": "^1.0.1", 1754 | "levn": "^0.4.1", 1755 | "lodash.merge": "^4.6.2", 1756 | "minimatch": "^3.0.4", 1757 | "natural-compare": "^1.4.0", 1758 | "optionator": "^0.9.1", 1759 | "progress": "^2.0.0", 1760 | "regexpp": "^3.1.0", 1761 | "semver": "^7.2.1", 1762 | "strip-ansi": "^6.0.0", 1763 | "strip-json-comments": "^3.1.0", 1764 | "table": "^6.0.9", 1765 | "text-table": "^0.2.0", 1766 | "v8-compile-cache": "^2.0.3" 1767 | }, 1768 | "dependencies": { 1769 | "ansi-styles": { 1770 | "version": "4.2.1", 1771 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 1772 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 1773 | "dev": true, 1774 | "requires": { 1775 | "@types/color-name": "^1.1.1", 1776 | "color-convert": "^2.0.1" 1777 | } 1778 | }, 1779 | "chalk": { 1780 | "version": "4.0.0", 1781 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", 1782 | "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", 1783 | "dev": true, 1784 | "requires": { 1785 | "ansi-styles": "^4.1.0", 1786 | "supports-color": "^7.1.0" 1787 | } 1788 | }, 1789 | "color-convert": { 1790 | "version": "2.0.1", 1791 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1792 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1793 | "dev": true, 1794 | "requires": { 1795 | "color-name": "~1.1.4" 1796 | } 1797 | }, 1798 | "color-name": { 1799 | "version": "1.1.4", 1800 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1801 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1802 | "dev": true 1803 | }, 1804 | "has-flag": { 1805 | "version": "4.0.0", 1806 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1807 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1808 | "dev": true 1809 | }, 1810 | "is-glob": { 1811 | "version": "4.0.1", 1812 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1813 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1814 | "dev": true, 1815 | "requires": { 1816 | "is-extglob": "^2.1.1" 1817 | } 1818 | }, 1819 | "semver": { 1820 | "version": "7.3.2", 1821 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", 1822 | "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", 1823 | "dev": true 1824 | }, 1825 | "supports-color": { 1826 | "version": "7.1.0", 1827 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 1828 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 1829 | "dev": true, 1830 | "requires": { 1831 | "has-flag": "^4.0.0" 1832 | } 1833 | } 1834 | } 1835 | }, 1836 | "eslint-plugin-metafizzy": { 1837 | "version": "1.2.1", 1838 | "resolved": "https://registry.npmjs.org/eslint-plugin-metafizzy/-/eslint-plugin-metafizzy-1.2.1.tgz", 1839 | "integrity": "sha512-xl+JvruIUIqiBKAe3PcFoBPEESHjYFM08Nss57qs7P4iC392XLCUpruaGXWzy/sEwRWwH14jPp6aN1flNca6AA==", 1840 | "dev": true, 1841 | "requires": {} 1842 | }, 1843 | "eslint-scope": { 1844 | "version": "5.1.1", 1845 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 1846 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 1847 | "dev": true, 1848 | "requires": { 1849 | "esrecurse": "^4.3.0", 1850 | "estraverse": "^4.1.1" 1851 | } 1852 | }, 1853 | "eslint-utils": { 1854 | "version": "2.1.0", 1855 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 1856 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 1857 | "dev": true, 1858 | "requires": { 1859 | "eslint-visitor-keys": "^1.1.0" 1860 | }, 1861 | "dependencies": { 1862 | "eslint-visitor-keys": { 1863 | "version": "1.3.0", 1864 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 1865 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 1866 | "dev": true 1867 | } 1868 | } 1869 | }, 1870 | "eslint-visitor-keys": { 1871 | "version": "2.1.0", 1872 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 1873 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 1874 | "dev": true 1875 | }, 1876 | "espree": { 1877 | "version": "7.3.1", 1878 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", 1879 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", 1880 | "dev": true, 1881 | "requires": { 1882 | "acorn": "^7.4.0", 1883 | "acorn-jsx": "^5.3.1", 1884 | "eslint-visitor-keys": "^1.3.0" 1885 | }, 1886 | "dependencies": { 1887 | "acorn": { 1888 | "version": "7.4.1", 1889 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 1890 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 1891 | "dev": true 1892 | }, 1893 | "eslint-visitor-keys": { 1894 | "version": "1.3.0", 1895 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 1896 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 1897 | "dev": true 1898 | } 1899 | } 1900 | }, 1901 | "esprima": { 1902 | "version": "4.0.1", 1903 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1904 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1905 | "dev": true 1906 | }, 1907 | "esquery": { 1908 | "version": "1.4.0", 1909 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 1910 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 1911 | "dev": true, 1912 | "requires": { 1913 | "estraverse": "^5.1.0" 1914 | }, 1915 | "dependencies": { 1916 | "estraverse": { 1917 | "version": "5.3.0", 1918 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1919 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1920 | "dev": true 1921 | } 1922 | } 1923 | }, 1924 | "esrecurse": { 1925 | "version": "4.3.0", 1926 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1927 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1928 | "dev": true, 1929 | "requires": { 1930 | "estraverse": "^5.2.0" 1931 | }, 1932 | "dependencies": { 1933 | "estraverse": { 1934 | "version": "5.3.0", 1935 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1936 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1937 | "dev": true 1938 | } 1939 | } 1940 | }, 1941 | "estraverse": { 1942 | "version": "4.3.0", 1943 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1944 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1945 | "dev": true 1946 | }, 1947 | "esutils": { 1948 | "version": "2.0.3", 1949 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1950 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1951 | "dev": true 1952 | }, 1953 | "ev-emitter": { 1954 | "version": "2.1.2", 1955 | "resolved": "https://registry.npmjs.org/ev-emitter/-/ev-emitter-2.1.2.tgz", 1956 | "integrity": "sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q==" 1957 | }, 1958 | "fast-deep-equal": { 1959 | "version": "3.1.3", 1960 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1961 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1962 | "dev": true 1963 | }, 1964 | "fast-json-stable-stringify": { 1965 | "version": "2.1.0", 1966 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1967 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1968 | "dev": true 1969 | }, 1970 | "fast-levenshtein": { 1971 | "version": "2.0.6", 1972 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1973 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1974 | "dev": true 1975 | }, 1976 | "file-entry-cache": { 1977 | "version": "6.0.1", 1978 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1979 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1980 | "dev": true, 1981 | "requires": { 1982 | "flat-cache": "^3.0.4" 1983 | } 1984 | }, 1985 | "flat-cache": { 1986 | "version": "3.0.4", 1987 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 1988 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 1989 | "dev": true, 1990 | "requires": { 1991 | "flatted": "^3.1.0", 1992 | "rimraf": "^3.0.2" 1993 | } 1994 | }, 1995 | "flatted": { 1996 | "version": "3.2.4", 1997 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", 1998 | "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", 1999 | "dev": true 2000 | }, 2001 | "fs.realpath": { 2002 | "version": "1.0.0", 2003 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2004 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 2005 | "dev": true 2006 | }, 2007 | "functional-red-black-tree": { 2008 | "version": "1.0.1", 2009 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 2010 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 2011 | "dev": true 2012 | }, 2013 | "get-size": { 2014 | "version": "3.0.0", 2015 | "resolved": "https://registry.npmjs.org/get-size/-/get-size-3.0.0.tgz", 2016 | "integrity": "sha512-Y8aiXLq4leR7807UY0yuKEwif5s3kbVp1nTv+i4jBeoUzByTLKkLWu/HorS6/pB+7gsB0o7OTogC8AoOOeT0Hw==" 2017 | }, 2018 | "glob": { 2019 | "version": "7.2.0", 2020 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 2021 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 2022 | "dev": true, 2023 | "requires": { 2024 | "fs.realpath": "^1.0.0", 2025 | "inflight": "^1.0.4", 2026 | "inherits": "2", 2027 | "minimatch": "^3.0.4", 2028 | "once": "^1.3.0", 2029 | "path-is-absolute": "^1.0.0" 2030 | } 2031 | }, 2032 | "glob-parent": { 2033 | "version": "5.1.2", 2034 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2035 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2036 | "dev": true, 2037 | "requires": { 2038 | "is-glob": "^4.0.1" 2039 | }, 2040 | "dependencies": { 2041 | "is-glob": { 2042 | "version": "4.0.1", 2043 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 2044 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 2045 | "dev": true, 2046 | "requires": { 2047 | "is-extglob": "^2.1.1" 2048 | } 2049 | } 2050 | } 2051 | }, 2052 | "globals": { 2053 | "version": "13.12.0", 2054 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", 2055 | "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", 2056 | "dev": true, 2057 | "requires": { 2058 | "type-fest": "^0.20.2" 2059 | } 2060 | }, 2061 | "has-flag": { 2062 | "version": "3.0.0", 2063 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2064 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 2065 | "dev": true 2066 | }, 2067 | "ignore": { 2068 | "version": "4.0.6", 2069 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 2070 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 2071 | "dev": true 2072 | }, 2073 | "import-fresh": { 2074 | "version": "3.2.1", 2075 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 2076 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 2077 | "dev": true, 2078 | "requires": { 2079 | "parent-module": "^1.0.0", 2080 | "resolve-from": "^4.0.0" 2081 | } 2082 | }, 2083 | "imurmurhash": { 2084 | "version": "0.1.4", 2085 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2086 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 2087 | "dev": true 2088 | }, 2089 | "inflight": { 2090 | "version": "1.0.6", 2091 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2092 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2093 | "dev": true, 2094 | "requires": { 2095 | "once": "^1.3.0", 2096 | "wrappy": "1" 2097 | } 2098 | }, 2099 | "inherits": { 2100 | "version": "2.0.4", 2101 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2102 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2103 | "dev": true 2104 | }, 2105 | "is-extglob": { 2106 | "version": "2.1.1", 2107 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2108 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 2109 | "dev": true 2110 | }, 2111 | "is-fullwidth-code-point": { 2112 | "version": "3.0.0", 2113 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2114 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2115 | "dev": true 2116 | }, 2117 | "isexe": { 2118 | "version": "2.0.0", 2119 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2120 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 2121 | "dev": true 2122 | }, 2123 | "jquery": { 2124 | "version": "3.5.1", 2125 | "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", 2126 | "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==", 2127 | "dev": true 2128 | }, 2129 | "jquery-bridget": { 2130 | "version": "2.0.1", 2131 | "resolved": "https://registry.npmjs.org/jquery-bridget/-/jquery-bridget-2.0.1.tgz", 2132 | "integrity": "sha1-eE0XqF5kF4DF2JrD+KfrR7C84fw=", 2133 | "dev": true, 2134 | "requires": { 2135 | "jquery": ">=1.4.2 <4" 2136 | } 2137 | }, 2138 | "js-reporters": { 2139 | "version": "1.2.1", 2140 | "resolved": "https://registry.npmjs.org/js-reporters/-/js-reporters-1.2.1.tgz", 2141 | "integrity": "sha1-+IxgjjJKM3OpW8xFrTBeXJecRZs=", 2142 | "dev": true 2143 | }, 2144 | "js-tokens": { 2145 | "version": "4.0.0", 2146 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2147 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2148 | "dev": true 2149 | }, 2150 | "js-yaml": { 2151 | "version": "3.13.1", 2152 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 2153 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 2154 | "dev": true, 2155 | "requires": { 2156 | "argparse": "^1.0.7", 2157 | "esprima": "^4.0.0" 2158 | } 2159 | }, 2160 | "json-schema-traverse": { 2161 | "version": "0.4.1", 2162 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2163 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2164 | "dev": true 2165 | }, 2166 | "json-stable-stringify-without-jsonify": { 2167 | "version": "1.0.1", 2168 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2169 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 2170 | "dev": true 2171 | }, 2172 | "levn": { 2173 | "version": "0.4.1", 2174 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 2175 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2176 | "dev": true, 2177 | "requires": { 2178 | "prelude-ls": "^1.2.1", 2179 | "type-check": "~0.4.0" 2180 | } 2181 | }, 2182 | "lodash.merge": { 2183 | "version": "4.6.2", 2184 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2185 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2186 | "dev": true 2187 | }, 2188 | "lodash.truncate": { 2189 | "version": "4.4.2", 2190 | "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", 2191 | "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", 2192 | "dev": true 2193 | }, 2194 | "minimatch": { 2195 | "version": "3.0.4", 2196 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2197 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2198 | "dev": true, 2199 | "requires": { 2200 | "brace-expansion": "^1.1.7" 2201 | } 2202 | }, 2203 | "ms": { 2204 | "version": "2.1.2", 2205 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2206 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2207 | "dev": true 2208 | }, 2209 | "natural-compare": { 2210 | "version": "1.4.0", 2211 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2212 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 2213 | "dev": true 2214 | }, 2215 | "node-watch": { 2216 | "version": "0.6.1", 2217 | "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.6.1.tgz", 2218 | "integrity": "sha512-gwQiR7weFRV8mAtT0x0kXkZ18dfRLB45xH7q0hCOVQMLfLb2f1ZaSvR57q4/b/Vj6B0RwMNJYbvb69e1yM7qEA==", 2219 | "dev": true 2220 | }, 2221 | "once": { 2222 | "version": "1.4.0", 2223 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2224 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2225 | "dev": true, 2226 | "requires": { 2227 | "wrappy": "1" 2228 | } 2229 | }, 2230 | "optionator": { 2231 | "version": "0.9.1", 2232 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 2233 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 2234 | "dev": true, 2235 | "requires": { 2236 | "deep-is": "^0.1.3", 2237 | "fast-levenshtein": "^2.0.6", 2238 | "levn": "^0.4.1", 2239 | "prelude-ls": "^1.2.1", 2240 | "type-check": "^0.4.0", 2241 | "word-wrap": "^1.2.3" 2242 | } 2243 | }, 2244 | "parent-module": { 2245 | "version": "1.0.1", 2246 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2247 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2248 | "dev": true, 2249 | "requires": { 2250 | "callsites": "^3.0.0" 2251 | } 2252 | }, 2253 | "path-is-absolute": { 2254 | "version": "1.0.1", 2255 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2256 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2257 | "dev": true 2258 | }, 2259 | "path-key": { 2260 | "version": "3.1.1", 2261 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2262 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2263 | "dev": true 2264 | }, 2265 | "path-parse": { 2266 | "version": "1.0.7", 2267 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2268 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2269 | "dev": true 2270 | }, 2271 | "prelude-ls": { 2272 | "version": "1.2.1", 2273 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2274 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2275 | "dev": true 2276 | }, 2277 | "progress": { 2278 | "version": "2.0.3", 2279 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 2280 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 2281 | "dev": true 2282 | }, 2283 | "punycode": { 2284 | "version": "2.1.1", 2285 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2286 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2287 | "dev": true 2288 | }, 2289 | "qunit": { 2290 | "version": "2.10.0", 2291 | "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.10.0.tgz", 2292 | "integrity": "sha512-EP9Q9Kf45z4l/X02ZJtyTQU9DBc82pEWAncSNx7Weo/73BDpX71xqbsdDAQrtEeeilK70cib7CY/lniJV6Cwwg==", 2293 | "dev": true, 2294 | "requires": { 2295 | "commander": "2.12.2", 2296 | "js-reporters": "1.2.1", 2297 | "minimatch": "3.0.4", 2298 | "node-watch": "0.6.1", 2299 | "resolve": "1.9.0" 2300 | }, 2301 | "dependencies": { 2302 | "commander": { 2303 | "version": "2.12.2", 2304 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", 2305 | "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", 2306 | "dev": true 2307 | }, 2308 | "resolve": { 2309 | "version": "1.9.0", 2310 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", 2311 | "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", 2312 | "dev": true, 2313 | "requires": { 2314 | "path-parse": "^1.0.6" 2315 | } 2316 | } 2317 | } 2318 | }, 2319 | "regexpp": { 2320 | "version": "3.1.0", 2321 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 2322 | "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 2323 | "dev": true 2324 | }, 2325 | "require-from-string": { 2326 | "version": "2.0.2", 2327 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 2328 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 2329 | "dev": true 2330 | }, 2331 | "resolve-from": { 2332 | "version": "4.0.0", 2333 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2334 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2335 | "dev": true 2336 | }, 2337 | "rimraf": { 2338 | "version": "3.0.2", 2339 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2340 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2341 | "dev": true, 2342 | "requires": { 2343 | "glob": "^7.1.3" 2344 | } 2345 | }, 2346 | "shebang-command": { 2347 | "version": "2.0.0", 2348 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2349 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2350 | "dev": true, 2351 | "requires": { 2352 | "shebang-regex": "^3.0.0" 2353 | } 2354 | }, 2355 | "shebang-regex": { 2356 | "version": "3.0.0", 2357 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2358 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2359 | "dev": true 2360 | }, 2361 | "slice-ansi": { 2362 | "version": "4.0.0", 2363 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 2364 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 2365 | "dev": true, 2366 | "requires": { 2367 | "ansi-styles": "^4.0.0", 2368 | "astral-regex": "^2.0.0", 2369 | "is-fullwidth-code-point": "^3.0.0" 2370 | }, 2371 | "dependencies": { 2372 | "ansi-styles": { 2373 | "version": "4.3.0", 2374 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2375 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2376 | "dev": true, 2377 | "requires": { 2378 | "color-convert": "^2.0.1" 2379 | } 2380 | }, 2381 | "color-convert": { 2382 | "version": "2.0.1", 2383 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2384 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2385 | "dev": true, 2386 | "requires": { 2387 | "color-name": "~1.1.4" 2388 | } 2389 | }, 2390 | "color-name": { 2391 | "version": "1.1.4", 2392 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2393 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2394 | "dev": true 2395 | } 2396 | } 2397 | }, 2398 | "source-map": { 2399 | "version": "0.7.3", 2400 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", 2401 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", 2402 | "dev": true 2403 | }, 2404 | "source-map-support": { 2405 | "version": "0.5.21", 2406 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 2407 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 2408 | "dev": true, 2409 | "requires": { 2410 | "buffer-from": "^1.0.0", 2411 | "source-map": "^0.6.0" 2412 | }, 2413 | "dependencies": { 2414 | "source-map": { 2415 | "version": "0.6.1", 2416 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2417 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2418 | "dev": true 2419 | } 2420 | } 2421 | }, 2422 | "sprintf-js": { 2423 | "version": "1.0.3", 2424 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2425 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2426 | "dev": true 2427 | }, 2428 | "string-width": { 2429 | "version": "4.2.3", 2430 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2431 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2432 | "dev": true, 2433 | "requires": { 2434 | "emoji-regex": "^8.0.0", 2435 | "is-fullwidth-code-point": "^3.0.0", 2436 | "strip-ansi": "^6.0.1" 2437 | } 2438 | }, 2439 | "strip-ansi": { 2440 | "version": "6.0.1", 2441 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2442 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2443 | "dev": true, 2444 | "requires": { 2445 | "ansi-regex": "^5.0.1" 2446 | } 2447 | }, 2448 | "strip-json-comments": { 2449 | "version": "3.1.1", 2450 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2451 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2452 | "dev": true 2453 | }, 2454 | "supports-color": { 2455 | "version": "5.5.0", 2456 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2457 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2458 | "dev": true, 2459 | "requires": { 2460 | "has-flag": "^3.0.0" 2461 | } 2462 | }, 2463 | "table": { 2464 | "version": "6.7.5", 2465 | "resolved": "https://registry.npmjs.org/table/-/table-6.7.5.tgz", 2466 | "integrity": "sha512-LFNeryOqiQHqCVKzhkymKwt6ozeRhlm8IL1mE8rNUurkir4heF6PzMyRgaTa4tlyPTGGgXuvVOF/OLWiH09Lqw==", 2467 | "dev": true, 2468 | "requires": { 2469 | "ajv": "^8.0.1", 2470 | "lodash.truncate": "^4.4.2", 2471 | "slice-ansi": "^4.0.0", 2472 | "string-width": "^4.2.3", 2473 | "strip-ansi": "^6.0.1" 2474 | }, 2475 | "dependencies": { 2476 | "ajv": { 2477 | "version": "8.8.2", 2478 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", 2479 | "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", 2480 | "dev": true, 2481 | "requires": { 2482 | "fast-deep-equal": "^3.1.1", 2483 | "json-schema-traverse": "^1.0.0", 2484 | "require-from-string": "^2.0.2", 2485 | "uri-js": "^4.2.2" 2486 | } 2487 | }, 2488 | "json-schema-traverse": { 2489 | "version": "1.0.0", 2490 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 2491 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 2492 | "dev": true 2493 | } 2494 | } 2495 | }, 2496 | "terser": { 2497 | "version": "5.10.0", 2498 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", 2499 | "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", 2500 | "dev": true, 2501 | "requires": { 2502 | "commander": "^2.20.0", 2503 | "source-map": "~0.7.2", 2504 | "source-map-support": "~0.5.20" 2505 | } 2506 | }, 2507 | "text-table": { 2508 | "version": "0.2.0", 2509 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2510 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2511 | "dev": true 2512 | }, 2513 | "type-check": { 2514 | "version": "0.4.0", 2515 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2516 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2517 | "dev": true, 2518 | "requires": { 2519 | "prelude-ls": "^1.2.1" 2520 | } 2521 | }, 2522 | "type-fest": { 2523 | "version": "0.20.2", 2524 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 2525 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 2526 | "dev": true 2527 | }, 2528 | "unidragger": { 2529 | "version": "3.0.0", 2530 | "resolved": "https://registry.npmjs.org/unidragger/-/unidragger-3.0.0.tgz", 2531 | "integrity": "sha512-qUGjvQQUhJHh08OvtZpMD1SJVxU+HNZFtPr9kIhESOSVNL26tS6KzgfSrplH33C4ZbpnQVWfnCcYzI5AUKXqzA==", 2532 | "requires": { 2533 | "ev-emitter": "^2.0.0" 2534 | } 2535 | }, 2536 | "uri-js": { 2537 | "version": "4.4.1", 2538 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2539 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2540 | "dev": true, 2541 | "requires": { 2542 | "punycode": "^2.1.0" 2543 | } 2544 | }, 2545 | "v8-compile-cache": { 2546 | "version": "2.1.0", 2547 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 2548 | "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 2549 | "dev": true 2550 | }, 2551 | "word-wrap": { 2552 | "version": "1.2.3", 2553 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2554 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2555 | "dev": true 2556 | }, 2557 | "wrappy": { 2558 | "version": "1.0.2", 2559 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2560 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2561 | "dev": true 2562 | } 2563 | } 2564 | } 2565 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "draggabilly", 3 | "version": "3.0.0", 4 | "description": "make that shiz draggable", 5 | "main": "draggabilly.js", 6 | "scripts": { 7 | "lint": "npx eslint . && node bin/lint-json.js", 8 | "lintFix": "npx eslint . --fix", 9 | "dist": "node bin/build-dist.js", 10 | "version": "node bin/version.js && npm run dist && git add -A . dist", 11 | "test": "npm run lint" 12 | }, 13 | "dependencies": { 14 | "get-size": "^3.0.0", 15 | "unidragger": "^3.0.0" 16 | }, 17 | "devDependencies": { 18 | "eslint": "^7.0.0", 19 | "eslint-plugin-metafizzy": "^1.0.0", 20 | "jquery-bridget": "^2.0.1", 21 | "qunit": "^2.10.0", 22 | "terser": "^5.10.0" 23 | }, 24 | "repository": { 25 | "type": "git", 26 | "url": "git://github.com/desandro/draggabilly.git" 27 | }, 28 | "keywords": [ 29 | "DOM", 30 | "drag", 31 | "draggable", 32 | "touch", 33 | "multitouch" 34 | ], 35 | "author": "David DeSandro", 36 | "license": "MIT", 37 | "homepage": "https://draggabilly.desandro.com/", 38 | "bugs": { 39 | "url": "https://github.com/desandro/draggabilly/issues" 40 | }, 41 | "directories": { 42 | "test": "test" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /sandbox/require-js/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | requirejs 8 | 9 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |

requirejs

24 | 25 |
26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /sandbox/require-js/main.js: -------------------------------------------------------------------------------- 1 | /* globals requirejs */ 2 | requirejs( [ '../../dist/draggabilly.pkgd' ], function( Draggabilly ) { 3 | new Draggabilly('.draggie'); 4 | } ); 5 | -------------------------------------------------------------------------------- /sandbox/sandbox.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Draggabilly 9 | 10 | 111 | 112 | 113 | 114 | 115 |

Draggabilly

116 | 117 |

Press [B] to enable/disable the blue draggabilly

118 | 119 |
120 |
121 |
122 |
123 | 124 |
125 |
126 |
127 |
128 | 129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 | 141 | 142 | 143 | 144 |
145 | 146 | 147 |
148 | 149 |
150 |
151 |
152 | 153 |
axis: x
154 |
axis: y
155 | 156 |
157 | 158 | 159 |
160 | 161 | 162 | 163 | 164 | 165 | 245 | 246 | 247 | 248 | -------------------------------------------------------------------------------- /sandbox/single.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | single 8 | 9 | 24 | 25 | 26 | 27 | 28 |

single

29 | 30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /test/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "browser": true, 3 | "devel": true, 4 | "undef": true, 5 | "unused": true, 6 | "globals": { 7 | "Draggabilly": false, 8 | "QUnit": false 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Draggabilly tests 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |

Draggabilly tests

28 | 29 |
30 |
31 |

basics

32 |
33 |
34 | 35 |
36 |

destroy

37 |
38 |
39 |
40 | 41 |
42 |
43 |
44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /test/jquery.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | jQuery Draggabilly tests 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |

jQuery Draggabilly tests

29 | 30 |
31 |
32 |

basics

33 |
34 |
35 | 36 |
37 |

destroy

38 |
39 |
40 |
41 | 42 |
43 |
44 |
45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /test/test.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: sans-serif; 3 | } 4 | 5 | .draggie { 6 | width: 100px; 7 | height: 100px; 8 | background: #F90; 9 | } 10 | .draggie.is-pointer-down { background: #09F; } 11 | .draggie.is-dragging { opacity: 0.7; } 12 | 13 | .test { 14 | border: 2px solid transparent; 15 | margin-bottom: 20px; 16 | padding: 10px; 17 | } 18 | 19 | .test.running { border-color: #F90; } 20 | 21 | .test.running h2 { color: #F90; } 22 | 23 | @media screen and (min-width: 640px) { 24 | .column { 25 | float: left; 26 | } 27 | 28 | .column--left { 29 | width: 30%; 30 | margin-right: 4%;s 31 | } 32 | 33 | .column--right { 34 | width: 66%; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /test/unit/basics.js: -------------------------------------------------------------------------------- 1 | QUnit.test( 'init', function( assert ) { 2 | 3 | assert.expect( 30 ); 4 | let done = assert.async(); 5 | 6 | let testElem = document.querySelector('.test--basics'); 7 | let h2 = testElem.querySelector('h2'); 8 | h2.textContent = 'Drag this element'; 9 | testElem.classList.add('running'); 10 | let draggieElem = testElem.querySelector('.draggie'); 11 | let draggie = new Draggabilly( draggieElem ); 12 | 13 | assert.equal( draggieElem.style.position, 'relative', 'position: relative set' ); 14 | 15 | let didPointerDown, didPointerMove, didPointerUp, didDragStart, didDragMove, 16 | didDragEnd; 17 | 18 | draggie.once( 'pointerDown', function( event, pointer ) { 19 | didPointerDown = true; 20 | assert.equal( typeof event, 'object', 'pointerDown event argument' ); 21 | assert.ok( pointer.pageX, 'pointerDown pageX' ); 22 | assert.ok( draggieElem.classList.contains('is-pointer-down'), 23 | 'is-pointer-down class added' ); 24 | } ); 25 | 26 | draggie.once( 'pointerMove', function( event, pointer, moveVector ) { 27 | didPointerMove = true; 28 | assert.equal( typeof event, 'object', 'pointerMove event argument' ); 29 | assert.equal( typeof pointer.pageX, 'number', 'pointerMove pageX' ); 30 | assert.equal( typeof moveVector.x, 'number', 'pointerMove moveVector.x' ); 31 | assert.equal( typeof moveVector.y, 'number', 'pointerMove moveVector.y' ); 32 | } ); 33 | 34 | draggie.once( 'pointerUp', function( event, pointer ) { 35 | didPointerUp = true; 36 | assert.equal( typeof event, 'object', 'pointerUp event argument' ); 37 | assert.ok( pointer.pageX, 'pointerUp pageX' ); 38 | assert.ok( !draggieElem.classList.contains('is-pointer-down'), 39 | 'is-pointer-down class removed' ); 40 | } ); 41 | 42 | draggie.once( 'dragStart', function( event, pointer ) { 43 | didDragStart = true; 44 | assert.equal( typeof event, 'object', 'didDragStart event argument' ); 45 | assert.equal( typeof pointer.pageX, 'number', 'didDragStart pageX' ); 46 | assert.ok( draggieElem.classList.contains('is-dragging'), 47 | 'is-dragging class added' ); 48 | } ); 49 | 50 | draggie.once( 'dragMove', function( event, pointer, moveVector ) { 51 | didDragMove = true; 52 | assert.equal( typeof event, 'object', 'dragMove event argument' ); 53 | assert.equal( typeof pointer.pageX, 'number', 'dragMove pageX' ); 54 | assert.equal( typeof moveVector.x, 'number', 'dragMove moveVector.x' ); 55 | assert.equal( typeof moveVector.y, 'number', 'dragMove moveVector.y' ); 56 | } ); 57 | 58 | draggie.once( 'dragEnd', function( event, pointer ) { 59 | didDragEnd = true; 60 | assert.equal( typeof event, 'object', 'dragEnd event argument' ); 61 | assert.ok( pointer.pageX, 'dragEnd pageX' ); 62 | assert.ok( !draggieElem.classList.contains('is-dragging'), 63 | 'is-dragging class removed' ); 64 | 65 | assert.ok( didPointerDown, 'didPointerDown' ); 66 | assert.ok( didPointerMove, 'didPointerMove' ); 67 | assert.ok( didPointerUp, 'didPointerUp' ); 68 | assert.ok( didDragStart, 'didDragStart' ); 69 | assert.ok( didDragMove, 'didDragMove' ); 70 | assert.ok( didDragEnd, 'didDragEnd' ); 71 | 72 | assert.ok( draggieElem.style.left, 'drag elem style left' ); 73 | assert.ok( draggieElem.style.top, 'drag elem style left' ); 74 | assert.ok( !draggieElem.style.transform, 'transform style removed' ); 75 | // done 76 | h2.textContent = 'basics: done'; 77 | testElem.classList.remove('running'); 78 | done(); 79 | } ); 80 | 81 | } ); 82 | -------------------------------------------------------------------------------- /test/unit/destroy.js: -------------------------------------------------------------------------------- 1 | QUnit.test( 'destroy', function( assert ) { 2 | let done = assert.async(); 3 | 4 | let draggieElem = document.querySelector('.test--destroy .draggie'); 5 | let draggie = new Draggabilly( draggieElem ); 6 | 7 | setTimeout( function() { 8 | draggie.destroy(); 9 | assert.ok( true, 'draggie destroyed' ); 10 | assert.ok( !draggieElem.style.left, 'no style left' ); 11 | assert.ok( !draggieElem.style.top, 'no style top' ); 12 | assert.ok( !draggieElem.style.position, 'no style position' ); 13 | done(); 14 | } ); 15 | } ); 16 | -------------------------------------------------------------------------------- /test/unit/jquery-basics.js: -------------------------------------------------------------------------------- 1 | /* globals $ */ 2 | 3 | QUnit.test( 'init', function( assert ) { 4 | assert.expect( 30 ); 5 | let done = assert.async(); 6 | 7 | let $test = $('.test--basics').addClass('running'); 8 | let $h2 = $test.find('h2').text('Drag this element'); 9 | 10 | let $draggie = $('.draggie').draggabilly(); 11 | let draggieElem = $draggie[0]; 12 | 13 | assert.equal( draggieElem.style.position, 'relative', 'position: relative set' ); 14 | 15 | let didPointerDown, didPointerMove, didPointerUp, didDragStart, didDragMove, 16 | didDragEnd; 17 | 18 | $draggie.one( 'pointerDown', function( event, pointer ) { 19 | didPointerDown = true; 20 | assert.equal( typeof event, 'object', 'pointerDown event argument' ); 21 | assert.ok( pointer.pageX, 'pointerDown pageX' ); 22 | assert.ok( $draggie.hasClass('is-pointer-down'), 'is-pointer-down class added' ); 23 | } ); 24 | 25 | $draggie.one( 'pointerMove', function( event, pointer, moveVector ) { 26 | didPointerMove = true; 27 | assert.equal( typeof event, 'object', 'pointerMove event argument' ); 28 | assert.equal( typeof pointer.pageX, 'number', 'pointerMove pageX' ); 29 | assert.equal( typeof moveVector.x, 'number', 'pointerMove moveVector.x' ); 30 | assert.equal( typeof moveVector.y, 'number', 'pointerMove moveVector.y' ); 31 | } ); 32 | 33 | $draggie.one( 'pointerUp', function( event, pointer ) { 34 | didPointerUp = true; 35 | assert.equal( typeof event, 'object', 'pointerUp event argument' ); 36 | assert.ok( pointer.pageX, 'pointerUp pageX' ); 37 | assert.ok( !$draggie.hasClass('is-pointer-down'), 'is-pointer-down class removed' ); 38 | } ); 39 | 40 | $draggie.one( 'dragStart', function( event, pointer ) { 41 | didDragStart = true; 42 | assert.equal( typeof event, 'object', 'didDragStart event argument' ); 43 | assert.equal( typeof pointer.pageX, 'number', 'didDragStart pageX' ); 44 | assert.ok( $draggie.hasClass('is-dragging'), 'is-dragging class added' ); 45 | } ); 46 | 47 | $draggie.one( 'dragMove', function( event, pointer, moveVector ) { 48 | didDragMove = true; 49 | assert.equal( typeof event, 'object', 'dragMove event argument' ); 50 | assert.equal( typeof pointer.pageX, 'number', 'dragMove pageX' ); 51 | assert.equal( typeof moveVector.x, 'number', 'dragMove moveVector.x' ); 52 | assert.equal( typeof moveVector.y, 'number', 'dragMove moveVector.y' ); 53 | } ); 54 | 55 | $draggie.one( 'dragEnd', function( event, pointer ) { 56 | didDragEnd = true; 57 | assert.equal( typeof event, 'object', 'dragEnd event argument' ); 58 | assert.ok( pointer.pageX, 'dragEnd pageX' ); 59 | assert.ok( !$draggie.hasClass('is-dragging'), 'is-dragging class removed' ); 60 | 61 | assert.ok( didPointerDown, 'didPointerDown' ); 62 | assert.ok( didPointerMove, 'didPointerMove' ); 63 | assert.ok( didPointerUp, 'didPointerUp' ); 64 | assert.ok( didDragStart, 'didDragStart' ); 65 | assert.ok( didDragMove, 'didDragMove' ); 66 | assert.ok( didDragEnd, 'didDragEnd' ); 67 | 68 | assert.ok( draggieElem.style.left, 'drag elem style left' ); 69 | assert.ok( draggieElem.style.top, 'drag elem style left' ); 70 | assert.ok( !draggieElem.style.transform, 'transform style removed' ); 71 | // done 72 | $h2.text('basics: done'); 73 | $test.removeClass('running'); 74 | done(); 75 | } ); 76 | 77 | } ); 78 | -------------------------------------------------------------------------------- /test/unit/jquery-destroy.js: -------------------------------------------------------------------------------- 1 | /* globals $ */ 2 | 3 | QUnit.test( 'destroy', function( assert ) { 4 | let done = assert.async(); 5 | 6 | let $draggie = $('.test--destroy .draggie').draggabilly(); 7 | let draggieElem = $draggie[0]; 8 | 9 | setTimeout( function() { 10 | $draggie.draggabilly('destroy'); 11 | assert.ok( true, 'draggie destroyed' ); 12 | assert.ok( !draggieElem.style.left, 'no style left' ); 13 | assert.ok( !draggieElem.style.top, 'no style top' ); 14 | assert.ok( !draggieElem.style.position, 'no style position' ); 15 | done(); 16 | } ); 17 | } ); 18 | --------------------------------------------------------------------------------