diff --git a/.circleci/config.yml b/.circleci/config.yml
index cf67d6952..fb37bf1d8 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -7,18 +7,24 @@ jobs:
- checkout
- restore_cache:
+ name: Restore Yarn Package Cache
keys:
- - v1-dependencies-{{ checksum "package.json" }}
- - v1-dependencies-
-
- - run: npm install
+ - yarn-packages-{{ checksum "yarn.lock" }}
+ - run:
+ name: Install Dependencies
+ command: yarn install --immutable
- save_cache:
+ name: Save Yarn Package Cache
+ key: yarn-packages-{{ checksum "yarn.lock" }}
paths:
- - node_modules
- key: v1-dependencies-{{ checksum "package.json" }}
+ - ~/.cache/yarn
+
+ - run:
+ name: Bootstrap with Lerna
+ command: yarn lerna bootstrap
- - run: npm run build:umd
+ - run: yarn build:umd
- run:
name: Compatibility Test
@@ -27,9 +33,9 @@ jobs:
command: |
if [ -z "$CIRCLE_PR_NUMBER" ];
then
- npm run test:compat
+ yarn test:compat
fi
- - run: npm run test
+ - run: yarn test
- store_test_results:
path: /tmp/test-results
diff --git a/.prettierignore b/.prettierignore
deleted file mode 100644
index 649f37d0c..000000000
--- a/.prettierignore
+++ /dev/null
@@ -1 +0,0 @@
-src/utils.ts
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 000000000..c59b8c5de
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "typescript.tsdk": "/home/wayne/Documents/code/nodejs/sortable/node_modules/typescript/lib"
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index cb1218e42..ecd0a0abe 100644
--- a/README.md
+++ b/README.md
@@ -6,566 +6,310 @@ Demo: http://sortablejs.github.io/Sortable/
[ ](https://saucelabs.com/)
-## Features
+todo: add entrypoints table around here somewhere.
- * Supports touch devices and [modern](http://caniuse.com/#search=drag) browsers (including IE9)
- * Can drag from one list to another or within the same list
- * CSS animation when moving items
- * Supports drag handles *and selectable text* (better than voidberg's html5sortable)
- * Smart auto-scrolling
- * Advanced swap detection
- * Smooth animations
- * [Multi-drag](https://github.com/SortableJS/Sortable/tree/master/plugins/MultiDrag) support
- * Support for CSS transforms
- * Built using native HTML5 drag and drop API
- * Supports
- * [Meteor](https://github.com/SortableJS/meteor-sortablejs)
- * Angular
- * [2.0+](https://github.com/SortableJS/angular-sortablejs)
- * [1.*](https://github.com/SortableJS/angular-legacy-sortablejs)
- * React
- * [ES2015+](https://github.com/SortableJS/react-sortablejs)
- * [Mixin](https://github.com/SortableJS/react-mixin-sortablejs)
- * [Knockout](https://github.com/SortableJS/knockout-sortablejs)
- * [Polymer](https://github.com/SortableJS/polymer-sortablejs)
- * [Vue](https://github.com/SortableJS/Vue.Draggable)
- * [Ember](https://github.com/SortableJS/ember-sortablejs)
- * Supports any CSS library, e.g. [Bootstrap](#bs)
- * Simple API
- * Support for [plugins](#plugins)
- * [CDN](#cdn)
- * No jQuery required (but there is [support](https://github.com/SortableJS/jquery-sortablejs))
- * Typescript definitions at `@types/sortablejs`
-
-
-
+## Important Notices
+### Github as CDN deprecation
-### Articles
+It was never fully supported, but we've decided to consciously deprecate the use of fetching files directly from GitHub.
+
+This came to our attention when a few tutorials out on the web (we thank you!) which instruct to import SortableJS directly from our GitHub source repository.
+GitHub is used to develop Sortable, not host it.
+
+The correct way to consume sortable in a HTML script is to use an officially supported CDN, such as jsdelivr or unpkg.
+
+These files now trigger console.warn with a message to come here:
+
+- modular/sortable.core.esm.js
+- modular/sortable.complete.esm.js
+- modular/sortable.esm.js
+- Sortable.js
+- Sortable.min.js
+
+### Bower
+
+Bower has been deprecated, which means we will no longer support it.
+Please replace your usage of bower with npm, yarn or a javascript package manager of your choice.
- * [Dragging Multiple Items in Sortable](https://github.com/SortableJS/Sortable/wiki/Dragging-Multiple-Items-in-Sortable) (April 26, 2019)
- * [Swap Thresholds and Direction](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction) (December 2, 2018)
- * [Sortable v1.0 — New capabilities](https://github.com/SortableJS/Sortable/wiki/Sortable-v1.0-—-New-capabilities/) (December 22, 2014)
- * [Sorting with the help of HTML5 Drag'n'Drop API](https://github.com/SortableJS/Sortable/wiki/Sorting-with-the-help-of-HTML5-Drag'n'Drop-API/) (December 23, 2013)
+## Features
+
+- Supports touch devices and [modern](http://caniuse.com/#search=drag) browsers (including IE9)
+- Can drag from one list to another or within the same list
+- CSS animation when moving items
+- Supports drag handles _and selectable text_ (better than voidberg's html5sortable)
+- Smart auto-scrolling
+- Advanced swap detection
+- Smooth animations
+- [Multi-drag](https://github.com/SortableJS/Sortable/tree/master/plugins/MultiDrag) support
+- Support for CSS transforms
+- Built using native HTML5 drag and drop API
+- Supports
+- Supports any CSS library, e.g. [Bootstrap](#bs)
+- Simple API
+- Support for [plugins](#plugins)
+- [CDN](#cdn)
+- No jQuery required (but there is [support]())
+- Typescript definitions via [@types/sortablejs](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/sortablejs)
+
+### Bindings and Components
+
+There are many bindings for SortableJS to use with your favourite frameworks and libraries:
+
+- [JQuery](https://github.com/SortableJS/jquery-sortablejs)
+- [Meteor](https://github.com/SortableJS/meteor-sortablejs)
+- Angular
+ - [2.0+](https://github.com/SortableJS/angular-sortablejs)
+ - [1.\*](https://github.com/SortableJS/angular-legacy-sortablejs)
+- React
+ - [ES2015+](https://github.com/SortableJS/react-sortablejs)
+ - [Mixin](https://github.com/SortableJS/react-mixin-sortablejs)
+- [Knockout](https://github.com/SortableJS/knockout-sortablejs)
+- [Polymer](https://github.com/SortableJS/polymer-sortablejs)
+- [Vue](https://github.com/SortableJS/Vue.Draggable)
+- [Ember](https://github.com/SortableJS/ember-sortablejs)
+
+### Articles
-
+- [Dragging Multiple Items in Sortable](https://github.com/SortableJS/Sortable/wiki/Dragging-Multiple-Items-in-Sortable) (April 26, 2019)
+- [Swap Thresholds and Direction](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction) (December 2, 2018)
+- [Sortable v1.0 — New capabilities](https://github.com/SortableJS/Sortable/wiki/Sortable-v1.0-—-New-capabilities/) (December 22, 2014)
+- [Sorting with the help of HTML5 Drag'n'Drop API](https://github.com/SortableJS/Sortable/wiki/Sorting-with-the-help-of-HTML5-Drag'n'Drop-API/) (December 23, 2013)
### Getting Started
-Install with NPM:
-```bash
-$ npm install sortablejs --save
-```
+Install via command line using `yarn` or `npm`.
-Install with Bower:
```bash
-$ bower install --save sortablejs
+# npm
+npm install sortablejs --save
+
+# yarn v1.x
+yarn add -D sortablejs
```
Import into your project:
-```js
-// Default SortableJS
-import Sortable from 'sortablejs';
-
-// Core SortableJS (without default plugins)
-import Sortable from 'sortablejs/modular/sortable.core.esm.js';
-// Complete SortableJS (with all plugins)
-import Sortable from 'sortablejs/modular/sortable.complete.esm.js';
+```ts
+// Default SortableJS
+import Sortable from "sortablejs";
+import { Sortable, MultiDrag, Swap, OnSpill, AutoScroll } from "sortablejs";
```
Cherrypick plugins:
-```js
+
+```ts
// Cherrypick extra plugins
-import Sortable, { MultiDrag, Swap } from 'sortablejs';
+import Sortable, { MultiDrag, Swap } from "sortablejs";
Sortable.mount(new MultiDrag(), new Swap());
-
// Cherrypick default plugins
-import Sortable, { AutoScroll } from 'sortablejs/modular/sortable.core.esm.js';
+import Sortable, { AutoScroll } from "sortablejs/modular/sortable.core.esm.js";
Sortable.mount(new AutoScroll());
```
-
---
-
### Usage
+
```html
- item 1
- item 2
- item 3
+ item 1
+ item 2
+ item 3
```
```js
-var el = document.getElementById('items');
+var el = document.getElementById("items");
var sortable = Sortable.create(el);
```
You can use any element for the list and its elements, not just `ul`/`li`. Here is an [example with `div`s](https://jsbin.com/visimub/edit?html,js,output).
-
---
-
### Options
-```js
-var sortable = new Sortable(el, {
- group: "name", // or { name: "...", pull: [true, false, 'clone', array], put: [true, false, array] }
- sort: true, // sorting inside list
- delay: 0, // time in milliseconds to define when the sorting should start
- delayOnTouchOnly: false, // only delay if user is using touch
- touchStartThreshold: 0, // px, how many pixels the point should move before cancelling a delayed drag event
- disabled: false, // Disables the sortable if set to true.
- store: null, // @see Store
- animation: 150, // ms, animation speed moving items when sorting, `0` — without animation
- easing: "cubic-bezier(1, 0, 0, 1)", // Easing for animation. Defaults to null. See https://easings.net/ for examples.
- handle: ".my-handle", // Drag handle selector within list items
- filter: ".ignore-elements", // Selectors that do not lead to dragging (String or Function)
- preventOnFilter: true, // Call `event.preventDefault()` when triggered `filter`
- draggable: ".item", // Specifies which items inside the element should be draggable
-
- dataIdAttr: 'data-id',
-
- ghostClass: "sortable-ghost", // Class name for the drop placeholder
- chosenClass: "sortable-chosen", // Class name for the chosen item
- dragClass: "sortable-drag", // Class name for the dragging item
-
- swapThreshold: 1, // Threshold of the swap zone
- invertSwap: false, // Will always use inverted swap zone if set to true
- invertedSwapThreshold: 1, // Threshold of the inverted swap zone (will be set to swapThreshold value by default)
- direction: 'horizontal', // Direction of Sortable (will be detected automatically if not given)
-
- forceFallback: false, // ignore the HTML5 DnD behaviour and force the fallback to kick in
-
- fallbackClass: "sortable-fallback", // Class name for the cloned DOM Element when using forceFallback
- fallbackOnBody: false, // Appends the cloned DOM Element into the Document's Body
- fallbackTolerance: 0, // Specify in pixels how far the mouse should move before it's considered as a drag.
-
- dragoverBubble: false,
- removeCloneOnHide: true, // Remove the clone element when it is not showing, rather than just hiding it
- emptyInsertThreshold: 5, // px, distance mouse must be from empty sortable to insert drag element into it
-
-
- setData: function (/** DataTransfer */dataTransfer, /** HTMLElement*/dragEl) {
- dataTransfer.setData('Text', dragEl.textContent); // `dataTransfer` object of HTML5 DragEvent
- },
-
- // Element is chosen
- onChoose: function (/**Event*/evt) {
- evt.oldIndex; // element index within parent
- },
-
- // Element is unchosen
- onUnchoose: function(/**Event*/evt) {
- // same properties as onEnd
- },
-
- // Element dragging started
- onStart: function (/**Event*/evt) {
- evt.oldIndex; // element index within parent
- },
-
- // Element dragging ended
- onEnd: function (/**Event*/evt) {
- var itemEl = evt.item; // dragged HTMLElement
- evt.to; // target list
- evt.from; // previous list
- evt.oldIndex; // element's old index within old parent
- evt.newIndex; // element's new index within new parent
- evt.oldDraggableIndex; // element's old index within old parent, only counting draggable elements
- evt.newDraggableIndex; // element's new index within new parent, only counting draggable elements
- evt.clone // the clone element
- evt.pullMode; // when item is in another sortable: `"clone"` if cloning, `true` if moving
- },
-
- // Element is dropped into the list from another list
- onAdd: function (/**Event*/evt) {
- // same properties as onEnd
- },
-
- // Changed sorting within list
- onUpdate: function (/**Event*/evt) {
- // same properties as onEnd
- },
-
- // Called by any change to the list (add / update / remove)
- onSort: function (/**Event*/evt) {
- // same properties as onEnd
- },
-
- // Element is removed from the list into another list
- onRemove: function (/**Event*/evt) {
- // same properties as onEnd
- },
-
- // Attempt to drag a filtered element
- onFilter: function (/**Event*/evt) {
- var itemEl = evt.item; // HTMLElement receiving the `mousedown|tapstart` event.
- },
-
- // Event when you move an item in the list or between lists
- onMove: function (/**Event*/evt, /**Event*/originalEvent) {
- // Example: https://jsbin.com/nawahef/edit?js,output
- evt.dragged; // dragged HTMLElement
- evt.draggedRect; // DOMRect {left, top, right, bottom}
- evt.related; // HTMLElement on which have guided
- evt.relatedRect; // DOMRect
- evt.willInsertAfter; // Boolean that is true if Sortable will insert drag element after target by default
- originalEvent.clientY; // mouse position
- // return false; — for cancel
- // return -1; — insert before target
- // return 1; — insert after target
- // return true; — keep default insertion point based on the direction
- // return void; — keep default insertion point based on the direction
- },
-
- // Called when creating a clone of element
- onClone: function (/**Event*/evt) {
- var origEl = evt.item;
- var cloneEl = evt.clone;
- },
-
- // Called when dragging element changes position
- onChange: function(/**Event*/evt) {
- evt.newIndex // most likely why this event is used is to get the dragging element's current index
- // same properties as onEnd
- }
-});
-```
-
-
----
-
-
-#### `group` option
-To drag elements from one list into another, both lists must have the same `group` value.
-You can also define whether lists can give away, give and keep a copy (`clone`), and receive elements.
-
- * name: `String` — group name
- * pull: `true|false|["foo", "bar"]|'clone'|function` — ability to move from the list. `clone` — copy the item, rather than move. Or an array of group names which the elements may be put in. Defaults to `true`.
- * put: `true|false|["baz", "qux"]|function` — whether elements can be added from other lists, or an array of group names from which elements can be added.
- * revertClone: `boolean` — revert cloned element to initial position after moving to a another list.
-
-
-Demo:
- - https://jsbin.com/hijetos/edit?js,output
- - https://jsbin.com/nacoyah/edit?js,output — use of complex logic in the `pull` and` put`
- - https://jsbin.com/bifuyab/edit?js,output — use `revertClone: true`
-
-
----
-
-
-#### `sort` option
-Allow sorting inside list.
-
-Demo: https://jsbin.com/jayedig/edit?js,output
-
-
----
-
-
-#### `delay` option
-Time in milliseconds to define when the sorting should start.
-Unfortunately, due to browser restrictions, delaying is not possible on IE or Edge with native drag & drop.
-
-Demo: https://jsbin.com/zosiwah/edit?js,output
-
-
----
-
-
-#### `delayOnTouchOnly` option
-Whether or not the delay should be applied only if the user is using touch (eg. on a mobile device). No delay will be applied in any other case. Defaults to `false`.
-
-
----
-
-
-#### `swapThreshold` option
-Percentage of the target that the swap zone will take up, as a float between `0` and `1`.
-
-[Read more](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#swap-threshold)
-
-Demo: http://sortablejs.github.io/Sortable#thresholds
-
-
----
-
-
-#### `invertSwap` option
-Set to `true` to set the swap zone to the sides of the target, for the effect of sorting "in between" items.
-
-[Read more](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#forcing-inverted-swap-zone)
-
-Demo: http://sortablejs.github.io/Sortable#thresholds
-
-
----
-
-
-#### `invertedSwapThreshold` option
-Percentage of the target that the inverted swap zone will take up, as a float between `0` and `1`. If not given, will default to `swapThreshold`.
-
-[Read more](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#dealing-with-swap-glitching)
-
-
----
-
-
-#### `direction` option
-Direction that the Sortable should sort in. Can be set to `'vertical'`, `'horizontal'`, or a function, which will be called whenever a target is dragged over. Must return `'vertical'` or `'horizontal'`.
-
-[Read more](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#direction)
-
-
-Example of direction detection for vertical list that includes full column and half column elements:
-
-```js
-Sortable.create(el, {
- direction: function(evt, target, dragEl) {
- if (target !== null && target.className.includes('half-column') && dragEl.className.includes('half-column')) {
- return 'horizontal';
- }
- return 'vertical';
- }
-});
-```
-
-
----
-
-
-#### `touchStartThreshold` option
-This option is similar to `fallbackTolerance` option.
-
-When the `delay` option is set, some phones with very sensitive touch displays like the Samsung Galaxy S8 will fire
-unwanted touchmove events even when your finger is not moving, resulting in the sort not triggering.
-
-This option sets the minimum pointer movement that must occur before the delayed sorting is cancelled.
-
-Values between 3 to 5 are good.
-
-
----
-
-
-#### `disabled` options
-Disables the sortable if set to `true`.
-
-Demo: https://jsbin.com/sewokud/edit?js,output
-
-```js
-var sortable = Sortable.create(list);
-
-document.getElementById("switcher").onclick = function () {
- var state = sortable.option("disabled"); // get
-
- sortable.option("disabled", !state); // set
-};
-```
-
-
----
-
-
-#### `handle` option
-To make list items draggable, Sortable disables text selection by the user.
-That's not always desirable. To allow text selection, define a drag handler,
-which is an area of every list element that allows it to be dragged around.
-
-Demo: https://jsbin.com/numakuh/edit?html,js,output
-
-```js
-Sortable.create(el, {
- handle: ".my-handle"
-});
-```
-
-```html
-
- :: list item text one
- :: list item text two
-
-```
-
-```css
-.my-handle {
- cursor: move;
- cursor: -webkit-grabbing;
-}
-```
-
-
----
-
-
-#### `filter` option
-
-
-```js
-Sortable.create(list, {
- filter: ".js-remove, .js-edit",
- onFilter: function (evt) {
- var item = evt.item,
- ctrl = evt.target;
-
- if (Sortable.utils.is(ctrl, ".js-remove")) { // Click on remove button
- item.parentNode.removeChild(item); // remove sortable item
- }
- else if (Sortable.utils.is(ctrl, ".js-edit")) { // Click on edit link
- // ...
- }
- }
-})
-```
-
-
----
-
-
-#### `ghostClass` option
-Class name for the drop placeholder (default `sortable-ghost`).
-
-Demo: https://jsbin.com/henuyiw/edit?css,js,output
-
-```css
-.ghost {
- opacity: 0.4;
-}
-```
-
-```js
-Sortable.create(list, {
- ghostClass: "ghost"
-});
-```
-
-
----
-
-
-#### `chosenClass` option
-Class name for the chosen item (default `sortable-chosen`).
-Demo: https://jsbin.com/hoqufox/edit?css,js,output
+Here we've summarised the options with their ~~default values~~ example values. More details available in the [docs/sortable-options](https://github.com/SortableJS/Sortable/tree/master/docs/sortable-options)
-```css
-.chosen {
- color: #fff;
- background-color: #c00;
-}
-```
-
-```js
-Sortable.create(list, {
- delay: 500,
- chosenClass: "chosen"
+```ts
+var sortable = new Sortable(el, {
+ // variables
+
+ group: "name", // or { name: "...", pull: [true, false, 'clone', array], put: [true, false, array] }
+ sort: true, // sorting inside list
+ delay: 0, // time in milliseconds to define when the sorting should start
+ delayOnTouchOnly: false, // only delay if user is using touch
+ touchStartThreshold: 0, // px, how many pixels the point should move before cancelling a delayed drag event
+ disabled: false, // Disables the sortable if set to true.
+ store: null, // @see Store
+ animation: 150, // ms, animation speed moving items when sorting, `0` — without animation
+ easing: "cubic-bezier(1, 0, 0, 1)", // Easing for animation. Defaults to null. See https://easings.net/ for examples.
+ handle: ".my-handle", // Drag handle selector within list items
+ filter: ".ignore-elements", // Selectors that do not lead to dragging (String or Function)
+ preventOnFilter: true, // Call `event.preventDefault()` when triggered `filter`
+ draggable: ".item", // Specifies which items inside the element should be draggable
+
+ dataIdAttr: "data-id",
+
+ ghostClass: "sortable-ghost", // Class name for the drop placeholder
+ chosenClass: "sortable-chosen", // Class name for the chosen item
+ dragClass: "sortable-drag", // Class name for the dragging item
+
+ swapThreshold: 1, // Threshold of the swap zone
+ invertSwap: false, // Will always use inverted swap zone if set to true
+ invertedSwapThreshold: 1, // Threshold of the inverted swap zone (will be set to swapThreshold value by default)
+ direction: "horizontal", // Direction of Sortable (will be detected automatically if not given)
+
+ forceFallback: false, // ignore the HTML5 DnD behaviour and force the fallback to kick in
+
+ fallbackClass: "sortable-fallback", // Class name for the cloned DOM Element when using forceFallback
+ fallbackOnBody: false, // Appends the cloned DOM Element into the Document's Body
+ fallbackTolerance: 0, // Specify in pixels how far the mouse should move before it's considered as a drag.
+
+ dragoverBubble: false,
+ removeCloneOnHide: true, // Remove the clone element when it is not showing, rather than just hiding it
+ emptyInsertThreshold: 5, // px, distance mouse must be from empty sortable to insert drag element into it
+
+ // handlers/hooks - listen to sortable events here.
+
+ setData: function (
+ /** DataTransfer */ dataTransfer,
+ /** HTMLElement*/ dragEl
+ ) {
+ dataTransfer.setData("Text", dragEl.textContent); // `dataTransfer` object of HTML5 DragEvent
+ },
+
+ // Element is chosen
+ onChoose: function (/**Event*/ evt) {
+ evt.oldIndex; // element index within parent
+ },
+
+ // Element is unchosen
+ onUnchoose: function (/**Event*/ evt) {
+ // same properties as onEnd
+ },
+
+ // Element dragging started
+ onStart: function (/**Event*/ evt) {
+ evt.oldIndex; // element index within parent
+ },
+
+ // Element dragging ended
+ onEnd: function (/**Event*/ evt) {
+ var itemEl = evt.item; // dragged HTMLElement
+ evt.to; // target list
+ evt.from; // previous list
+ evt.oldIndex; // element's old index within old parent
+ evt.newIndex; // element's new index within new parent
+ evt.oldDraggableIndex; // element's old index within old parent, only counting draggable elements
+ evt.newDraggableIndex; // element's new index within new parent, only counting draggable elements
+ evt.clone; // the clone element
+ evt.pullMode; // when item is in another sortable: `"clone"` if cloning, `true` if moving
+ },
+
+ // Element is dropped into the list from another list
+ onAdd: function (/**Event*/ evt) {
+ // same properties as onEnd
+ },
+
+ // Changed sorting within list
+ onUpdate: function (/**Event*/ evt) {
+ // same properties as onEnd
+ },
+
+ // Called by any change to the list (add / update / remove)
+ onSort: function (/**Event*/ evt) {
+ // same properties as onEnd
+ },
+
+ // Element is removed from the list into another list
+ onRemove: function (/**Event*/ evt) {
+ // same properties as onEnd
+ },
+
+ // Attempt to drag a filtered element
+ onFilter: function (/**Event*/ evt) {
+ var itemEl = evt.item; // HTMLElement receiving the `mousedown|tapstart` event.
+ },
+
+ // Event when you move an item in the list or between lists
+ onMove: function (/**Event*/ evt, /**Event*/ originalEvent) {
+ // Example: https://jsbin.com/nawahef/edit?js,output
+ evt.dragged; // dragged HTMLElement
+ evt.draggedRect; // DOMRect {left, top, right, bottom}
+ evt.related; // HTMLElement on which have guided
+ evt.relatedRect; // DOMRect
+ evt.willInsertAfter; // Boolean that is true if Sortable will insert drag element after target by default
+ originalEvent.clientY; // mouse position
+ // return false; — for cancel
+ // return -1; — insert before target
+ // return 1; — insert after target
+ // return true; — keep default insertion point based on the direction
+ // return void; — keep default insertion point based on the direction
+ },
+
+ // Called when creating a clone of element
+ onClone: function (/**Event*/ evt) {
+ var origEl = evt.item;
+ var cloneEl = evt.clone;
+ },
+
+ // Called when dragging element changes position
+ onChange: function (/**Event*/ evt) {
+ evt.newIndex; // most likely why this event is used is to get the dragging element's current index
+ // same properties as onEnd
+ },
});
```
-
----
-
-
-#### `forceFallback` option
-If set to `true`, the Fallback for non HTML5 Browser will be used, even if we are using an HTML5 Browser.
-This gives us the possibility to test the behaviour for older Browsers even in newer Browser, or make the Drag 'n Drop feel more consistent between Desktop , Mobile and old Browsers.
-
-On top of that, the Fallback always generates a copy of that DOM Element and appends the class `fallbackClass` defined in the options. This behaviour controls the look of this 'dragged' Element.
-
-Demo: https://jsbin.com/sibiput/edit?html,css,js,output
-
-
----
-
-
-#### `fallbackTolerance` option
-Emulates the native drag threshold. Specify in pixels how far the mouse should move before it's considered as a drag.
-Useful if the items are also clickable like in a list of links.
-
-When the user clicks inside a sortable element, it's not uncommon for your hand to move a little between the time you press and the time you release.
-Dragging only starts if you move the pointer past a certain tolerance, so that you don't accidentally start dragging every time you click.
-
-3 to 5 are probably good values.
-
-
----
-
-
-#### `dragoverBubble` option
-If set to `true`, the dragover event will bubble to parent sortables. Works on both fallback and native dragover event.
-By default, it is false, but Sortable will only stop bubbling the event once the element has been inserted into a parent Sortable, or *can* be inserted into a parent Sortable, but isn't at that specific time (due to animation, etc).
-
-Since 1.8.0, you will probably want to leave this option as false. Before 1.8.0, it may need to be `true` for nested sortables to work.
-
-
----
-
-
-#### `removeCloneOnHide` option
-If set to `false`, the clone is hidden by having it's CSS `display` property set to `none`.
-By default, this option is `true`, meaning Sortable will remove the cloned element from the DOM when it is supposed to be hidden.
-
-
---
-
-#### `emptyInsertThreshold` option
-The distance (in pixels) the mouse must be from an empty sortable while dragging for the drag element to be inserted into that sortable. Defaults to `5`. Set to `0` to disable this feature.
-
-Demo: https://jsbin.com/becavoj/edit?js,output
-
-
----
### Event object ([demo](https://jsbin.com/fogujiv/edit?js,output))
- - to:`HTMLElement` — list, in which moved element
- - from:`HTMLElement` — previous list
- - item:`HTMLElement` — dragged element
- - clone:`HTMLElement`
- - oldIndex:`Number|undefined` — old index within parent
- - newIndex:`Number|undefined` — new index within parent
- - oldDraggableIndex: `Number|undefined` — old index within parent, only counting draggable elements
- - newDraggableIndex: `Number|undefined` — new index within parent, only counting draggable elements
- - pullMode:`String|Boolean|undefined` — Pull mode if dragging into another sortable (`"clone"`, `true`, or `false`), otherwise undefined
-
+- to:`HTMLElement` — list, in which moved element
+- from:`HTMLElement` — previous list
+- item:`HTMLElement` — dragged element
+- clone:`HTMLElement`
+- oldIndex:`Number|undefined` — old index within parent
+- newIndex:`Number|undefined` — new index within parent
+- oldDraggableIndex: `Number|undefined` — old index within parent, only counting draggable elements
+- newDraggableIndex: `Number|undefined` — new index within parent, only counting draggable elements
+- pullMode:`String|Boolean|undefined` — Pull mode if dragging into another sortable (`"clone"`, `true`, or `false`), otherwise undefined
#### `move` event object
- - to:`HTMLElement`
- - from:`HTMLElement`
- - dragged:`HTMLElement`
- - draggedRect:`DOMRect`
- - related:`HTMLElement` — element on which have guided
- - relatedRect:`DOMRect`
- - willInsertAfter:`Boolean` — `true` if will element be inserted after target (or `false` if before)
+- to:`HTMLElement`
+- from:`HTMLElement`
+- dragged:`HTMLElement`
+- draggedRect:`DOMRect`
+- related:`HTMLElement` — element on which have guided
+- relatedRect:`DOMRect`
+- willInsertAfter:`Boolean` — `true` if will element be inserted after target (or `false` if before)
---
+### Methods
-### Method
-
+These are available on each Sortable instance (the return value of `new Sortable({})`)
##### option(name:`String`[, value:`*`]):`*`
-Get or set the option.
-
+Get or set the option.
##### closest(el:`HTMLElement`[, selector:`String`]):`HTMLElement|null`
-For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
+For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
##### toArray():`String[]`
-Serializes the sortable's item `data-id`'s (`dataIdAttr` option) into an array of string.
+Serializes the sortable's item `data-id`'s (`dataIdAttr` option) into an array of string.
##### sort(order:`String[]`)
+
Sorts the elements according to the array.
```js
@@ -573,178 +317,136 @@ var order = sortable.toArray();
sortable.sort(order.reverse()); // apply
```
-
##### save()
-Save the current sorting (see [store](#store))
+Save the current sorting (see [store](#store))
##### destroy()
-Removes the sortable functionality completely.
+Removes the sortable functionality completely.
---
-
+
### Store
+
Saving and restoring of the sort.
```html
- order
- save
- restore
+ order
+ save
+ restore
```
```js
Sortable.create(el, {
- group: "localStorage-example",
- store: {
- /**
- * Get the order of elements. Called once during initialization.
- * @param {Sortable} sortable
- * @returns {Array}
- */
- get: function (sortable) {
- var order = localStorage.getItem(sortable.options.group.name);
- return order ? order.split('|') : [];
- },
-
- /**
- * Save the order of elements. Called onEnd (when the item is dropped).
- * @param {Sortable} sortable
- */
- set: function (sortable) {
- var order = sortable.toArray();
- localStorage.setItem(sortable.options.group.name, order.join('|'));
- }
- }
-})
-```
-
-
----
-
-
-
-### Bootstrap
-Demo: https://jsbin.com/visimub/edit?html,js,output
-
-```html
-
-
-
-
-
-
-
-
-
-
- This is Sortable
- It works with Bootstrap...
- ...out of the box.
- It has support for touch devices.
- Just drag some elements around.
-
-
-
+ group: "localStorage-example",
+ store: {
+ /**
+ * Get the order of elements. Called once during initialization.
+ * @param {Sortable} sortable
+ * @returns {Array}
+ */
+ get: function (sortable) {
+ var order = localStorage.getItem(sortable.options.group.name);
+ return order ? order.split("|") : [];
+ },
+
+ /**
+ * Save the order of elements. Called onEnd (when the item is dropped).
+ * @param {Sortable} sortable
+ */
+ set: function (sortable) {
+ var order = sortable.toArray();
+ localStorage.setItem(sortable.options.group.name, order.join("|"));
+ },
+ },
+});
```
-
----
-
+todo: overview of Sortable API Surface
### Static methods & properties
-
-
##### Sortable.create(el:`HTMLElement`[, options:`Object`]):`Sortable`
-Create new instance.
+Create new instance.
---
-
##### Sortable.active:`Sortable`
-The active Sortable instance.
+The active Sortable instance.
---
-
##### Sortable.dragged:`HTMLElement`
-The element being dragged.
+The element being dragged.
---
-
##### Sortable.ghost:`HTMLElement`
-The ghost element.
+The ghost element.
---
-
##### Sortable.clone:`HTMLElement`
-The clone element.
+The clone element.
---
-
##### Sortable.get(element:`HTMLElement`):`Sortable`
-Get the Sortable instance on an element.
+Get the Sortable instance on an element.
---
-
##### Sortable.mount(plugin:`...SortablePlugin|SortablePlugin[]`)
-Mounts a plugin to Sortable.
+Mounts a plugin to Sortable.
---
-
##### Sortable.utils
-* on(el`:HTMLElement`, event`:String`, fn`:Function`) — attach an event handler function
-* off(el`:HTMLElement`, event`:String`, fn`:Function`) — remove an event handler
-* css(el`:HTMLElement`)`:Object` — get the values of all the CSS properties
-* css(el`:HTMLElement`, prop`:String`)`:Mixed` — get the value of style properties
-* css(el`:HTMLElement`, prop`:String`, value`:String`) — set one CSS properties
-* css(el`:HTMLElement`, props`:Object`) — set more CSS properties
-* find(ctx`:HTMLElement`, tagName`:String`[, iterator`:Function`])`:Array` — get elements by tag name
-* bind(ctx`:Mixed`, fn`:Function`)`:Function` — Takes a function and returns a new one that will always have a particular context
-* is(el`:HTMLElement`, selector`:String`)`:Boolean` — check the current matched set of elements against a selector
-* closest(el`:HTMLElement`, selector`:String`[, ctx`:HTMLElement`])`:HTMLElement|Null` — for each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree
-* clone(el`:HTMLElement`)`:HTMLElement` — create a deep copy of the set of matched elements
-* toggleClass(el`:HTMLElement`, name`:String`, state`:Boolean`) — add or remove one classes from each element
-* detectDirection(el`:HTMLElement`)`:String` — automatically detect the [direction](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#direction) of the element as either `'vertical'` or `'horizontal'`
+- on(el`:HTMLElement`, event`:String`, fn`:Function`) — attach an event handler function
+- off(el`:HTMLElement`, event`:String`, fn`:Function`) — remove an event handler
+- css(el`:HTMLElement`)`:Object` — get the values of all the CSS properties
+- css(el`:HTMLElement`, prop`:String`)`:Mixed` — get the value of style properties
+- css(el`:HTMLElement`, prop`:String`, value`:String`) — set one CSS properties
+- css(el`:HTMLElement`, props`:Object`) — set more CSS properties
+- find(ctx`:HTMLElement`, tagName`:String`[, iterator`:Function`])`:Array` — get elements by tag name
+- bind(ctx`:Mixed`, fn`:Function`)`:Function` — Takes a function and returns a new one that will always have a particular context
+- is(el`:HTMLElement`, selector`:String`)`:Boolean` — check the current matched set of elements against a selector
+- closest(el`:HTMLElement`, selector`:String`[, ctx`:HTMLElement`])`:HTMLElement|Null` — for each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree
+- clone(el`:HTMLElement`)`:HTMLElement` — create a deep copy of the set of matched elements
+- toggleClass(el`:HTMLElement`, name`:String`, state`:Boolean`) — add or remove one classes from each element
+- detectDirection(el`:HTMLElement`)`:String` — automatically detect the [direction](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#direction) of the element as either `'vertical'` or `'horizontal'`
---
-
### Plugins
+
#### Extra Plugins (included in complete versions)
- - [MultiDrag](https://github.com/SortableJS/Sortable/tree/master/plugins/MultiDrag)
- - [Swap](https://github.com/SortableJS/Sortable/tree/master/plugins/Swap)
+
+- [MultiDrag](https://github.com/SortableJS/Sortable/tree/master/plugins/MultiDrag)
+- [Swap](https://github.com/SortableJS/Sortable/tree/master/plugins/Swap)
#### Default Plugins (included in default versions)
- - [AutoScroll](https://github.com/SortableJS/Sortable/tree/master/plugins/AutoScroll)
- - [OnSpill](https://github.com/SortableJS/Sortable/tree/master/plugins/OnSpill)
+- [AutoScroll](https://github.com/SortableJS/Sortable/tree/master/plugins/AutoScroll)
+- [OnSpill](https://github.com/SortableJS/Sortable/tree/master/plugins/OnSpill)
---
-
+
### CDN
```html
@@ -752,18 +454,14 @@ Mounts a plugin to Sortable.
```
-
---
-
### Contributing (Issue/PR)
Please, [read this](CONTRIBUTING.md).
-
---
-
## Contributors
### Code Contributors
@@ -793,23 +491,3 @@ Support this project with your organization. Your logo will show up here with a
-
-## MIT LICENSE
-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:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-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.
diff --git a/Sortable.js b/Sortable.js
index 11b7cec3e..ecde9817a 100644
--- a/Sortable.js
+++ b/Sortable.js
@@ -5,183 +5,204 @@
* @license MIT
*/
(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Sortable = factory());
-}(this, (function () { 'use strict';
+ typeof exports === "object" && typeof module !== "undefined"
+ ? (module.exports = factory())
+ : typeof define === "function" && define.amd
+ ? define(factory)
+ : ((global =
+ typeof globalThis !== "undefined" ? globalThis : global || self),
+ (global.Sortable = factory()));
+})(this, function () {
+ "use strict";
+ const __warn =
+ "" +
+ "Importing Sortable directly from GitHub is deprecated.\n" +
+ "This file will not receive any more updates.\n" +
+ "Please follow the usage instructions to continue getting support: https://github.com/SortableJS/Sortable";
+
+ console.warn(__warn);
var version = "1.11.0";
function userAgent(pattern) {
- if (typeof window !== 'undefined' && window.navigator) {
- return !!/*@__PURE__*/navigator.userAgent.match(pattern);
- }
+ if (typeof window !== "undefined" && window.navigator) {
+ return !!(/*@__PURE__*/ navigator.userAgent.match(pattern));
+ }
}
- const IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i);
+ const IE11OrLess = userAgent(
+ /(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i
+ );
const Edge = userAgent(/Edge/i);
const FireFox = userAgent(/firefox/i);
- const Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);
+ const Safari =
+ userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);
const IOS = userAgent(/iP(ad|od|hone)/i);
const ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);
const captureMode = {
- capture: false,
- passive: false
+ capture: false,
+ passive: false,
};
function on(el, event, fn) {
- el.addEventListener(event, fn, !IE11OrLess && captureMode);
+ el.addEventListener(event, fn, !IE11OrLess && captureMode);
}
function off(el, event, fn) {
- el.removeEventListener(event, fn, !IE11OrLess && captureMode);
+ el.removeEventListener(event, fn, !IE11OrLess && captureMode);
}
- function matches(/**HTMLElement*/el, /**String*/selector) {
- if (!selector) return;
-
- selector[0] === '>' && (selector = selector.substring(1));
-
- if (el) {
- try {
- if (el.matches) {
- return el.matches(selector);
- } else if (el.msMatchesSelector) {
- return el.msMatchesSelector(selector);
- } else if (el.webkitMatchesSelector) {
- return el.webkitMatchesSelector(selector);
- }
- } catch(_) {
- return false;
- }
- }
-
- return false;
+ function matches(/**HTMLElement*/ el, /**String*/ selector) {
+ if (!selector) return;
+
+ selector[0] === ">" && (selector = selector.substring(1));
+
+ if (el) {
+ try {
+ if (el.matches) {
+ return el.matches(selector);
+ } else if (el.msMatchesSelector) {
+ return el.msMatchesSelector(selector);
+ } else if (el.webkitMatchesSelector) {
+ return el.webkitMatchesSelector(selector);
+ }
+ } catch (_) {
+ return false;
+ }
+ }
+
+ return false;
}
function getParentOrHost(el) {
- return (el.host && el !== document && el.host.nodeType)
- ? el.host
- : el.parentNode;
+ return el.host && el !== document && el.host.nodeType
+ ? el.host
+ : el.parentNode;
}
- function closest(/**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {
- if (el) {
- ctx = ctx || document;
-
- do {
- if (
- selector != null &&
- (
- selector[0] === '>' ?
- el.parentNode === ctx && matches(el, selector) :
- matches(el, selector)
- ) ||
- includeCTX && el === ctx
- ) {
- return el;
- }
-
- if (el === ctx) break;
- /* jshint boss:true */
- } while (el = getParentOrHost(el));
- }
-
- return null;
+ function closest(
+ /**HTMLElement*/ el,
+ /**String*/ selector,
+ /**HTMLElement*/ ctx,
+ includeCTX
+ ) {
+ if (el) {
+ ctx = ctx || document;
+
+ do {
+ if (
+ (selector != null &&
+ (selector[0] === ">"
+ ? el.parentNode === ctx && matches(el, selector)
+ : matches(el, selector))) ||
+ (includeCTX && el === ctx)
+ ) {
+ return el;
+ }
+
+ if (el === ctx) break;
+ /* jshint boss:true */
+ } while ((el = getParentOrHost(el)));
+ }
+
+ return null;
}
const R_SPACE = /\s+/g;
function toggleClass(el, name, state) {
- if (el && name) {
- if (el.classList) {
- el.classList[state ? 'add' : 'remove'](name);
- }
- else {
- let className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');
- el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');
- }
- }
+ if (el && name) {
+ if (el.classList) {
+ el.classList[state ? "add" : "remove"](name);
+ } else {
+ let className = (" " + el.className + " ")
+ .replace(R_SPACE, " ")
+ .replace(" " + name + " ", " ");
+ el.className = (className + (state ? " " + name : "")).replace(
+ R_SPACE,
+ " "
+ );
+ }
+ }
}
-
function css(el, prop, val) {
- let style = el && el.style;
-
- if (style) {
- if (val === void 0) {
- if (document.defaultView && document.defaultView.getComputedStyle) {
- val = document.defaultView.getComputedStyle(el, '');
- }
- else if (el.currentStyle) {
- val = el.currentStyle;
- }
-
- return prop === void 0 ? val : val[prop];
- }
- else {
- if (!(prop in style) && prop.indexOf('webkit') === -1) {
- prop = '-webkit-' + prop;
- }
-
- style[prop] = val + (typeof val === 'string' ? '' : 'px');
- }
- }
+ let style = el && el.style;
+
+ if (style) {
+ if (val === void 0) {
+ if (document.defaultView && document.defaultView.getComputedStyle) {
+ val = document.defaultView.getComputedStyle(el, "");
+ } else if (el.currentStyle) {
+ val = el.currentStyle;
+ }
+
+ return prop === void 0 ? val : val[prop];
+ } else {
+ if (!(prop in style) && prop.indexOf("webkit") === -1) {
+ prop = "-webkit-" + prop;
+ }
+
+ style[prop] = val + (typeof val === "string" ? "" : "px");
+ }
+ }
}
function matrix(el, selfOnly) {
- let appliedTransforms = '';
- if (typeof(el) === 'string') {
- appliedTransforms = el;
- } else {
- do {
- //@ts-ignore
- let transform = css(el, 'transform');
-
- if (transform && transform !== 'none') {
- appliedTransforms = transform + ' ' + appliedTransforms;
- }
- /* jshint boss:true */
- } while (!selfOnly && (el = el.parentNode));
- }
-
- //@ts-ignore
- const matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;
- /*jshint -W056 */
- return matrixFn && (new matrixFn(appliedTransforms));
- }
+ let appliedTransforms = "";
+ if (typeof el === "string") {
+ appliedTransforms = el;
+ } else {
+ do {
+ //@ts-ignore
+ let transform = css(el, "transform");
+
+ if (transform && transform !== "none") {
+ appliedTransforms = transform + " " + appliedTransforms;
+ }
+ /* jshint boss:true */
+ } while (!selfOnly && (el = el.parentNode));
+ }
+ //@ts-ignore
+ const matrixFn =
+ window.DOMMatrix ||
+ window.WebKitCSSMatrix ||
+ window.CSSMatrix ||
+ window.MSCSSMatrix;
+ /*jshint -W056 */
+ return matrixFn && new matrixFn(appliedTransforms);
+ }
function find(ctx, tagName, iterator) {
- if (ctx) {
- let list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;
+ if (ctx) {
+ let list = ctx.getElementsByTagName(tagName),
+ i = 0,
+ n = list.length;
- if (iterator) {
- for (; i < n; i++) {
- iterator(list[i], i);
- }
- }
+ if (iterator) {
+ for (; i < n; i++) {
+ iterator(list[i], i);
+ }
+ }
- return list;
- }
+ return list;
+ }
- return [];
+ return [];
}
-
-
function getWindowScrollingElement() {
- let scrollingElement = document.scrollingElement;
+ let scrollingElement = document.scrollingElement;
- if (scrollingElement) {
- return scrollingElement
- } else {
- return document.documentElement
- }
+ if (scrollingElement) {
+ return scrollingElement;
+ } else {
+ return document.documentElement;
+ }
}
-
/**
* Returns the "bounding client rect" of given element
* @param {HTMLElement} el The element whose boundingClientRect is wanted
@@ -191,97 +212,101 @@
* @param {[HTMLElement]} container The parent the element will be placed in
* @return {Object} The boundingClientRect of el, with specified adjustments
*/
- function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {
- if (!el.getBoundingClientRect && el !== window) return;
-
- let elRect,
- top,
- left,
- bottom,
- right,
- height,
- width;
-
- if (el !== window && el !== getWindowScrollingElement()) {
- elRect = el.getBoundingClientRect();
- top = elRect.top;
- left = elRect.left;
- bottom = elRect.bottom;
- right = elRect.right;
- height = elRect.height;
- width = elRect.width;
- } else {
- top = 0;
- left = 0;
- bottom = window.innerHeight;
- right = window.innerWidth;
- height = window.innerHeight;
- width = window.innerWidth;
- }
-
- if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {
- // Adjust for translate()
- container = container || el.parentNode;
-
- // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)
- // Not needed on <= IE11
- if (!IE11OrLess) {
- do {
- if (
- container &&
- container.getBoundingClientRect &&
- (
- //@ts-ignore
- css(container, 'transform') !== 'none' ||
- relativeToNonStaticParent &&
- //@ts-ignore
- css(container, 'position') !== 'static'
- )
- ) {
- let containerRect = container.getBoundingClientRect();
-
- // Set relative to edges of padding box of container
- //@ts-ignore
- top -= containerRect.top + parseInt(css(container, 'border-top-width'));
- //@ts-ignore
- left -= containerRect.left + parseInt(css(container, 'border-left-width'));
- bottom = top + elRect.height;
- right = left + elRect.width;
-
- break;
- }
- /* jshint boss:true */
- } while (container = container.parentNode);
- }
- }
-
- if (undoScale && el !== window) {
- // Adjust for scale()
- //@ts-ignore
- let elMatrix = matrix(container || el),
- scaleX = elMatrix && elMatrix.a,
- scaleY = elMatrix && elMatrix.d;
-
- if (elMatrix) {
- top /= scaleY;
- left /= scaleX;
-
- width /= scaleX;
- height /= scaleY;
-
- bottom = top + height;
- right = left + width;
- }
- }
-
- return {
- top: top,
- left: left,
- bottom: bottom,
- right: right,
- width: width,
- height: height
- };
+ function getRect(
+ el,
+ relativeToContainingBlock,
+ relativeToNonStaticParent,
+ undoScale,
+ container
+ ) {
+ if (!el.getBoundingClientRect && el !== window) return;
+
+ let elRect, top, left, bottom, right, height, width;
+
+ if (el !== window && el !== getWindowScrollingElement()) {
+ elRect = el.getBoundingClientRect();
+ top = elRect.top;
+ left = elRect.left;
+ bottom = elRect.bottom;
+ right = elRect.right;
+ height = elRect.height;
+ width = elRect.width;
+ } else {
+ top = 0;
+ left = 0;
+ bottom = window.innerHeight;
+ right = window.innerWidth;
+ height = window.innerHeight;
+ width = window.innerWidth;
+ }
+
+ if (
+ (relativeToContainingBlock || relativeToNonStaticParent) &&
+ el !== window
+ ) {
+ // Adjust for translate()
+ container = container || el.parentNode;
+
+ // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)
+ // Not needed on <= IE11
+ if (!IE11OrLess) {
+ do {
+ if (
+ container &&
+ container.getBoundingClientRect &&
+ //@ts-ignore
+ (css(container, "transform") !== "none" ||
+ (relativeToNonStaticParent &&
+ //@ts-ignore
+ css(container, "position") !== "static"))
+ ) {
+ let containerRect = container.getBoundingClientRect();
+
+ // Set relative to edges of padding box of container
+ //@ts-ignore
+ top -=
+ containerRect.top + parseInt(css(container, "border-top-width"));
+ //@ts-ignore
+ left -=
+ containerRect.left +
+ parseInt(css(container, "border-left-width"));
+ bottom = top + elRect.height;
+ right = left + elRect.width;
+
+ break;
+ }
+ /* jshint boss:true */
+ } while ((container = container.parentNode));
+ }
+ }
+
+ if (undoScale && el !== window) {
+ // Adjust for scale()
+ //@ts-ignore
+ let elMatrix = matrix(container || el),
+ scaleX = elMatrix && elMatrix.a,
+ scaleY = elMatrix && elMatrix.d;
+
+ if (elMatrix) {
+ top /= scaleY;
+ left /= scaleX;
+
+ width /= scaleX;
+ height /= scaleY;
+
+ bottom = top + height;
+ right = left + width;
+ }
+ }
+
+ return {
+ top: top,
+ left: left,
+ bottom: bottom,
+ right: right,
+ width: width,
+ height: height,
+ };
}
/**
@@ -292,34 +317,32 @@
* @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element
*/
function isScrolledPast(el, elSide, parentSide) {
- let parent = getParentAutoScrollElement(el, true),
- //@ts-ignore
- elSideVal = getRect(el)[elSide];
-
- /* jshint boss:true */
- while (parent) {
- //@ts-ignore
- let parentSideVal = getRect(parent)[parentSide],
- visible;
-
- if (parentSide === 'top' || parentSide === 'left') {
- visible = elSideVal >= parentSideVal;
- } else {
- visible = elSideVal <= parentSideVal;
- }
+ let parent = getParentAutoScrollElement(el, true),
+ //@ts-ignore
+ elSideVal = getRect(el)[elSide];
+
+ /* jshint boss:true */
+ while (parent) {
+ //@ts-ignore
+ let parentSideVal = getRect(parent)[parentSide],
+ visible;
+
+ if (parentSide === "top" || parentSide === "left") {
+ visible = elSideVal >= parentSideVal;
+ } else {
+ visible = elSideVal <= parentSideVal;
+ }
- if (!visible) return parent;
+ if (!visible) return parent;
- if (parent === getWindowScrollingElement()) break;
+ if (parent === getWindowScrollingElement()) break;
- parent = getParentAutoScrollElement(parent, false);
- }
+ parent = getParentAutoScrollElement(parent, false);
+ }
- return false;
+ return false;
}
-
-
/**
* Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)
* and non-draggable elements
@@ -329,28 +352,28 @@
* @return {HTMLElement} The child at index childNum, or null if not found
*/
function getChild(el, childNum, options) {
- let currentChild = 0,
- i = 0,
- children = el.children;
-
- while (i < children.length) {
- if (
- children[i].style.display !== 'none' &&
- //@ts-ignore
- children[i] !== Sortable.ghost &&
- //@ts-ignore
- children[i] !== Sortable.dragged &&
- closest(children[i], options.draggable, el, false)
- ) {
- if (currentChild === childNum) {
- return children[i];
- }
- currentChild++;
- }
-
- i++;
- }
- return null;
+ let currentChild = 0,
+ i = 0,
+ children = el.children;
+
+ while (i < children.length) {
+ if (
+ children[i].style.display !== "none" &&
+ //@ts-ignore
+ children[i] !== Sortable.ghost &&
+ //@ts-ignore
+ children[i] !== Sortable.dragged &&
+ closest(children[i], options.draggable, el, false)
+ ) {
+ if (currentChild === childNum) {
+ return children[i];
+ }
+ currentChild++;
+ }
+
+ i++;
+ }
+ return null;
}
/**
@@ -360,24 +383,21 @@
* @return {HTMLElement} The last child, ignoring ghostEl
*/
function lastChild(el, selector) {
- let last = el.lastElementChild;
-
- while (
- last &&
- (
- //@ts-ignore
- last === Sortable.ghost ||
- //@ts-ignore
- css(last, 'display') === 'none' ||
- selector && !matches(last, selector)
- )
- ) {
- last = last.previousElementSibling;
- }
-
- return last || null;
- }
+ let last = el.lastElementChild;
+
+ while (
+ last &&
+ //@ts-ignore
+ (last === Sortable.ghost ||
+ //@ts-ignore
+ css(last, "display") === "none" ||
+ (selector && !matches(last, selector)))
+ ) {
+ last = last.previousElementSibling;
+ }
+ return last || null;
+ }
/**
* Returns the index of an element within its parent for a selected set of
@@ -387,21 +407,25 @@
* @return {number}
*/
function index(el, selector) {
- let index = 0;
+ let index = 0;
- if (!el || !el.parentNode) {
- return -1;
- }
+ if (!el || !el.parentNode) {
+ return -1;
+ }
- /* jshint boss:true */
- while (el = el.previousElementSibling) {
- //@ts-ignore
- if ((el.nodeName.toUpperCase() !== 'TEMPLATE') && el !== Sortable.clone && (!selector || matches(el, selector))) {
- index++;
- }
- }
+ /* jshint boss:true */
+ while ((el = el.previousElementSibling)) {
+ //@ts-ignore
+ if (
+ el.nodeName.toUpperCase() !== "TEMPLATE" &&
+ el !== Sortable.clone &&
+ (!selector || matches(el, selector))
+ ) {
+ index++;
+ }
+ }
- return index;
+ return index;
}
/**
@@ -411,23 +435,23 @@
* @return {Array} Offsets in the format of [left, top]
*/
function getRelativeScrollOffset(el) {
- let offsetLeft = 0,
- offsetTop = 0,
- winScroller = getWindowScrollingElement();
-
- if (el) {
- do {
- //@ts-ignore
- let elMatrix = matrix(el),
- scaleX = elMatrix.a,
- scaleY = elMatrix.d;
-
- offsetLeft += el.scrollLeft * scaleX;
- offsetTop += el.scrollTop * scaleY;
- } while (el !== winScroller && (el = el.parentNode));
- }
-
- return [offsetLeft, offsetTop];
+ let offsetLeft = 0,
+ offsetTop = 0,
+ winScroller = getWindowScrollingElement();
+
+ if (el) {
+ do {
+ //@ts-ignore
+ let elMatrix = matrix(el),
+ scaleX = elMatrix.a,
+ scaleY = elMatrix.d;
+
+ offsetLeft += el.scrollLeft * scaleX;
+ offsetTop += el.scrollTop * scaleY;
+ } while (el !== winScroller && (el = el.parentNode));
+ }
+
+ return [offsetLeft, offsetTop];
}
/**
@@ -437,446 +461,484 @@
* @return {Number} The index of the object in the array, or -1
*/
function indexOfObject(arr, obj) {
- for (let i in arr) {
- if (!arr.hasOwnProperty(i)) continue;
- for (let key in obj) {
- if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);
- }
- }
- return -1;
+ for (let i in arr) {
+ if (!arr.hasOwnProperty(i)) continue;
+ for (let key in obj) {
+ if (obj.hasOwnProperty(key) && obj[key] === arr[i][key])
+ return Number(i);
+ }
+ }
+ return -1;
}
-
function getParentAutoScrollElement(el, includeSelf) {
- // skip to window
- if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();
-
- let elem = el;
- let gotSelf = false;
- do {
- // we don't need to get elem css if it isn't even overflowing in the first place (performance)
- if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {
- //@ts-ignore
- let elemCSS = css(elem);
- if (
- elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') ||
- elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')
- ) {
- if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();
-
- if (gotSelf || includeSelf) return elem;
- gotSelf = true;
- }
- }
- /* jshint boss:true */
- } while (elem = elem.parentNode);
-
- return getWindowScrollingElement();
+ // skip to window
+ if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();
+
+ let elem = el;
+ let gotSelf = false;
+ do {
+ // we don't need to get elem css if it isn't even overflowing in the first place (performance)
+ if (
+ elem.clientWidth < elem.scrollWidth ||
+ elem.clientHeight < elem.scrollHeight
+ ) {
+ //@ts-ignore
+ let elemCSS = css(elem);
+ if (
+ (elem.clientWidth < elem.scrollWidth &&
+ (elemCSS.overflowX == "auto" || elemCSS.overflowX == "scroll")) ||
+ (elem.clientHeight < elem.scrollHeight &&
+ (elemCSS.overflowY == "auto" || elemCSS.overflowY == "scroll"))
+ ) {
+ if (!elem.getBoundingClientRect || elem === document.body)
+ return getWindowScrollingElement();
+
+ if (gotSelf || includeSelf) return elem;
+ gotSelf = true;
+ }
+ }
+ /* jshint boss:true */
+ } while ((elem = elem.parentNode));
+
+ return getWindowScrollingElement();
}
function extend(dst, src) {
- if (dst && src) {
- for (let key in src) {
- if (src.hasOwnProperty(key)) {
- dst[key] = src[key];
- }
- }
- }
-
- return dst;
- }
+ if (dst && src) {
+ for (let key in src) {
+ if (src.hasOwnProperty(key)) {
+ dst[key] = src[key];
+ }
+ }
+ }
+ return dst;
+ }
function isRectEqual(rect1, rect2) {
- return Math.round(rect1.top) === Math.round(rect2.top) &&
- Math.round(rect1.left) === Math.round(rect2.left) &&
- Math.round(rect1.height) === Math.round(rect2.height) &&
- Math.round(rect1.width) === Math.round(rect2.width);
+ return (
+ Math.round(rect1.top) === Math.round(rect2.top) &&
+ Math.round(rect1.left) === Math.round(rect2.left) &&
+ Math.round(rect1.height) === Math.round(rect2.height) &&
+ Math.round(rect1.width) === Math.round(rect2.width)
+ );
}
-
let _throttleTimeout;
function throttle(callback, ms) {
- return function () {
- if (!_throttleTimeout) {
- let args = arguments,
- _this = this;
-
- if (args.length === 1) {
- callback.call(_this, args[0]);
- } else {
- callback.apply(_this, args);
- }
-
- _throttleTimeout = setTimeout(function () {
- _throttleTimeout = void 0;
- }, ms);
- }
- };
- }
+ return function () {
+ if (!_throttleTimeout) {
+ let args = arguments,
+ _this = this;
+ if (args.length === 1) {
+ callback.call(_this, args[0]);
+ } else {
+ callback.apply(_this, args);
+ }
- function cancelThrottle() {
- clearTimeout(_throttleTimeout);
- _throttleTimeout = void 0;
+ _throttleTimeout = setTimeout(function () {
+ _throttleTimeout = void 0;
+ }, ms);
+ }
+ };
}
+ function cancelThrottle() {
+ clearTimeout(_throttleTimeout);
+ _throttleTimeout = void 0;
+ }
function scrollBy(el, x, y) {
- el.scrollLeft += x;
- el.scrollTop += y;
+ el.scrollLeft += x;
+ el.scrollTop += y;
}
-
function clone(el) {
- //@ts-ignore
- let Polymer = window.Polymer;
- //@ts-ignore
- let $ = window.jQuery || window.Zepto;
-
- if (Polymer && Polymer.dom) {
- return Polymer.dom(el).cloneNode(true);
- }
- else if ($) {
- return $(el).clone(true)[0];
- }
- else {
- return el.cloneNode(true);
- }
+ //@ts-ignore
+ let Polymer = window.Polymer;
+ //@ts-ignore
+ let $ = window.jQuery || window.Zepto;
+
+ if (Polymer && Polymer.dom) {
+ return Polymer.dom(el).cloneNode(true);
+ } else if ($) {
+ return $(el).clone(true)[0];
+ } else {
+ return el.cloneNode(true);
+ }
}
-
function setRect(el, rect) {
- css(el, 'position', 'absolute');
- css(el, 'top', rect.top);
- css(el, 'left', rect.left);
- css(el, 'width', rect.width);
- css(el, 'height', rect.height);
+ css(el, "position", "absolute");
+ css(el, "top", rect.top);
+ css(el, "left", rect.left);
+ css(el, "width", rect.width);
+ css(el, "height", rect.height);
}
function unsetRect(el) {
- css(el, 'position', '');
- css(el, 'top', '');
- css(el, 'left', '');
- css(el, 'width', '');
- css(el, 'height', '');
+ css(el, "position", "");
+ css(el, "top", "");
+ css(el, "left", "");
+ css(el, "width", "");
+ css(el, "height", "");
}
-
- const expando = 'Sortable' + (new Date).getTime();
+ const expando = "Sortable" + new Date().getTime();
function AnimationStateManager() {
- let animationStates = [],
- animationCallbackId;
-
- return {
- captureAnimationState() {
- animationStates = [];
- if (!this.options.animation) return;
- let children = [].slice.call(this.el.children);
-
- children.forEach(child => {
- if (css(child, 'display') === 'none' || child === Sortable.ghost) return;
- animationStates.push({
- target: child,
- rect: getRect(child)
- });
- let fromRect = { ...animationStates[animationStates.length - 1].rect };
-
- // If animating: compensate for current animation
- if (child.thisAnimationDuration) {
- let childMatrix = matrix(child, true);
- if (childMatrix) {
- fromRect.top -= childMatrix.f;
- fromRect.left -= childMatrix.e;
- }
- }
-
- child.fromRect = fromRect;
- });
- },
-
- addAnimationState(state) {
- animationStates.push(state);
- },
-
- removeAnimationState(target) {
- animationStates.splice(indexOfObject(animationStates, { target }), 1);
- },
-
- animateAll(callback) {
- if (!this.options.animation) {
- clearTimeout(animationCallbackId);
- if (typeof(callback) === 'function') callback();
- return;
- }
-
- let animating = false,
- animationTime = 0;
-
- animationStates.forEach((state) => {
- let time = 0,
- target = state.target,
- fromRect = target.fromRect,
- toRect = getRect(target),
- prevFromRect = target.prevFromRect,
- prevToRect = target.prevToRect,
- animatingRect = state.rect,
- targetMatrix = matrix(target, true);
-
-
- if (targetMatrix) {
- // Compensate for current animation
- toRect.top -= targetMatrix.f;
- toRect.left -= targetMatrix.e;
- }
-
- target.toRect = toRect;
-
- if (target.thisAnimationDuration) {
- // Could also check if animatingRect is between fromRect and toRect
- if (
- isRectEqual(prevFromRect, toRect) &&
- !isRectEqual(fromRect, toRect) &&
- // Make sure animatingRect is on line between toRect & fromRect
- (animatingRect.top - toRect.top) /
- (animatingRect.left - toRect.left) ===
- (fromRect.top - toRect.top) /
- (fromRect.left - toRect.left)
- ) {
- // If returning to same place as started from animation and on same axis
- time = calculateRealTime(animatingRect, prevFromRect, prevToRect, this.options);
- }
- }
-
- // if fromRect != toRect: animate
- if (!isRectEqual(toRect, fromRect)) {
- target.prevFromRect = fromRect;
- target.prevToRect = toRect;
-
- if (!time) {
- time = this.options.animation;
- }
- this.animate(
- target,
- animatingRect,
- toRect,
- time
- );
- }
-
- if (time) {
- animating = true;
- animationTime = Math.max(animationTime, time);
- clearTimeout(target.animationResetTimer);
- target.animationResetTimer = setTimeout(function() {
- target.animationTime = 0;
- target.prevFromRect = null;
- target.fromRect = null;
- target.prevToRect = null;
- target.thisAnimationDuration = null;
- }, time);
- target.thisAnimationDuration = time;
- }
- });
-
-
- clearTimeout(animationCallbackId);
- if (!animating) {
- if (typeof(callback) === 'function') callback();
- } else {
- animationCallbackId = setTimeout(function() {
- if (typeof(callback) === 'function') callback();
- }, animationTime);
- }
- animationStates = [];
- },
-
- animate(target, currentRect, toRect, duration) {
- if (duration) {
- css(target, 'transition', '');
- css(target, 'transform', '');
- let elMatrix = matrix(this.el),
- scaleX = elMatrix && elMatrix.a,
- scaleY = elMatrix && elMatrix.d,
- translateX = (currentRect.left - toRect.left) / (scaleX || 1),
- translateY = (currentRect.top - toRect.top) / (scaleY || 1);
-
- target.animatingX = !!translateX;
- target.animatingY = !!translateY;
-
- css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');
-
- this.forRepaintDummy = repaint(target); // repaint
-
- css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));
- css(target, 'transform', 'translate3d(0,0,0)');
- (typeof target.animated === 'number') && clearTimeout(target.animated);
- target.animated = setTimeout(function () {
- css(target, 'transition', '');
- css(target, 'transform', '');
- target.animated = false;
-
- target.animatingX = false;
- target.animatingY = false;
- }, duration);
- }
- }
- };
+ let animationStates = [],
+ animationCallbackId;
+
+ return {
+ captureAnimationState() {
+ animationStates = [];
+ if (!this.options.animation) return;
+ let children = [].slice.call(this.el.children);
+
+ children.forEach((child) => {
+ if (css(child, "display") === "none" || child === Sortable.ghost)
+ return;
+ animationStates.push({
+ target: child,
+ rect: getRect(child),
+ });
+ let fromRect = {
+ ...animationStates[animationStates.length - 1].rect,
+ };
+
+ // If animating: compensate for current animation
+ if (child.thisAnimationDuration) {
+ let childMatrix = matrix(child, true);
+ if (childMatrix) {
+ fromRect.top -= childMatrix.f;
+ fromRect.left -= childMatrix.e;
+ }
+ }
+
+ child.fromRect = fromRect;
+ });
+ },
+
+ addAnimationState(state) {
+ animationStates.push(state);
+ },
+
+ removeAnimationState(target) {
+ animationStates.splice(indexOfObject(animationStates, { target }), 1);
+ },
+
+ animateAll(callback) {
+ if (!this.options.animation) {
+ clearTimeout(animationCallbackId);
+ if (typeof callback === "function") callback();
+ return;
+ }
+
+ let animating = false,
+ animationTime = 0;
+
+ animationStates.forEach((state) => {
+ let time = 0,
+ target = state.target,
+ fromRect = target.fromRect,
+ toRect = getRect(target),
+ prevFromRect = target.prevFromRect,
+ prevToRect = target.prevToRect,
+ animatingRect = state.rect,
+ targetMatrix = matrix(target, true);
+
+ if (targetMatrix) {
+ // Compensate for current animation
+ toRect.top -= targetMatrix.f;
+ toRect.left -= targetMatrix.e;
+ }
+
+ target.toRect = toRect;
+
+ if (target.thisAnimationDuration) {
+ // Could also check if animatingRect is between fromRect and toRect
+ if (
+ isRectEqual(prevFromRect, toRect) &&
+ !isRectEqual(fromRect, toRect) &&
+ // Make sure animatingRect is on line between toRect & fromRect
+ (animatingRect.top - toRect.top) /
+ (animatingRect.left - toRect.left) ===
+ (fromRect.top - toRect.top) / (fromRect.left - toRect.left)
+ ) {
+ // If returning to same place as started from animation and on same axis
+ time = calculateRealTime(
+ animatingRect,
+ prevFromRect,
+ prevToRect,
+ this.options
+ );
+ }
+ }
+
+ // if fromRect != toRect: animate
+ if (!isRectEqual(toRect, fromRect)) {
+ target.prevFromRect = fromRect;
+ target.prevToRect = toRect;
+
+ if (!time) {
+ time = this.options.animation;
+ }
+ this.animate(target, animatingRect, toRect, time);
+ }
+
+ if (time) {
+ animating = true;
+ animationTime = Math.max(animationTime, time);
+ clearTimeout(target.animationResetTimer);
+ target.animationResetTimer = setTimeout(function () {
+ target.animationTime = 0;
+ target.prevFromRect = null;
+ target.fromRect = null;
+ target.prevToRect = null;
+ target.thisAnimationDuration = null;
+ }, time);
+ target.thisAnimationDuration = time;
+ }
+ });
+
+ clearTimeout(animationCallbackId);
+ if (!animating) {
+ if (typeof callback === "function") callback();
+ } else {
+ animationCallbackId = setTimeout(function () {
+ if (typeof callback === "function") callback();
+ }, animationTime);
+ }
+ animationStates = [];
+ },
+
+ animate(target, currentRect, toRect, duration) {
+ if (duration) {
+ css(target, "transition", "");
+ css(target, "transform", "");
+ let elMatrix = matrix(this.el),
+ scaleX = elMatrix && elMatrix.a,
+ scaleY = elMatrix && elMatrix.d,
+ translateX = (currentRect.left - toRect.left) / (scaleX || 1),
+ translateY = (currentRect.top - toRect.top) / (scaleY || 1);
+
+ target.animatingX = !!translateX;
+ target.animatingY = !!translateY;
+
+ css(
+ target,
+ "transform",
+ "translate3d(" + translateX + "px," + translateY + "px,0)"
+ );
+
+ this.forRepaintDummy = repaint(target); // repaint
+
+ css(
+ target,
+ "transition",
+ "transform " +
+ duration +
+ "ms" +
+ (this.options.easing ? " " + this.options.easing : "")
+ );
+ css(target, "transform", "translate3d(0,0,0)");
+ typeof target.animated === "number" && clearTimeout(target.animated);
+ target.animated = setTimeout(function () {
+ css(target, "transition", "");
+ css(target, "transform", "");
+ target.animated = false;
+
+ target.animatingX = false;
+ target.animatingY = false;
+ }, duration);
+ }
+ },
+ };
}
function repaint(target) {
- return target.offsetWidth;
+ return target.offsetWidth;
}
-
function calculateRealTime(animatingRect, fromRect, toRect, options) {
- return (
- Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) /
- Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2))
- ) * options.animation;
+ return (
+ (Math.sqrt(
+ Math.pow(fromRect.top - animatingRect.top, 2) +
+ Math.pow(fromRect.left - animatingRect.left, 2)
+ ) /
+ Math.sqrt(
+ Math.pow(fromRect.top - toRect.top, 2) +
+ Math.pow(fromRect.left - toRect.left, 2)
+ )) *
+ options.animation
+ );
}
let plugins = [];
const defaults = {
- initializeByDefault: true
+ initializeByDefault: true,
};
var PluginManager = {
- mount(plugin) {
- // Set default static properties
- for (let option in defaults) {
- if (defaults.hasOwnProperty(option) && !(option in plugin)) {
- plugin[option] = defaults[option];
- }
- }
- plugins.push(plugin);
- },
- pluginEvent(eventName, sortable, evt) {
- this.eventCanceled = false;
- evt.cancel = () => {
- this.eventCanceled = true;
- };
- const eventNameGlobal = eventName + 'Global';
- plugins.forEach(plugin => {
- if (!sortable[plugin.pluginName]) return;
- // Fire global events if it exists in this sortable
- if (
- sortable[plugin.pluginName][eventNameGlobal]
- ) {
- sortable[plugin.pluginName][eventNameGlobal]({ sortable, ...evt });
- }
-
- // Only fire plugin event if plugin is enabled in this sortable,
- // and plugin has event defined
- if (
- sortable.options[plugin.pluginName] &&
- sortable[plugin.pluginName][eventName]
- ) {
- sortable[plugin.pluginName][eventName]({ sortable, ...evt });
- }
- });
- },
- initializePlugins(sortable, el, defaults, options) {
- plugins.forEach(plugin => {
- const pluginName = plugin.pluginName;
- if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;
-
- let initialized = new plugin(sortable, el, sortable.options);
- initialized.sortable = sortable;
- initialized.options = sortable.options;
- sortable[pluginName] = initialized;
-
- // Add default options from plugin
- Object.assign(defaults, initialized.defaults);
- });
-
- for (let option in sortable.options) {
- if (!sortable.options.hasOwnProperty(option)) continue;
- let modified = this.modifyOption(sortable, option, sortable.options[option]);
- if (typeof(modified) !== 'undefined') {
- sortable.options[option] = modified;
- }
- }
- },
- getEventProperties(name, sortable) {
- let eventProperties = {};
- plugins.forEach(plugin => {
- if (typeof(plugin.eventProperties) !== 'function') return;
- Object.assign(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));
- });
-
- return eventProperties;
- },
- modifyOption(sortable, name, value) {
- let modifiedValue;
- plugins.forEach(plugin => {
- // Plugin must exist on the Sortable
- if (!sortable[plugin.pluginName]) return;
-
- // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin
- if (plugin.optionListeners && typeof(plugin.optionListeners[name]) === 'function') {
- modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);
- }
- });
-
- return modifiedValue;
- }
+ mount(plugin) {
+ // Set default static properties
+ for (let option in defaults) {
+ if (defaults.hasOwnProperty(option) && !(option in plugin)) {
+ plugin[option] = defaults[option];
+ }
+ }
+ plugins.push(plugin);
+ },
+ pluginEvent(eventName, sortable, evt) {
+ this.eventCanceled = false;
+ evt.cancel = () => {
+ this.eventCanceled = true;
+ };
+ const eventNameGlobal = eventName + "Global";
+ plugins.forEach((plugin) => {
+ if (!sortable[plugin.pluginName]) return;
+ // Fire global events if it exists in this sortable
+ if (sortable[plugin.pluginName][eventNameGlobal]) {
+ sortable[plugin.pluginName][eventNameGlobal]({ sortable, ...evt });
+ }
+
+ // Only fire plugin event if plugin is enabled in this sortable,
+ // and plugin has event defined
+ if (
+ sortable.options[plugin.pluginName] &&
+ sortable[plugin.pluginName][eventName]
+ ) {
+ sortable[plugin.pluginName][eventName]({ sortable, ...evt });
+ }
+ });
+ },
+ initializePlugins(sortable, el, defaults, options) {
+ plugins.forEach((plugin) => {
+ const pluginName = plugin.pluginName;
+ if (!sortable.options[pluginName] && !plugin.initializeByDefault)
+ return;
+
+ let initialized = new plugin(sortable, el, sortable.options);
+ initialized.sortable = sortable;
+ initialized.options = sortable.options;
+ sortable[pluginName] = initialized;
+
+ // Add default options from plugin
+ Object.assign(defaults, initialized.defaults);
+ });
+
+ for (let option in sortable.options) {
+ if (!sortable.options.hasOwnProperty(option)) continue;
+ let modified = this.modifyOption(
+ sortable,
+ option,
+ sortable.options[option]
+ );
+ if (typeof modified !== "undefined") {
+ sortable.options[option] = modified;
+ }
+ }
+ },
+ getEventProperties(name, sortable) {
+ let eventProperties = {};
+ plugins.forEach((plugin) => {
+ if (typeof plugin.eventProperties !== "function") return;
+ Object.assign(
+ eventProperties,
+ plugin.eventProperties.call(sortable[plugin.pluginName], name)
+ );
+ });
+
+ return eventProperties;
+ },
+ modifyOption(sortable, name, value) {
+ let modifiedValue;
+ plugins.forEach((plugin) => {
+ // Plugin must exist on the Sortable
+ if (!sortable[plugin.pluginName]) return;
+
+ // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin
+ if (
+ plugin.optionListeners &&
+ typeof plugin.optionListeners[name] === "function"
+ ) {
+ modifiedValue = plugin.optionListeners[name].call(
+ sortable[plugin.pluginName],
+ value
+ );
+ }
+ });
+
+ return modifiedValue;
+ },
};
- function dispatchEvent(
- {
- sortable, rootEl, name,
- targetEl, cloneEl, toEl, fromEl,
- oldIndex, newIndex,
- oldDraggableIndex, newDraggableIndex,
- originalEvent, putSortable, extraEventProperties
- }
- ) {
- sortable = (sortable || (rootEl && rootEl[expando]));
- if (!sortable) return;
-
- let evt,
- options = sortable.options,
- onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);
- // Support for new CustomEvent feature
- if (window.CustomEvent && !IE11OrLess && !Edge) {
- evt = new CustomEvent(name, {
- bubbles: true,
- cancelable: true
- });
- } else {
- evt = document.createEvent('Event');
- evt.initEvent(name, true, true);
- }
-
- evt.to = toEl || rootEl;
- evt.from = fromEl || rootEl;
- evt.item = targetEl || rootEl;
- evt.clone = cloneEl;
-
- evt.oldIndex = oldIndex;
- evt.newIndex = newIndex;
-
- evt.oldDraggableIndex = oldDraggableIndex;
- evt.newDraggableIndex = newDraggableIndex;
-
- evt.originalEvent = originalEvent;
- evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
-
- let allEventProperties = { ...extraEventProperties, ...PluginManager.getEventProperties(name, sortable) };
- for (let option in allEventProperties) {
- evt[option] = allEventProperties[option];
- }
-
- if (rootEl) {
- rootEl.dispatchEvent(evt);
- }
-
- if (options[onName]) {
- options[onName].call(sortable, evt);
- }
+ function dispatchEvent({
+ sortable,
+ rootEl,
+ name,
+ targetEl,
+ cloneEl,
+ toEl,
+ fromEl,
+ oldIndex,
+ newIndex,
+ oldDraggableIndex,
+ newDraggableIndex,
+ originalEvent,
+ putSortable,
+ extraEventProperties,
+ }) {
+ sortable = sortable || (rootEl && rootEl[expando]);
+ if (!sortable) return;
+
+ let evt,
+ options = sortable.options,
+ onName = "on" + name.charAt(0).toUpperCase() + name.substr(1);
+ // Support for new CustomEvent feature
+ if (window.CustomEvent && !IE11OrLess && !Edge) {
+ evt = new CustomEvent(name, {
+ bubbles: true,
+ cancelable: true,
+ });
+ } else {
+ evt = document.createEvent("Event");
+ evt.initEvent(name, true, true);
+ }
+
+ evt.to = toEl || rootEl;
+ evt.from = fromEl || rootEl;
+ evt.item = targetEl || rootEl;
+ evt.clone = cloneEl;
+
+ evt.oldIndex = oldIndex;
+ evt.newIndex = newIndex;
+
+ evt.oldDraggableIndex = oldDraggableIndex;
+ evt.newDraggableIndex = newDraggableIndex;
+
+ evt.originalEvent = originalEvent;
+ evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
+
+ let allEventProperties = {
+ ...extraEventProperties,
+ ...PluginManager.getEventProperties(name, sortable),
+ };
+ for (let option in allEventProperties) {
+ evt[option] = allEventProperties[option];
+ }
+
+ if (rootEl) {
+ rootEl.dispatchEvent(evt);
+ }
+
+ if (options[onName]) {
+ options[onName].call(sortable, evt);
+ }
}
/**!
@@ -1206,8 +1268,8 @@
function Sortable(el, options) {
if (!(el && el.nodeType && el.nodeType === 1)) {
throw `Sortable: \`el\` must be an HTMLElement, not ${{}.toString.call(
- el
- )}`;
+ el
+ )}`;
}
this.el = el; // root element
@@ -1425,7 +1487,10 @@
}
}
- if (options.handle && !closest(originalTarget, options.handle, el, false)) {
+ if (
+ options.handle &&
+ !closest(originalTarget, options.handle, el, false)
+ ) {
return;
}
@@ -1537,7 +1602,11 @@
on(ownerDocument, "mousemove", _this._delayedDragTouchMoveHandler);
on(ownerDocument, "touchmove", _this._delayedDragTouchMoveHandler);
options.supportPointer &&
- on(ownerDocument, "pointermove", _this._delayedDragTouchMoveHandler);
+ on(
+ ownerDocument,
+ "pointermove",
+ _this._delayedDragTouchMoveHandler
+ );
_this._dragStartTimer = setTimeout(dragStartFn, options.delay);
} else {
@@ -1702,13 +1771,15 @@
ghostRelativeParent &&
getRelativeScrollOffset(ghostRelativeParent),
dx =
- (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) +
+ (touch.clientX - tapEvt.clientX + fallbackOffset.x) /
+ (scaleX || 1) +
(relativeScrollOffset
? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0]
: 0) /
(scaleX || 1),
dy =
- (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) +
+ (touch.clientY - tapEvt.clientY + fallbackOffset.y) /
+ (scaleY || 1) +
(relativeScrollOffset
? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1]
: 0) /
@@ -1765,7 +1836,13 @@
// Not being adjusted for
if (!ghostEl) {
let container = this.options.fallbackOnBody ? document.body : rootEl,
- rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),
+ rect = getRect(
+ dragEl,
+ true,
+ PositionGhostAbsolutely,
+ true,
+ container
+ ),
options = this.options;
// Position absolutely
@@ -1814,7 +1891,11 @@
css(ghostEl, "width", rect.width);
css(ghostEl, "height", rect.height);
css(ghostEl, "opacity", "0.8");
- css(ghostEl, "position", PositionGhostAbsolutely ? "absolute" : "fixed");
+ css(
+ ghostEl,
+ "position",
+ PositionGhostAbsolutely ? "absolute" : "fixed"
+ );
css(ghostEl, "zIndex", "100000");
css(ghostEl, "pointerEvents", "none");
@@ -2252,7 +2333,10 @@
parentEl = dragEl.parentNode; // actualization
// must be done before animation
- if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {
+ if (
+ targetBeforeFirstSwap !== undefined &&
+ !isCircumstantialInvert
+ ) {
targetMoveDistance = Math.abs(
targetBeforeFirstSwap - getRect(target)[side1]
);
@@ -2346,7 +2430,9 @@
!options.dropBubble && evt.stopPropagation();
}
- ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);
+ ghostEl &&
+ ghostEl.parentNode &&
+ ghostEl.parentNode.removeChild(ghostEl);
if (
rootEl === parentEl ||
@@ -2609,11 +2695,12 @@
off(el, "dragenter", this);
}
// Remove draggable attributes
- Array.prototype.forEach.call(el.querySelectorAll("[draggable]"), function (
- el
- ) {
- el.removeAttribute("draggable");
- });
+ Array.prototype.forEach.call(
+ el.querySelectorAll("[draggable]"),
+ function (el) {
+ el.removeAttribute("draggable");
+ }
+ );
this._onDrop();
@@ -2762,8 +2849,10 @@
if (
!pastFirstInvertThresh &&
(lastDirection === 1
- ? mouseOnAxis > targetS1 + (targetLength * invertedSwapThreshold) / 2
- : mouseOnAxis < targetS2 - (targetLength * invertedSwapThreshold) / 2)
+ ? mouseOnAxis >
+ targetS1 + (targetLength * invertedSwapThreshold) / 2
+ : mouseOnAxis <
+ targetS2 - (targetLength * invertedSwapThreshold) / 2)
) {
// past first invert threshold, do not restrict inverted threshold to dragEl shadow
pastFirstInvertThresh = true;
@@ -2908,8 +2997,8 @@
plugins.forEach((plugin) => {
if (!plugin.prototype || !plugin.prototype.constructor) {
throw `Sortable: Mounted plugin must be a constructor function, not ${{}.toString.call(
- plugin
- )}`;
+ plugin
+ )}`;
}
if (plugin.utils) Sortable.utils = { ...Sortable.utils, ...plugin.utils };
@@ -2930,984 +3019,1099 @@
Sortable.version = version;
let autoScrolls = [],
- scrollEl,
- scrollRootEl,
- scrolling = false,
- lastAutoScrollX,
- lastAutoScrollY,
- touchEvt$1,
- pointerElemChangedInterval;
+ scrollEl,
+ scrollRootEl,
+ scrolling = false,
+ lastAutoScrollX,
+ lastAutoScrollY,
+ touchEvt$1,
+ pointerElemChangedInterval;
function AutoScrollPlugin() {
+ function AutoScroll() {
+ this.defaults = {
+ scroll: true,
+ scrollSensitivity: 30,
+ scrollSpeed: 10,
+ bubbleScroll: true,
+ };
+
+ // Bind all private methods
+ for (let fn in this) {
+ if (fn.charAt(0) === "_" && typeof this[fn] === "function") {
+ this[fn] = this[fn].bind(this);
+ }
+ }
+ }
- function AutoScroll() {
- this.defaults = {
- scroll: true,
- scrollSensitivity: 30,
- scrollSpeed: 10,
- bubbleScroll: true
- };
-
- // Bind all private methods
- for (let fn in this) {
- if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
- this[fn] = this[fn].bind(this);
- }
- }
- }
-
- AutoScroll.prototype = {
- dragStarted({ originalEvent }) {
- if (this.sortable.nativeDraggable) {
- on(document, 'dragover', this._handleAutoScroll);
- } else {
- if (this.options.supportPointer) {
- on(document, 'pointermove', this._handleFallbackAutoScroll);
- } else if (originalEvent.touches) {
- on(document, 'touchmove', this._handleFallbackAutoScroll);
- } else {
- on(document, 'mousemove', this._handleFallbackAutoScroll);
- }
- }
- },
-
- dragOverCompleted({ originalEvent }) {
- // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)
- if (!this.options.dragOverBubble && !originalEvent.rootEl) {
- this._handleAutoScroll(originalEvent);
- }
- },
-
- drop() {
- if (this.sortable.nativeDraggable) {
- off(document, 'dragover', this._handleAutoScroll);
- } else {
- off(document, 'pointermove', this._handleFallbackAutoScroll);
- off(document, 'touchmove', this._handleFallbackAutoScroll);
- off(document, 'mousemove', this._handleFallbackAutoScroll);
- }
-
- clearPointerElemChangedInterval();
- clearAutoScrolls();
- cancelThrottle();
- },
-
- nulling() {
- touchEvt$1 =
- scrollRootEl =
- scrollEl =
- scrolling =
- pointerElemChangedInterval =
- lastAutoScrollX =
- lastAutoScrollY = null;
-
- autoScrolls.length = 0;
- },
-
- _handleFallbackAutoScroll(evt) {
- this._handleAutoScroll(evt, true);
- },
-
- _handleAutoScroll(evt, fallback) {
- const x = (evt.touches ? evt.touches[0] : evt).clientX,
- y = (evt.touches ? evt.touches[0] : evt).clientY,
-
- elem = document.elementFromPoint(x, y);
-
- touchEvt$1 = evt;
-
- // IE does not seem to have native autoscroll,
- // Edge's autoscroll seems too conditional,
- // MACOS Safari does not have autoscroll,
- // Firefox and Chrome are good
- if (fallback || Edge || IE11OrLess || Safari) {
- autoScroll(evt, this.options, elem, fallback);
-
- // Listener for pointer element change
- let ogElemScroller = getParentAutoScrollElement(elem, true);
- if (
- scrolling &&
- (
- !pointerElemChangedInterval ||
- x !== lastAutoScrollX ||
- y !== lastAutoScrollY
- )
- ) {
- pointerElemChangedInterval && clearPointerElemChangedInterval();
- // Detect for pointer elem change, emulating native DnD behaviour
- pointerElemChangedInterval = setInterval(() => {
- let newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);
- if (newElem !== ogElemScroller) {
- ogElemScroller = newElem;
- clearAutoScrolls();
- }
- autoScroll(evt, this.options, newElem, fallback);
- }, 10);
- lastAutoScrollX = x;
- lastAutoScrollY = y;
- }
- } else {
- // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll
- if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {
- clearAutoScrolls();
- return;
- }
- autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);
- }
- }
- };
-
- return Object.assign(AutoScroll, {
- pluginName: 'scroll',
- initializeByDefault: true
- });
- }
+ AutoScroll.prototype = {
+ dragStarted({ originalEvent }) {
+ if (this.sortable.nativeDraggable) {
+ on(document, "dragover", this._handleAutoScroll);
+ } else {
+ if (this.options.supportPointer) {
+ on(document, "pointermove", this._handleFallbackAutoScroll);
+ } else if (originalEvent.touches) {
+ on(document, "touchmove", this._handleFallbackAutoScroll);
+ } else {
+ on(document, "mousemove", this._handleFallbackAutoScroll);
+ }
+ }
+ },
- function clearAutoScrolls() {
- autoScrolls.forEach(function(autoScroll) {
- clearInterval(autoScroll.pid);
- });
- autoScrolls = [];
+ dragOverCompleted({ originalEvent }) {
+ // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)
+ if (!this.options.dragOverBubble && !originalEvent.rootEl) {
+ this._handleAutoScroll(originalEvent);
+ }
+ },
+
+ drop() {
+ if (this.sortable.nativeDraggable) {
+ off(document, "dragover", this._handleAutoScroll);
+ } else {
+ off(document, "pointermove", this._handleFallbackAutoScroll);
+ off(document, "touchmove", this._handleFallbackAutoScroll);
+ off(document, "mousemove", this._handleFallbackAutoScroll);
+ }
+
+ clearPointerElemChangedInterval();
+ clearAutoScrolls();
+ cancelThrottle();
+ },
+
+ nulling() {
+ touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;
+
+ autoScrolls.length = 0;
+ },
+
+ _handleFallbackAutoScroll(evt) {
+ this._handleAutoScroll(evt, true);
+ },
+
+ _handleAutoScroll(evt, fallback) {
+ const x = (evt.touches ? evt.touches[0] : evt).clientX,
+ y = (evt.touches ? evt.touches[0] : evt).clientY,
+ elem = document.elementFromPoint(x, y);
+
+ touchEvt$1 = evt;
+
+ // IE does not seem to have native autoscroll,
+ // Edge's autoscroll seems too conditional,
+ // MACOS Safari does not have autoscroll,
+ // Firefox and Chrome are good
+ if (fallback || Edge || IE11OrLess || Safari) {
+ autoScroll(evt, this.options, elem, fallback);
+
+ // Listener for pointer element change
+ let ogElemScroller = getParentAutoScrollElement(elem, true);
+ if (
+ scrolling &&
+ (!pointerElemChangedInterval ||
+ x !== lastAutoScrollX ||
+ y !== lastAutoScrollY)
+ ) {
+ pointerElemChangedInterval && clearPointerElemChangedInterval();
+ // Detect for pointer elem change, emulating native DnD behaviour
+ pointerElemChangedInterval = setInterval(() => {
+ let newElem = getParentAutoScrollElement(
+ document.elementFromPoint(x, y),
+ true
+ );
+ if (newElem !== ogElemScroller) {
+ ogElemScroller = newElem;
+ clearAutoScrolls();
+ }
+ autoScroll(evt, this.options, newElem, fallback);
+ }, 10);
+ lastAutoScrollX = x;
+ lastAutoScrollY = y;
+ }
+ } else {
+ // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll
+ if (
+ !this.options.bubbleScroll ||
+ getParentAutoScrollElement(elem, true) ===
+ getWindowScrollingElement()
+ ) {
+ clearAutoScrolls();
+ return;
+ }
+ autoScroll(
+ evt,
+ this.options,
+ getParentAutoScrollElement(elem, false),
+ false
+ );
+ }
+ },
+ };
+
+ return Object.assign(AutoScroll, {
+ pluginName: "scroll",
+ initializeByDefault: true,
+ });
+ }
+
+ function clearAutoScrolls() {
+ autoScrolls.forEach(function (autoScroll) {
+ clearInterval(autoScroll.pid);
+ });
+ autoScrolls = [];
}
function clearPointerElemChangedInterval() {
- clearInterval(pointerElemChangedInterval);
+ clearInterval(pointerElemChangedInterval);
}
+ const autoScroll = throttle(function (evt, options, rootEl, isFallback) {
+ // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
+ if (!options.scroll) return;
+ const x = (evt.touches ? evt.touches[0] : evt).clientX,
+ y = (evt.touches ? evt.touches[0] : evt).clientY,
+ sens = options.scrollSensitivity,
+ speed = options.scrollSpeed,
+ winScroller = getWindowScrollingElement();
+
+ let scrollThisInstance = false,
+ scrollCustomFn;
- const autoScroll = throttle(function(evt, options, rootEl, isFallback) {
- // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
- if (!options.scroll) return;
- const x = (evt.touches ? evt.touches[0] : evt).clientX,
- y = (evt.touches ? evt.touches[0] : evt).clientY,
- sens = options.scrollSensitivity,
- speed = options.scrollSpeed,
- winScroller = getWindowScrollingElement();
-
- let scrollThisInstance = false,
- scrollCustomFn;
-
- // New scroll root, set scrollEl
- if (scrollRootEl !== rootEl) {
- scrollRootEl = rootEl;
-
- clearAutoScrolls();
-
- scrollEl = options.scroll;
- scrollCustomFn = options.scrollFn;
-
- if (scrollEl === true) {
- scrollEl = getParentAutoScrollElement(rootEl, true);
- }
- }
-
-
- let layersOut = 0;
- let currentParent = scrollEl;
- do {
- let el = currentParent,
- rect = getRect(el),
-
- top = rect.top,
- bottom = rect.bottom,
- left = rect.left,
- right = rect.right,
-
- width = rect.width,
- height = rect.height,
-
- canScrollX,
- canScrollY,
-
- scrollWidth = el.scrollWidth,
- scrollHeight = el.scrollHeight,
-
- elCSS = css(el),
-
- scrollPosX = el.scrollLeft,
- scrollPosY = el.scrollTop;
-
-
- if (el === winScroller) {
- canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');
- canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');
- } else {
- canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');
- canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');
- }
-
- let vx = canScrollX && (Math.abs(right - x) <= sens && (scrollPosX + width) < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);
- let vy = canScrollY && (Math.abs(bottom - y) <= sens && (scrollPosY + height) < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);
-
-
- if (!autoScrolls[layersOut]) {
- for (let i = 0; i <= layersOut; i++) {
- if (!autoScrolls[i]) {
- autoScrolls[i] = {};
- }
- }
- }
-
- if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {
- autoScrolls[layersOut].el = el;
- autoScrolls[layersOut].vx = vx;
- autoScrolls[layersOut].vy = vy;
-
- clearInterval(autoScrolls[layersOut].pid);
-
- if (vx != 0 || vy != 0) {
- scrollThisInstance = true;
- /* jshint loopfunc:true */
- autoScrolls[layersOut].pid = setInterval((function () {
- // emulate drag over during autoscroll (fallback), emulating native DnD behaviour
- if (isFallback && this.layer === 0) {
- Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely
- }
- let scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;
- let scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;
-
- if (typeof(scrollCustomFn) === 'function') {
- if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {
- return;
- }
- }
-
- scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);
- }).bind({layer: layersOut}), 24);
- }
- }
- layersOut++;
- } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));
- scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not
+ // New scroll root, set scrollEl
+ if (scrollRootEl !== rootEl) {
+ scrollRootEl = rootEl;
+
+ clearAutoScrolls();
+
+ scrollEl = options.scroll;
+ scrollCustomFn = options.scrollFn;
+
+ if (scrollEl === true) {
+ scrollEl = getParentAutoScrollElement(rootEl, true);
+ }
+ }
+
+ let layersOut = 0;
+ let currentParent = scrollEl;
+ do {
+ let el = currentParent,
+ rect = getRect(el),
+ top = rect.top,
+ bottom = rect.bottom,
+ left = rect.left,
+ right = rect.right,
+ width = rect.width,
+ height = rect.height,
+ canScrollX,
+ canScrollY,
+ scrollWidth = el.scrollWidth,
+ scrollHeight = el.scrollHeight,
+ elCSS = css(el),
+ scrollPosX = el.scrollLeft,
+ scrollPosY = el.scrollTop;
+
+ if (el === winScroller) {
+ canScrollX =
+ width < scrollWidth &&
+ (elCSS.overflowX === "auto" ||
+ elCSS.overflowX === "scroll" ||
+ elCSS.overflowX === "visible");
+ canScrollY =
+ height < scrollHeight &&
+ (elCSS.overflowY === "auto" ||
+ elCSS.overflowY === "scroll" ||
+ elCSS.overflowY === "visible");
+ } else {
+ canScrollX =
+ width < scrollWidth &&
+ (elCSS.overflowX === "auto" || elCSS.overflowX === "scroll");
+ canScrollY =
+ height < scrollHeight &&
+ (elCSS.overflowY === "auto" || elCSS.overflowY === "scroll");
+ }
+
+ let vx =
+ canScrollX &&
+ (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) -
+ (Math.abs(left - x) <= sens && !!scrollPosX);
+ let vy =
+ canScrollY &&
+ (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) -
+ (Math.abs(top - y) <= sens && !!scrollPosY);
+
+ if (!autoScrolls[layersOut]) {
+ for (let i = 0; i <= layersOut; i++) {
+ if (!autoScrolls[i]) {
+ autoScrolls[i] = {};
+ }
+ }
+ }
+
+ if (
+ autoScrolls[layersOut].vx != vx ||
+ autoScrolls[layersOut].vy != vy ||
+ autoScrolls[layersOut].el !== el
+ ) {
+ autoScrolls[layersOut].el = el;
+ autoScrolls[layersOut].vx = vx;
+ autoScrolls[layersOut].vy = vy;
+
+ clearInterval(autoScrolls[layersOut].pid);
+
+ if (vx != 0 || vy != 0) {
+ scrollThisInstance = true;
+ /* jshint loopfunc:true */
+ autoScrolls[layersOut].pid = setInterval(
+ function () {
+ // emulate drag over during autoscroll (fallback), emulating native DnD behaviour
+ if (isFallback && this.layer === 0) {
+ Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely
+ }
+ let scrollOffsetY = autoScrolls[this.layer].vy
+ ? autoScrolls[this.layer].vy * speed
+ : 0;
+ let scrollOffsetX = autoScrolls[this.layer].vx
+ ? autoScrolls[this.layer].vx * speed
+ : 0;
+
+ if (typeof scrollCustomFn === "function") {
+ if (
+ scrollCustomFn.call(
+ Sortable.dragged.parentNode[expando],
+ scrollOffsetX,
+ scrollOffsetY,
+ evt,
+ touchEvt$1,
+ autoScrolls[this.layer].el
+ ) !== "continue"
+ ) {
+ return;
+ }
+ }
+
+ scrollBy(
+ autoScrolls[this.layer].el,
+ scrollOffsetX,
+ scrollOffsetY
+ );
+ }.bind({ layer: layersOut }),
+ 24
+ );
+ }
+ }
+ layersOut++;
+ } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));
+ scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not
}, 30);
- const drop = function({
- originalEvent,
- putSortable,
- dragEl,
- activeSortable,
- dispatchSortableEvent,
- hideGhostForTarget,
- unhideGhostForTarget
+ const drop = function ({
+ originalEvent,
+ putSortable,
+ dragEl,
+ activeSortable,
+ dispatchSortableEvent,
+ hideGhostForTarget,
+ unhideGhostForTarget,
}) {
- if (!originalEvent) return;
- let toSortable = putSortable || activeSortable;
- hideGhostForTarget();
- let touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;
- let target = document.elementFromPoint(touch.clientX, touch.clientY);
- unhideGhostForTarget();
- if (toSortable && !toSortable.el.contains(target)) {
- dispatchSortableEvent('spill');
- this.onSpill({ dragEl, putSortable });
- }
+ if (!originalEvent) return;
+ let toSortable = putSortable || activeSortable;
+ hideGhostForTarget();
+ let touch =
+ originalEvent.changedTouches && originalEvent.changedTouches.length
+ ? originalEvent.changedTouches[0]
+ : originalEvent;
+ let target = document.elementFromPoint(touch.clientX, touch.clientY);
+ unhideGhostForTarget();
+ if (toSortable && !toSortable.el.contains(target)) {
+ dispatchSortableEvent("spill");
+ this.onSpill({ dragEl, putSortable });
+ }
};
function Revert() {}
Revert.prototype = {
- startIndex: null,
- dragStart({ oldDraggableIndex }) {
- this.startIndex = oldDraggableIndex;
- },
- onSpill({ dragEl, putSortable }) {
- this.sortable.captureAnimationState();
- if (putSortable) {
- putSortable.captureAnimationState();
- }
- let nextSibling = getChild(this.sortable.el, this.startIndex, this.options);
-
- if (nextSibling) {
- this.sortable.el.insertBefore(dragEl, nextSibling);
- } else {
- this.sortable.el.appendChild(dragEl);
- }
- this.sortable.animateAll();
- if (putSortable) {
- putSortable.animateAll();
- }
- },
- drop
+ startIndex: null,
+ dragStart({ oldDraggableIndex }) {
+ this.startIndex = oldDraggableIndex;
+ },
+ onSpill({ dragEl, putSortable }) {
+ this.sortable.captureAnimationState();
+ if (putSortable) {
+ putSortable.captureAnimationState();
+ }
+ let nextSibling = getChild(
+ this.sortable.el,
+ this.startIndex,
+ this.options
+ );
+
+ if (nextSibling) {
+ this.sortable.el.insertBefore(dragEl, nextSibling);
+ } else {
+ this.sortable.el.appendChild(dragEl);
+ }
+ this.sortable.animateAll();
+ if (putSortable) {
+ putSortable.animateAll();
+ }
+ },
+ drop,
};
Object.assign(Revert, {
- pluginName: 'revertOnSpill'
+ pluginName: "revertOnSpill",
});
-
function Remove() {}
Remove.prototype = {
- onSpill({ dragEl, putSortable }) {
- const parentSortable = putSortable || this.sortable;
- parentSortable.captureAnimationState();
- dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);
- parentSortable.animateAll();
- },
- drop
+ onSpill({ dragEl, putSortable }) {
+ const parentSortable = putSortable || this.sortable;
+ parentSortable.captureAnimationState();
+ dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);
+ parentSortable.animateAll();
+ },
+ drop,
};
Object.assign(Remove, {
- pluginName: 'removeOnSpill'
+ pluginName: "removeOnSpill",
});
let lastSwapEl;
-
function SwapPlugin() {
- function Swap() {
- this.defaults = {
- swapClass: 'sortable-swap-highlight'
- };
- }
-
- Swap.prototype = {
- dragStart({ dragEl }) {
- lastSwapEl = dragEl;
- },
- dragOverValid({ completed, target, onMove, activeSortable, changed, cancel }) {
- if (!activeSortable.options.swap) return;
- let el = this.sortable.el,
- options = this.options;
- if (target && target !== el) {
- let prevSwapEl = lastSwapEl;
- if (onMove(target) !== false) {
- toggleClass(target, options.swapClass, true);
- lastSwapEl = target;
- } else {
- lastSwapEl = null;
- }
-
- if (prevSwapEl && prevSwapEl !== lastSwapEl) {
- toggleClass(prevSwapEl, options.swapClass, false);
- }
- }
- changed();
-
- completed(true);
- cancel();
- },
- drop({ activeSortable, putSortable, dragEl }) {
- let toSortable = (putSortable || this.sortable);
- let options = this.options;
- lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);
- if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {
- if (dragEl !== lastSwapEl) {
- toSortable.captureAnimationState();
- if (toSortable !== activeSortable) activeSortable.captureAnimationState();
- swapNodes(dragEl, lastSwapEl);
-
- toSortable.animateAll();
- if (toSortable !== activeSortable) activeSortable.animateAll();
- }
- }
- },
- nulling() {
- lastSwapEl = null;
- }
- };
-
- return Object.assign(Swap, {
- pluginName: 'swap',
- eventProperties() {
- return {
- swapItem: lastSwapEl
- };
- }
- });
- }
+ function Swap() {
+ this.defaults = {
+ swapClass: "sortable-swap-highlight",
+ };
+ }
+
+ Swap.prototype = {
+ dragStart({ dragEl }) {
+ lastSwapEl = dragEl;
+ },
+ dragOverValid({
+ completed,
+ target,
+ onMove,
+ activeSortable,
+ changed,
+ cancel,
+ }) {
+ if (!activeSortable.options.swap) return;
+ let el = this.sortable.el,
+ options = this.options;
+ if (target && target !== el) {
+ let prevSwapEl = lastSwapEl;
+ if (onMove(target) !== false) {
+ toggleClass(target, options.swapClass, true);
+ lastSwapEl = target;
+ } else {
+ lastSwapEl = null;
+ }
+
+ if (prevSwapEl && prevSwapEl !== lastSwapEl) {
+ toggleClass(prevSwapEl, options.swapClass, false);
+ }
+ }
+ changed();
+
+ completed(true);
+ cancel();
+ },
+ drop({ activeSortable, putSortable, dragEl }) {
+ let toSortable = putSortable || this.sortable;
+ let options = this.options;
+ lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);
+ if (
+ lastSwapEl &&
+ (options.swap || (putSortable && putSortable.options.swap))
+ ) {
+ if (dragEl !== lastSwapEl) {
+ toSortable.captureAnimationState();
+ if (toSortable !== activeSortable)
+ activeSortable.captureAnimationState();
+ swapNodes(dragEl, lastSwapEl);
+
+ toSortable.animateAll();
+ if (toSortable !== activeSortable) activeSortable.animateAll();
+ }
+ }
+ },
+ nulling() {
+ lastSwapEl = null;
+ },
+ };
+ return Object.assign(Swap, {
+ pluginName: "swap",
+ eventProperties() {
+ return {
+ swapItem: lastSwapEl,
+ };
+ },
+ });
+ }
function swapNodes(n1, n2) {
- let p1 = n1.parentNode,
- p2 = n2.parentNode,
- i1, i2;
+ let p1 = n1.parentNode,
+ p2 = n2.parentNode,
+ i1,
+ i2;
- if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;
+ if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;
- i1 = index(n1);
- i2 = index(n2);
+ i1 = index(n1);
+ i2 = index(n2);
- if (p1.isEqualNode(p2) && i1 < i2) {
- i2++;
- }
- p1.insertBefore(n2, p1.children[i1]);
- p2.insertBefore(n1, p2.children[i2]);
+ if (p1.isEqualNode(p2) && i1 < i2) {
+ i2++;
+ }
+ p1.insertBefore(n2, p1.children[i1]);
+ p2.insertBefore(n1, p2.children[i2]);
}
let multiDragElements = [],
- multiDragClones = [],
- lastMultiDragSelect, // for selection with modifier key down (SHIFT)
- multiDragSortable,
- initialFolding = false, // Initial multi-drag fold when drag started
- folding = false, // Folding any other time
- dragStarted = false,
- dragEl$1,
- clonesFromRect,
- clonesHidden;
+ multiDragClones = [],
+ lastMultiDragSelect, // for selection with modifier key down (SHIFT)
+ multiDragSortable,
+ initialFolding = false, // Initial multi-drag fold when drag started
+ folding = false, // Folding any other time
+ dragStarted = false,
+ dragEl$1,
+ clonesFromRect,
+ clonesHidden;
function MultiDragPlugin() {
- function MultiDrag(sortable) {
- // Bind all private methods
- for (let fn in this) {
- if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
- this[fn] = this[fn].bind(this);
- }
- }
-
- if (sortable.options.supportPointer) {
- on(document, 'pointerup', this._deselectMultiDrag);
- } else {
- on(document, 'mouseup', this._deselectMultiDrag);
- on(document, 'touchend', this._deselectMultiDrag);
- }
-
- on(document, 'keydown', this._checkKeyDown);
- on(document, 'keyup', this._checkKeyUp);
-
- this.defaults = {
- selectedClass: 'sortable-selected',
- multiDragKey: null,
- setData(dataTransfer, dragEl) {
- let data = '';
- if (multiDragElements.length && multiDragSortable === sortable) {
- multiDragElements.forEach((multiDragElement, i) => {
- data += (!i ? '' : ', ') + multiDragElement.textContent;
- });
- } else {
- data = dragEl.textContent;
- }
- dataTransfer.setData('Text', data);
- }
- };
- }
-
- MultiDrag.prototype = {
- multiDragKeyDown: false,
- isMultiDrag: false,
-
-
- delayStartGlobal({ dragEl: dragged }) {
- dragEl$1 = dragged;
- },
-
- delayEnded() {
- this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);
- },
-
- setupClone({ sortable, cancel }) {
- if (!this.isMultiDrag) return;
- for (let i = 0; i < multiDragElements.length; i++) {
- multiDragClones.push(clone(multiDragElements[i]));
-
- multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;
-
- multiDragClones[i].draggable = false;
- multiDragClones[i].style['will-change'] = '';
-
- toggleClass(multiDragClones[i], this.options.selectedClass, false);
- multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);
- }
-
- sortable._hideClone();
- cancel();
- },
-
- clone({ sortable, rootEl, dispatchSortableEvent, cancel }) {
- if (!this.isMultiDrag) return;
- if (!this.options.removeCloneOnHide) {
- if (multiDragElements.length && multiDragSortable === sortable) {
- insertMultiDragClones(true, rootEl);
- dispatchSortableEvent('clone');
-
- cancel();
- }
- }
- },
-
- showClone({ cloneNowShown, rootEl, cancel }) {
- if (!this.isMultiDrag) return;
- insertMultiDragClones(false, rootEl);
- multiDragClones.forEach(clone => {
- css(clone, 'display', '');
- });
-
- cloneNowShown();
- clonesHidden = false;
- cancel();
- },
-
- hideClone({ sortable, cloneNowHidden, cancel }) {
- if (!this.isMultiDrag) return;
- multiDragClones.forEach(clone => {
- css(clone, 'display', 'none');
- if (this.options.removeCloneOnHide && clone.parentNode) {
- clone.parentNode.removeChild(clone);
- }
- });
-
- cloneNowHidden();
- clonesHidden = true;
- cancel();
- },
-
- dragStartGlobal({ sortable }) {
- if (!this.isMultiDrag && multiDragSortable) {
- multiDragSortable.multiDrag._deselectMultiDrag();
- }
-
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.sortableIndex = index(multiDragElement);
- });
-
- // Sort multi-drag elements
- multiDragElements = multiDragElements.sort(function(a, b) {
- return a.sortableIndex - b.sortableIndex;
- });
- dragStarted = true;
- },
-
- dragStarted({ sortable }) {
- if (!this.isMultiDrag) return;
- if (this.options.sort) {
- // Capture rects,
- // hide multi drag elements (by positioning them absolute),
- // set multi drag elements rects to dragRect,
- // show multi drag elements,
- // animate to rects,
- // unset rects & remove from DOM
-
- sortable.captureAnimationState();
-
- if (this.options.animation) {
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- css(multiDragElement, 'position', 'absolute');
- });
-
- let dragRect = getRect(dragEl$1, false, true, true);
-
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- setRect(multiDragElement, dragRect);
- });
-
- folding = true;
- initialFolding = true;
- }
- }
-
- sortable.animateAll(() => {
- folding = false;
- initialFolding = false;
-
- if (this.options.animation) {
- multiDragElements.forEach(multiDragElement => {
- unsetRect(multiDragElement);
- });
- }
-
- // Remove all auxiliary multidrag items from el, if sorting enabled
- if (this.options.sort) {
- removeMultiDragElements();
- }
- });
- },
-
- dragOver({ target, completed, cancel }) {
- if (folding && ~multiDragElements.indexOf(target)) {
- completed(false);
- cancel();
- }
- },
-
- revert({ fromSortable, rootEl, sortable, dragRect }) {
- if (multiDragElements.length > 1) {
- // Setup unfold animation
- multiDragElements.forEach(multiDragElement => {
- sortable.addAnimationState({
- target: multiDragElement,
- rect: folding ? getRect(multiDragElement) : dragRect
- });
-
- unsetRect(multiDragElement);
-
- multiDragElement.fromRect = dragRect;
-
- fromSortable.removeAnimationState(multiDragElement);
- });
- folding = false;
- insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);
- }
- },
-
- dragOverCompleted({ sortable, isOwner, insertion, activeSortable, parentEl, putSortable }) {
- let options = this.options;
- if (insertion) {
- // Clones must be hidden before folding animation to capture dragRectAbsolute properly
- if (isOwner) {
- activeSortable._hideClone();
- }
-
- initialFolding = false;
- // If leaving sort:false root, or already folding - Fold to new location
- if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {
- // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible
- let dragRectAbsolute = getRect(dragEl$1, false, true, true);
-
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- setRect(multiDragElement, dragRectAbsolute);
-
- // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted
- // while folding, and so that we can capture them again because old sortable will no longer be fromSortable
- parentEl.appendChild(multiDragElement);
- });
-
- folding = true;
- }
-
- // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out
- if (!isOwner) {
- // Only remove if not folding (folding will remove them anyways)
- if (!folding) {
- removeMultiDragElements();
- }
-
- if (multiDragElements.length > 1) {
- let clonesHiddenBefore = clonesHidden;
- activeSortable._showClone(sortable);
-
- // Unfold animation for clones if showing from hidden
- if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {
- multiDragClones.forEach(clone => {
- activeSortable.addAnimationState({
- target: clone,
- rect: clonesFromRect
- });
-
- clone.fromRect = clonesFromRect;
- clone.thisAnimationDuration = null;
- });
- }
- } else {
- activeSortable._showClone(sortable);
- }
- }
- }
- },
-
- dragOverAnimationCapture({ dragRect, isOwner, activeSortable }) {
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.thisAnimationDuration = null;
- });
-
- if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {
- clonesFromRect = Object.assign({}, dragRect);
- let dragMatrix = matrix(dragEl$1, true);
- clonesFromRect.top -= dragMatrix.f;
- clonesFromRect.left -= dragMatrix.e;
- }
- },
-
- dragOverAnimationComplete() {
- if (folding) {
- folding = false;
- removeMultiDragElements();
- }
- },
-
- drop({ originalEvent: evt, rootEl, parentEl, sortable, dispatchSortableEvent, oldIndex, putSortable }) {
- let toSortable = (putSortable || this.sortable);
-
- if (!evt) return;
-
- let options = this.options,
- children = parentEl.children;
-
- // Multi-drag selection
- if (!dragStarted) {
- if (options.multiDragKey && !this.multiDragKeyDown) {
- this._deselectMultiDrag();
- }
- toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));
-
- if (!~multiDragElements.indexOf(dragEl$1)) {
- multiDragElements.push(dragEl$1);
- dispatchEvent({
- sortable,
- rootEl,
- name: 'select',
- targetEl: dragEl$1,
- originalEvt: evt
- });
-
- // Modifier activated, select from last to dragEl
- if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {
- let lastIndex = index(lastMultiDragSelect),
- currentIndex = index(dragEl$1);
-
- if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {
- // Must include lastMultiDragSelect (select it), in case modified selection from no selection
- // (but previous selection existed)
- let n, i;
- if (currentIndex > lastIndex) {
- i = lastIndex;
- n = currentIndex;
- } else {
- i = currentIndex;
- n = lastIndex + 1;
- }
-
- for (; i < n; i++) {
- if (~multiDragElements.indexOf(children[i])) continue;
- toggleClass(children[i], options.selectedClass, true);
- multiDragElements.push(children[i]);
-
- dispatchEvent({
- sortable,
- rootEl,
- name: 'select',
- targetEl: children[i],
- originalEvt: evt
- });
- }
- }
- } else {
- lastMultiDragSelect = dragEl$1;
- }
-
- multiDragSortable = toSortable;
- } else {
- multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);
- lastMultiDragSelect = null;
- dispatchEvent({
- sortable,
- rootEl,
- name: 'deselect',
- targetEl: dragEl$1,
- originalEvt: evt
- });
- }
- }
-
- // Multi-drag drop
- if (dragStarted && this.isMultiDrag) {
- // Do not "unfold" after around dragEl if reverted
- if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {
- let dragRect = getRect(dragEl$1),
- multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');
-
- if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;
-
- toSortable.captureAnimationState();
-
- if (!initialFolding) {
- if (options.animation) {
- dragEl$1.fromRect = dragRect;
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.thisAnimationDuration = null;
- if (multiDragElement !== dragEl$1) {
- let rect = folding ? getRect(multiDragElement) : dragRect;
- multiDragElement.fromRect = rect;
-
- // Prepare unfold animation
- toSortable.addAnimationState({
- target: multiDragElement,
- rect: rect
- });
- }
- });
- }
-
- // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert
- // properly they must all be removed
- removeMultiDragElements();
-
- multiDragElements.forEach(multiDragElement => {
- if (children[multiDragIndex]) {
- parentEl.insertBefore(multiDragElement, children[multiDragIndex]);
- } else {
- parentEl.appendChild(multiDragElement);
- }
- multiDragIndex++;
- });
-
- // If initial folding is done, the elements may have changed position because they are now
- // unfolding around dragEl, even though dragEl may not have his index changed, so update event
- // must be fired here as Sortable will not.
- if (oldIndex === index(dragEl$1)) {
- let update = false;
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement.sortableIndex !== index(multiDragElement)) {
- update = true;
- return;
- }
- });
-
- if (update) {
- dispatchSortableEvent('update');
- }
- }
- }
-
- // Must be done after capturing individual rects (scroll bar)
- multiDragElements.forEach(multiDragElement => {
- unsetRect(multiDragElement);
- });
-
- toSortable.animateAll();
- }
-
- multiDragSortable = toSortable;
- }
-
- // Remove clones if necessary
- if (rootEl === parentEl || (putSortable && putSortable.lastPutMode !== 'clone')) {
- multiDragClones.forEach(clone => {
- clone.parentNode && clone.parentNode.removeChild(clone);
- });
- }
- },
-
- nullingGlobal() {
- this.isMultiDrag =
- dragStarted = false;
- multiDragClones.length = 0;
- },
-
- destroyGlobal() {
- this._deselectMultiDrag();
- off(document, 'pointerup', this._deselectMultiDrag);
- off(document, 'mouseup', this._deselectMultiDrag);
- off(document, 'touchend', this._deselectMultiDrag);
-
- off(document, 'keydown', this._checkKeyDown);
- off(document, 'keyup', this._checkKeyUp);
- },
-
- _deselectMultiDrag(evt) {
- if (typeof dragStarted !== "undefined" && dragStarted) return;
-
- // Only deselect if selection is in this sortable
- if (multiDragSortable !== this.sortable) return;
-
- // Only deselect if target is not item in this sortable
- if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;
-
- // Only deselect if left click
- if (evt && evt.button !== 0) return;
-
- while (multiDragElements.length) {
- let el = multiDragElements[0];
- toggleClass(el, this.options.selectedClass, false);
- multiDragElements.shift();
- dispatchEvent({
- sortable: this.sortable,
- rootEl: this.sortable.el,
- name: 'deselect',
- targetEl: el,
- originalEvt: evt
- });
- }
- },
-
- _checkKeyDown(evt) {
- if (evt.key === this.options.multiDragKey) {
- this.multiDragKeyDown = true;
- }
- },
-
- _checkKeyUp(evt) {
- if (evt.key === this.options.multiDragKey) {
- this.multiDragKeyDown = false;
- }
- }
- };
-
- return Object.assign(MultiDrag, {
- // Static methods & properties
- pluginName: 'multiDrag',
- utils: {
- /**
- * Selects the provided multi-drag item
- * @param {HTMLElement} el The element to be selected
- */
- select(el) {
- let sortable = el.parentNode[expando];
- if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;
- if (multiDragSortable && multiDragSortable !== sortable) {
- multiDragSortable.multiDrag._deselectMultiDrag();
- multiDragSortable = sortable;
- }
- toggleClass(el, sortable.options.selectedClass, true);
- multiDragElements.push(el);
- },
- /**
- * Deselects the provided multi-drag item
- * @param {HTMLElement} el The element to be deselected
- */
- deselect(el) {
- let sortable = el.parentNode[expando],
- index = multiDragElements.indexOf(el);
- if (!sortable || !sortable.options.multiDrag || !~index) return;
- toggleClass(el, sortable.options.selectedClass, false);
- multiDragElements.splice(index, 1);
- }
- },
- eventProperties() {
- const oldIndicies = [],
- newIndicies = [];
-
- multiDragElements.forEach(multiDragElement => {
- oldIndicies.push({
- multiDragElement,
- index: multiDragElement.sortableIndex
- });
-
- // multiDragElements will already be sorted if folding
- let newIndex;
- if (folding && multiDragElement !== dragEl$1) {
- newIndex = -1;
- } else if (folding) {
- newIndex = index(multiDragElement, ':not(.' + this.options.selectedClass + ')');
- } else {
- newIndex = index(multiDragElement);
- }
- newIndicies.push({
- multiDragElement,
- index: newIndex
- });
- });
- return {
- items: [...multiDragElements],
- clones: [...multiDragClones],
- oldIndicies,
- newIndicies
- };
- },
- optionListeners: {
- multiDragKey(key) {
- key = key.toLowerCase();
- if (key === 'ctrl') {
- key = 'Control';
- } else if (key.length > 1) {
- key = key.charAt(0).toUpperCase() + key.substr(1);
- }
- return key;
- }
- }
- });
+ function MultiDrag(sortable) {
+ // Bind all private methods
+ for (let fn in this) {
+ if (fn.charAt(0) === "_" && typeof this[fn] === "function") {
+ this[fn] = this[fn].bind(this);
+ }
+ }
+
+ if (sortable.options.supportPointer) {
+ on(document, "pointerup", this._deselectMultiDrag);
+ } else {
+ on(document, "mouseup", this._deselectMultiDrag);
+ on(document, "touchend", this._deselectMultiDrag);
+ }
+
+ on(document, "keydown", this._checkKeyDown);
+ on(document, "keyup", this._checkKeyUp);
+
+ this.defaults = {
+ selectedClass: "sortable-selected",
+ multiDragKey: null,
+ setData(dataTransfer, dragEl) {
+ let data = "";
+ if (multiDragElements.length && multiDragSortable === sortable) {
+ multiDragElements.forEach((multiDragElement, i) => {
+ data += (!i ? "" : ", ") + multiDragElement.textContent;
+ });
+ } else {
+ data = dragEl.textContent;
+ }
+ dataTransfer.setData("Text", data);
+ },
+ };
+ }
+
+ MultiDrag.prototype = {
+ multiDragKeyDown: false,
+ isMultiDrag: false,
+
+ delayStartGlobal({ dragEl: dragged }) {
+ dragEl$1 = dragged;
+ },
+
+ delayEnded() {
+ this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);
+ },
+
+ setupClone({ sortable, cancel }) {
+ if (!this.isMultiDrag) return;
+ for (let i = 0; i < multiDragElements.length; i++) {
+ multiDragClones.push(clone(multiDragElements[i]));
+
+ multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;
+
+ multiDragClones[i].draggable = false;
+ multiDragClones[i].style["will-change"] = "";
+
+ toggleClass(multiDragClones[i], this.options.selectedClass, false);
+ multiDragElements[i] === dragEl$1 &&
+ toggleClass(multiDragClones[i], this.options.chosenClass, false);
+ }
+
+ sortable._hideClone();
+ cancel();
+ },
+
+ clone({ sortable, rootEl, dispatchSortableEvent, cancel }) {
+ if (!this.isMultiDrag) return;
+ if (!this.options.removeCloneOnHide) {
+ if (multiDragElements.length && multiDragSortable === sortable) {
+ insertMultiDragClones(true, rootEl);
+ dispatchSortableEvent("clone");
+
+ cancel();
+ }
+ }
+ },
+
+ showClone({ cloneNowShown, rootEl, cancel }) {
+ if (!this.isMultiDrag) return;
+ insertMultiDragClones(false, rootEl);
+ multiDragClones.forEach((clone) => {
+ css(clone, "display", "");
+ });
+
+ cloneNowShown();
+ clonesHidden = false;
+ cancel();
+ },
+
+ hideClone({ sortable, cloneNowHidden, cancel }) {
+ if (!this.isMultiDrag) return;
+ multiDragClones.forEach((clone) => {
+ css(clone, "display", "none");
+ if (this.options.removeCloneOnHide && clone.parentNode) {
+ clone.parentNode.removeChild(clone);
+ }
+ });
+
+ cloneNowHidden();
+ clonesHidden = true;
+ cancel();
+ },
+
+ dragStartGlobal({ sortable }) {
+ if (!this.isMultiDrag && multiDragSortable) {
+ multiDragSortable.multiDrag._deselectMultiDrag();
+ }
+
+ multiDragElements.forEach((multiDragElement) => {
+ multiDragElement.sortableIndex = index(multiDragElement);
+ });
+
+ // Sort multi-drag elements
+ multiDragElements = multiDragElements.sort(function (a, b) {
+ return a.sortableIndex - b.sortableIndex;
+ });
+ dragStarted = true;
+ },
+
+ dragStarted({ sortable }) {
+ if (!this.isMultiDrag) return;
+ if (this.options.sort) {
+ // Capture rects,
+ // hide multi drag elements (by positioning them absolute),
+ // set multi drag elements rects to dragRect,
+ // show multi drag elements,
+ // animate to rects,
+ // unset rects & remove from DOM
+
+ sortable.captureAnimationState();
+
+ if (this.options.animation) {
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ css(multiDragElement, "position", "absolute");
+ });
+
+ let dragRect = getRect(dragEl$1, false, true, true);
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ setRect(multiDragElement, dragRect);
+ });
+
+ folding = true;
+ initialFolding = true;
+ }
+ }
+
+ sortable.animateAll(() => {
+ folding = false;
+ initialFolding = false;
+
+ if (this.options.animation) {
+ multiDragElements.forEach((multiDragElement) => {
+ unsetRect(multiDragElement);
+ });
+ }
+
+ // Remove all auxiliary multidrag items from el, if sorting enabled
+ if (this.options.sort) {
+ removeMultiDragElements();
+ }
+ });
+ },
+
+ dragOver({ target, completed, cancel }) {
+ if (folding && ~multiDragElements.indexOf(target)) {
+ completed(false);
+ cancel();
+ }
+ },
+
+ revert({ fromSortable, rootEl, sortable, dragRect }) {
+ if (multiDragElements.length > 1) {
+ // Setup unfold animation
+ multiDragElements.forEach((multiDragElement) => {
+ sortable.addAnimationState({
+ target: multiDragElement,
+ rect: folding ? getRect(multiDragElement) : dragRect,
+ });
+
+ unsetRect(multiDragElement);
+
+ multiDragElement.fromRect = dragRect;
+
+ fromSortable.removeAnimationState(multiDragElement);
+ });
+ folding = false;
+ insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);
+ }
+ },
+
+ dragOverCompleted({
+ sortable,
+ isOwner,
+ insertion,
+ activeSortable,
+ parentEl,
+ putSortable,
+ }) {
+ let options = this.options;
+ if (insertion) {
+ // Clones must be hidden before folding animation to capture dragRectAbsolute properly
+ if (isOwner) {
+ activeSortable._hideClone();
+ }
+
+ initialFolding = false;
+ // If leaving sort:false root, or already folding - Fold to new location
+ if (
+ options.animation &&
+ multiDragElements.length > 1 &&
+ (folding ||
+ (!isOwner && !activeSortable.options.sort && !putSortable))
+ ) {
+ // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible
+ let dragRectAbsolute = getRect(dragEl$1, false, true, true);
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ setRect(multiDragElement, dragRectAbsolute);
+
+ // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted
+ // while folding, and so that we can capture them again because old sortable will no longer be fromSortable
+ parentEl.appendChild(multiDragElement);
+ });
+
+ folding = true;
+ }
+
+ // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out
+ if (!isOwner) {
+ // Only remove if not folding (folding will remove them anyways)
+ if (!folding) {
+ removeMultiDragElements();
+ }
+
+ if (multiDragElements.length > 1) {
+ let clonesHiddenBefore = clonesHidden;
+ activeSortable._showClone(sortable);
+
+ // Unfold animation for clones if showing from hidden
+ if (
+ activeSortable.options.animation &&
+ !clonesHidden &&
+ clonesHiddenBefore
+ ) {
+ multiDragClones.forEach((clone) => {
+ activeSortable.addAnimationState({
+ target: clone,
+ rect: clonesFromRect,
+ });
+
+ clone.fromRect = clonesFromRect;
+ clone.thisAnimationDuration = null;
+ });
+ }
+ } else {
+ activeSortable._showClone(sortable);
+ }
+ }
+ }
+ },
+
+ dragOverAnimationCapture({ dragRect, isOwner, activeSortable }) {
+ multiDragElements.forEach((multiDragElement) => {
+ multiDragElement.thisAnimationDuration = null;
+ });
+
+ if (
+ activeSortable.options.animation &&
+ !isOwner &&
+ activeSortable.multiDrag.isMultiDrag
+ ) {
+ clonesFromRect = Object.assign({}, dragRect);
+ let dragMatrix = matrix(dragEl$1, true);
+ clonesFromRect.top -= dragMatrix.f;
+ clonesFromRect.left -= dragMatrix.e;
+ }
+ },
+
+ dragOverAnimationComplete() {
+ if (folding) {
+ folding = false;
+ removeMultiDragElements();
+ }
+ },
+
+ drop({
+ originalEvent: evt,
+ rootEl,
+ parentEl,
+ sortable,
+ dispatchSortableEvent,
+ oldIndex,
+ putSortable,
+ }) {
+ let toSortable = putSortable || this.sortable;
+
+ if (!evt) return;
+
+ let options = this.options,
+ children = parentEl.children;
+
+ // Multi-drag selection
+ if (!dragStarted) {
+ if (options.multiDragKey && !this.multiDragKeyDown) {
+ this._deselectMultiDrag();
+ }
+ toggleClass(
+ dragEl$1,
+ options.selectedClass,
+ !~multiDragElements.indexOf(dragEl$1)
+ );
+
+ if (!~multiDragElements.indexOf(dragEl$1)) {
+ multiDragElements.push(dragEl$1);
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "select",
+ targetEl: dragEl$1,
+ originalEvt: evt,
+ });
+
+ // Modifier activated, select from last to dragEl
+ if (
+ evt.shiftKey &&
+ lastMultiDragSelect &&
+ sortable.el.contains(lastMultiDragSelect)
+ ) {
+ let lastIndex = index(lastMultiDragSelect),
+ currentIndex = index(dragEl$1);
+
+ if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {
+ // Must include lastMultiDragSelect (select it), in case modified selection from no selection
+ // (but previous selection existed)
+ let n, i;
+ if (currentIndex > lastIndex) {
+ i = lastIndex;
+ n = currentIndex;
+ } else {
+ i = currentIndex;
+ n = lastIndex + 1;
+ }
+
+ for (; i < n; i++) {
+ if (~multiDragElements.indexOf(children[i])) continue;
+ toggleClass(children[i], options.selectedClass, true);
+ multiDragElements.push(children[i]);
+
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "select",
+ targetEl: children[i],
+ originalEvt: evt,
+ });
+ }
+ }
+ } else {
+ lastMultiDragSelect = dragEl$1;
+ }
+
+ multiDragSortable = toSortable;
+ } else {
+ multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);
+ lastMultiDragSelect = null;
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "deselect",
+ targetEl: dragEl$1,
+ originalEvt: evt,
+ });
+ }
+ }
+
+ // Multi-drag drop
+ if (dragStarted && this.isMultiDrag) {
+ // Do not "unfold" after around dragEl if reverted
+ if (
+ (parentEl[expando].options.sort || parentEl !== rootEl) &&
+ multiDragElements.length > 1
+ ) {
+ let dragRect = getRect(dragEl$1),
+ multiDragIndex = index(
+ dragEl$1,
+ ":not(." + this.options.selectedClass + ")"
+ );
+
+ if (!initialFolding && options.animation)
+ dragEl$1.thisAnimationDuration = null;
+
+ toSortable.captureAnimationState();
+
+ if (!initialFolding) {
+ if (options.animation) {
+ dragEl$1.fromRect = dragRect;
+ multiDragElements.forEach((multiDragElement) => {
+ multiDragElement.thisAnimationDuration = null;
+ if (multiDragElement !== dragEl$1) {
+ let rect = folding ? getRect(multiDragElement) : dragRect;
+ multiDragElement.fromRect = rect;
+
+ // Prepare unfold animation
+ toSortable.addAnimationState({
+ target: multiDragElement,
+ rect: rect,
+ });
+ }
+ });
+ }
+
+ // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert
+ // properly they must all be removed
+ removeMultiDragElements();
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (children[multiDragIndex]) {
+ parentEl.insertBefore(
+ multiDragElement,
+ children[multiDragIndex]
+ );
+ } else {
+ parentEl.appendChild(multiDragElement);
+ }
+ multiDragIndex++;
+ });
+
+ // If initial folding is done, the elements may have changed position because they are now
+ // unfolding around dragEl, even though dragEl may not have his index changed, so update event
+ // must be fired here as Sortable will not.
+ if (oldIndex === index(dragEl$1)) {
+ let update = false;
+ multiDragElements.forEach((multiDragElement) => {
+ if (
+ multiDragElement.sortableIndex !== index(multiDragElement)
+ ) {
+ update = true;
+ return;
+ }
+ });
+
+ if (update) {
+ dispatchSortableEvent("update");
+ }
+ }
+ }
+
+ // Must be done after capturing individual rects (scroll bar)
+ multiDragElements.forEach((multiDragElement) => {
+ unsetRect(multiDragElement);
+ });
+
+ toSortable.animateAll();
+ }
+
+ multiDragSortable = toSortable;
+ }
+
+ // Remove clones if necessary
+ if (
+ rootEl === parentEl ||
+ (putSortable && putSortable.lastPutMode !== "clone")
+ ) {
+ multiDragClones.forEach((clone) => {
+ clone.parentNode && clone.parentNode.removeChild(clone);
+ });
+ }
+ },
+
+ nullingGlobal() {
+ this.isMultiDrag = dragStarted = false;
+ multiDragClones.length = 0;
+ },
+
+ destroyGlobal() {
+ this._deselectMultiDrag();
+ off(document, "pointerup", this._deselectMultiDrag);
+ off(document, "mouseup", this._deselectMultiDrag);
+ off(document, "touchend", this._deselectMultiDrag);
+
+ off(document, "keydown", this._checkKeyDown);
+ off(document, "keyup", this._checkKeyUp);
+ },
+
+ _deselectMultiDrag(evt) {
+ if (typeof dragStarted !== "undefined" && dragStarted) return;
+
+ // Only deselect if selection is in this sortable
+ if (multiDragSortable !== this.sortable) return;
+
+ // Only deselect if target is not item in this sortable
+ if (
+ evt &&
+ closest(evt.target, this.options.draggable, this.sortable.el, false)
+ )
+ return;
+
+ // Only deselect if left click
+ if (evt && evt.button !== 0) return;
+
+ while (multiDragElements.length) {
+ let el = multiDragElements[0];
+ toggleClass(el, this.options.selectedClass, false);
+ multiDragElements.shift();
+ dispatchEvent({
+ sortable: this.sortable,
+ rootEl: this.sortable.el,
+ name: "deselect",
+ targetEl: el,
+ originalEvt: evt,
+ });
+ }
+ },
+
+ _checkKeyDown(evt) {
+ if (evt.key === this.options.multiDragKey) {
+ this.multiDragKeyDown = true;
+ }
+ },
+
+ _checkKeyUp(evt) {
+ if (evt.key === this.options.multiDragKey) {
+ this.multiDragKeyDown = false;
+ }
+ },
+ };
+
+ return Object.assign(MultiDrag, {
+ // Static methods & properties
+ pluginName: "multiDrag",
+ utils: {
+ /**
+ * Selects the provided multi-drag item
+ * @param {HTMLElement} el The element to be selected
+ */
+ select(el) {
+ let sortable = el.parentNode[expando];
+ if (
+ !sortable ||
+ !sortable.options.multiDrag ||
+ ~multiDragElements.indexOf(el)
+ )
+ return;
+ if (multiDragSortable && multiDragSortable !== sortable) {
+ multiDragSortable.multiDrag._deselectMultiDrag();
+ multiDragSortable = sortable;
+ }
+ toggleClass(el, sortable.options.selectedClass, true);
+ multiDragElements.push(el);
+ },
+ /**
+ * Deselects the provided multi-drag item
+ * @param {HTMLElement} el The element to be deselected
+ */
+ deselect(el) {
+ let sortable = el.parentNode[expando],
+ index = multiDragElements.indexOf(el);
+ if (!sortable || !sortable.options.multiDrag || !~index) return;
+ toggleClass(el, sortable.options.selectedClass, false);
+ multiDragElements.splice(index, 1);
+ },
+ },
+ eventProperties() {
+ const oldIndicies = [],
+ newIndicies = [];
+
+ multiDragElements.forEach((multiDragElement) => {
+ oldIndicies.push({
+ multiDragElement,
+ index: multiDragElement.sortableIndex,
+ });
+
+ // multiDragElements will already be sorted if folding
+ let newIndex;
+ if (folding && multiDragElement !== dragEl$1) {
+ newIndex = -1;
+ } else if (folding) {
+ newIndex = index(
+ multiDragElement,
+ ":not(." + this.options.selectedClass + ")"
+ );
+ } else {
+ newIndex = index(multiDragElement);
+ }
+ newIndicies.push({
+ multiDragElement,
+ index: newIndex,
+ });
+ });
+ return {
+ items: [...multiDragElements],
+ clones: [...multiDragClones],
+ oldIndicies,
+ newIndicies,
+ };
+ },
+ optionListeners: {
+ multiDragKey(key) {
+ key = key.toLowerCase();
+ if (key === "ctrl") {
+ key = "Control";
+ } else if (key.length > 1) {
+ key = key.charAt(0).toUpperCase() + key.substr(1);
+ }
+ return key;
+ },
+ },
+ });
}
function insertMultiDragElements(clonesInserted, rootEl) {
- multiDragElements.forEach((multiDragElement, i) => {
- let target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];
- if (target) {
- rootEl.insertBefore(multiDragElement, target);
- } else {
- rootEl.appendChild(multiDragElement);
- }
- });
+ multiDragElements.forEach((multiDragElement, i) => {
+ let target =
+ rootEl.children[
+ multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)
+ ];
+ if (target) {
+ rootEl.insertBefore(multiDragElement, target);
+ } else {
+ rootEl.appendChild(multiDragElement);
+ }
+ });
}
/**
@@ -3916,21 +4120,25 @@
* @param {HTMLElement} rootEl
*/
function insertMultiDragClones(elementsInserted, rootEl) {
- multiDragClones.forEach((clone, i) => {
- let target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];
- if (target) {
- rootEl.insertBefore(clone, target);
- } else {
- rootEl.appendChild(clone);
- }
- });
+ multiDragClones.forEach((clone, i) => {
+ let target =
+ rootEl.children[
+ clone.sortableIndex + (elementsInserted ? Number(i) : 0)
+ ];
+ if (target) {
+ rootEl.insertBefore(clone, target);
+ } else {
+ rootEl.appendChild(clone);
+ }
+ });
}
function removeMultiDragElements() {
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);
- });
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ multiDragElement.parentNode &&
+ multiDragElement.parentNode.removeChild(multiDragElement);
+ });
}
Sortable.mount(new AutoScrollPlugin());
@@ -3940,5 +4148,4 @@
Sortable.mount(new MultiDragPlugin());
return Sortable;
-
-})));
+});
diff --git a/babel.config.js b/babel.config.js
deleted file mode 100644
index cfa698761..000000000
--- a/babel.config.js
+++ /dev/null
@@ -1,27 +0,0 @@
-module.exports = function(api) {
- api.cache(true);
-
- let presets;
-
- if (process.env.NODE_ENV === 'es') {
- presets = [
- [
- "@babel/preset-env",
- {
- "modules": false
- }
- ]
- ];
- } else if (process.env.NODE_ENV === 'umd') {
- presets = [
- [
- "@babel/preset-env"
- ]
- ];
- }
-
- return {
- plugins: ['@babel/plugin-transform-object-assign'],
- presets
- };
-};
diff --git a/bower.json b/bower.json
deleted file mode 100644
index 684363178..000000000
--- a/bower.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "name": "Sortable",
- "main": [
- "Sortable.js"
- ],
- "homepage": "http://SortableJS.github.io/Sortable/",
- "authors": [
- "RubaXa ",
- "owenm "
- ],
- "description": "JavaScript library for reorderable drag-and-drop lists on modern browsers and touch devices. No jQuery required. Supports Meteor, AngularJS, React, Polymer, Vue, Knockout and any CSS library, e.g. Bootstrap.",
- "keywords": [
- "sortable",
- "reorder",
- "list",
- "html5",
- "drag",
- "and",
- "drop",
- "dnd",
- "web-components"
- ],
- "license": "MIT",
- "ignore": [
- "node_modules",
- "bower_components",
- "test",
- "tests"
- ]
-}
diff --git a/docs/examples.md b/docs/examples.md
new file mode 100644
index 000000000..073b95b5b
--- /dev/null
+++ b/docs/examples.md
@@ -0,0 +1,32 @@
+### Bootstrap
+
+Demo: https://jsbin.com/visimub/edit?html,js,output
+
+```html
+
+
+
+
+
+
+
+
+
+ This is Sortable
+
+ It works with Bootstrap...
+ ...out of the box.
+ It has support for touch devices.
+ Just drag some elements around.
+
+
+
+```
diff --git a/plugins/README.md b/docs/plugins.md
similarity index 89%
rename from plugins/README.md
rename to docs/plugins.md
index 1dbef58d0..f36caa027 100644
--- a/plugins/README.md
+++ b/docs/plugins.md
@@ -1,6 +1,8 @@
+todo - move to wiki or docs
+
# Creating Sortable Plugins
-Sortable plugins are plugins that can be directly mounted to the Sortable class. They are a powerful way of modifying the default behaviour of Sortable beyond what simply using events alone allows. To mount your plugin to Sortable, it must pass a constructor function to the `Sortable.mount` function. This constructor function will be called (with the `new` keyword in front of it) whenever a Sortable instance with your plugin enabled is initialized. The constructor function will be called with the parameters `sortable` and `el`, which is the HTMLElement that the Sortable is being initialized on. This means that there will be a new instance of your plugin each time it is enabled in a Sortable.
+Sortable plugins are plugins that can be directly mounted to the Sortable class. They are a powerful way of modifying the default behaviour of Sortable beyond what simply using events alone allows. To mount your plugin to Sortable, it must pass a constructor function to the `Sortable.mount` function. This constructor function will be called (with the `new` keyword in front of it) whenever a Sortable instance with your plugin enabled is initialized. The constructor function will be called with the parameters `sortable` and `el`, which is the HTMLElement that the Sortable is being initialized on. This means that there will be a new instance of your plugin each time it is enabled in a Sortable.
## Constructor Parameters
@@ -10,8 +12,8 @@ Sortable plugins are plugins that can be directly mounted to the Sortable class.
`options: Object` — The options object that the user has passed into Sortable (not merged with defaults yet)
-
## Static Properties
+
The constructor function passed to `Sortable.mount` may contain several static properties and methods. The following static properties may be defined:
`pluginName: String` (Required)
@@ -37,68 +39,71 @@ The name of the method should match the name of the option it listens for. The n
Example:
```js
-Plugin.name = 'generateTitle';
+Plugin.name = "generateTitle";
Plugin.optionListeners = {
- // Listen for option 'generateTitle'
- generateTitle: function(title) {
- // Store the option in all caps
- return title.toUpperCase();
-
- // OR save it to this instance of your plugin as a private field.
- // This way it can be accessed in events, but will not modify the user's options.
- this.titleAllCaps = title.toUpperCase();
- }
+ // Listen for option 'generateTitle'
+ generateTitle: function (title) {
+ // Store the option in all caps
+ return title.toUpperCase();
+
+ // OR save it to this instance of your plugin as a private field.
+ // This way it can be accessed in events, but will not modify the user's options.
+ this.titleAllCaps = title.toUpperCase();
+ },
};
-
-```
+```
## Plugin Options
+
Plugins may have custom default options or may override the defaults of other options. In order to do this, there must be a `defaults` object on the initialized plugin. This can be set in the plugin's prototype, or during the initialization of the plugin (when the `el` is available). For example:
```js
function myPlugin(sortable, el, options) {
- this.defaults = {
- color: el.style.backgroundColor
- };
+ this.defaults = {
+ color: el.style.backgroundColor,
+ };
}
Sortable.mount(myPlugin);
```
-
## Plugin Events
### Context
+
The events will be fired in the context of their own parent object (ie. context is not changed), however the plugin instance's Sortable instance is available under `this.sortable`. Likewise, the options are available under `this.options`.
### Event List
+
The following table contains details on the events that a plugin may handle in the prototype of the plugin's constructor function.
-| Event Name | Description | Cancelable? | Cancel Behaviour | Event Type | Custom Event Object Properties |
-|---------------------------|------------------------------------------------------------------------------------------------------------------|-------------|----------------------------------------------------|------------|-------------------------------------------------------------------------|
-| filter | Fired when the element is filtered, and dragging is therefore canceled | No | - | Normal | None |
-| delayStart | Fired when the delay starts, even if there is no delay | Yes | Cancels sorting | Normal | None |
-| delayEnded | Fired when the delay ends, even if there is no delay | Yes | Cancels sorting | Normal | None |
-| setupClone | Fired when Sortable clones the dragged element | Yes | Cancels normal clone setup | Normal | None |
-| dragStart | Fired when the dragging is first started | Yes | Cancels sorting | Normal | None |
-| clone | Fired when the clone is inserted into the DOM (if `removeCloneOnHide: false`). Tick after dragStart. | Yes | Cancels normal clone insertion & hiding | Normal | None |
-| dragStarted | Fired tick after dragStart | No | - | Normal | None |
-| dragOver | Fired when the user drags over a sortable | Yes | Cancels normal dragover behaviour | DragOver | None |
-| dragOverValid | Fired when the user drags over a sortable that the dragged item can be inserted into | Yes | Cancels normal valid dragover behaviour | DragOver | None |
-| revert | Fired when the dragged item is reverted to it's original position when entering it's `sort:false` root | Yes | Cancels normal reverting, but is still completed() | DragOver | None |
-| dragOverCompleted | Fired when dragOver is completed (ie. bubbling is disabled). To check if inserted, use `inserted` even property. | No | - | DragOver | `insertion: Boolean` — Whether or not the dragged element was inserted |
-| dragOverAnimationCapture | Fired right before the animation state is captured in dragOver | No | - | DragOver | None |
-| dragOverAnimationComplete | Fired after the animation is completed after a dragOver insertion | No | - | DragOver | None |
-| drop | Fired on drop | Yes | Cancels normal drop behavior | Normal | None |
-| nulling | Fired when the plugin should preform cleanups, once all drop events have fired | No | - | Normal | None |
-| destroy | Fired when Sortable is destroyed | No | - | Normal | None |
+| Event Name | Description | Cancelable? | Cancel Behaviour | Event Type | Custom Event Object Properties |
+| ------------------------- | ---------------------------------------------------------------------------------------------------------------- | ----------- | -------------------------------------------------- | ---------- | ---------------------------------------------------------------------- |
+| filter | Fired when the element is filtered, and dragging is therefore canceled | No | - | Normal | None |
+| delayStart | Fired when the delay starts, even if there is no delay | Yes | Cancels sorting | Normal | None |
+| delayEnded | Fired when the delay ends, even if there is no delay | Yes | Cancels sorting | Normal | None |
+| setupClone | Fired when Sortable clones the dragged element | Yes | Cancels normal clone setup | Normal | None |
+| dragStart | Fired when the dragging is first started | Yes | Cancels sorting | Normal | None |
+| clone | Fired when the clone is inserted into the DOM (if `removeCloneOnHide: false`). Tick after dragStart. | Yes | Cancels normal clone insertion & hiding | Normal | None |
+| dragStarted | Fired tick after dragStart | No | - | Normal | None |
+| dragOver | Fired when the user drags over a sortable | Yes | Cancels normal dragover behaviour | DragOver | None |
+| dragOverValid | Fired when the user drags over a sortable that the dragged item can be inserted into | Yes | Cancels normal valid dragover behaviour | DragOver | None |
+| revert | Fired when the dragged item is reverted to it's original position when entering it's `sort:false` root | Yes | Cancels normal reverting, but is still completed() | DragOver | None |
+| dragOverCompleted | Fired when dragOver is completed (ie. bubbling is disabled). To check if inserted, use `inserted` even property. | No | - | DragOver | `insertion: Boolean` — Whether or not the dragged element was inserted |
+| dragOverAnimationCapture | Fired right before the animation state is captured in dragOver | No | - | DragOver | None |
+| dragOverAnimationComplete | Fired after the animation is completed after a dragOver insertion | No | - | DragOver | None |
+| drop | Fired on drop | Yes | Cancels normal drop behavior | Normal | None |
+| nulling | Fired when the plugin should preform cleanups, once all drop events have fired | No | - | Normal | None |
+| destroy | Fired when Sortable is destroyed | No | - | Normal | None |
### Global Events
+
Normally, an event will only be fired in a plugin if the plugin is enabled on the Sortable from which the event is being fired. However, it sometimes may be desirable for a plugin to listen in on an event from Sortables in which it is not enabled on. This is possible with global events. For an event to be global, simply add the suffix 'Global' to the event's name (casing matters) (eg. `dragStartGlobal`).
Please note that your plugin must be initialized on any Sortable from which it expects to recieve events, and that includes global events. In other words, you will want to keep the `initializeByDefault` option as it's default `true` value if your plugin needs to recieve events from Sortables it is not enabled on.
Please also note that if both normal and global event handlers are set, the global event handler will always be fired before the regular one.
### Event Object
+
An object with the following properties is passed as an argument to each plugin event when it is fired.
#### Properties:
@@ -119,7 +124,7 @@ An object with the following properties is passed as an argument to each plugin
`dragStarted: Boolean` — Boolean indicating whether or not the dragStart event has fired
-`putSortable: Sortable|undefined` — The element that dragEl is dragged into from it's root, otherwise undefined
+`putSortable: Sortable|undefined` — The element that dragEl is dragged into from it's root, otherwise undefined
`activeSortable: Sortable` — The active Sortable instance
@@ -133,7 +138,6 @@ An object with the following properties is passed as an argument to each plugin
`newDraggableIndex: Number` — The new index of dragEl, only counting draggable elements
-
#### Methods:
`cloneNowHidden()` — Function to be called if the plugin has hidden the clone
@@ -146,8 +150,8 @@ An object with the following properties is passed as an argument to each plugin
`dispatchSortableEvent(eventName: String)` — Function that can be used to emit an event on the current sortable while sorting, with all usual event properties set (eg. indexes, rootEl, cloneEl, originalEvent, etc.).
-
### DragOverEvent Object
+
This event is passed to dragover events, and extends the normal event object.
#### Properties:
@@ -168,7 +172,6 @@ This event is passed to dragover events, and extends the normal event object.
`target: HTMLElement` — The sortable item that is being dragged over
-
#### Methods:
`onMove(target: HTMLElement, after: Boolean): Boolean|Number` — Calls the `onMove` function the user specified in the options
diff --git a/docs/sortable-options.md b/docs/sortable-options.md
new file mode 100644
index 000000000..3e2e2b3b6
--- /dev/null
+++ b/docs/sortable-options.md
@@ -0,0 +1,234 @@
+# Sortable Options
+
+todo: on[Event] options. Currently they're only in the summary.
+todo: generate TOC
+
+## Normal Options
+
+### `group` option
+
+To drag elements from one list into another, both lists must have the same `group` value.
+You can also define whether lists can give away, give and keep a copy (`clone`), and receive elements.
+
+- name: `String` — group name
+- pull: `true|false|["foo", "bar"]|'clone'|function` — ability to move from the list. `clone` — copy the item, rather than move. Or an array of group names which the elements may be put in. Defaults to `true`.
+- put: `true|false|["baz", "qux"]|function` — whether elements can be added from other lists, or an array of group names from which elements can be added.
+- revertClone: `boolean` — revert cloned element to initial position after moving to a another list.
+
+Demo:
+
+- https://jsbin.com/hijetos/edit?js,output
+- https://jsbin.com/nacoyah/edit?js,output — use of complex logic in the `pull` and` put`
+- https://jsbin.com/bifuyab/edit?js,output — use `revertClone: true`
+
+### `sort` option
+
+Allow sorting inside list.
+
+Demo: https://jsbin.com/jayedig/edit?js,output
+
+### `delay` option
+
+Time in milliseconds to define when the sorting should start.
+Unfortunately, due to browser restrictions, delaying is not possible on IE or Edge with native drag & drop.
+
+Demo: https://jsbin.com/zosiwah/edit?js,output
+
+### `delayOnTouchOnly` option
+
+Whether or not the delay should be applied only if the user is using touch (eg. on a mobile device). No delay will be applied in any other case. Defaults to `false`.
+
+### `swapThreshold` option
+
+Percentage of the target that the swap zone will take up, as a float between `0` and `1`.
+
+[Read more](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#swap-threshold)
+
+Demo: http://sortablejs.github.io/Sortable#thresholds
+
+### `invertSwap` option
+
+Set to `true` to set the swap zone to the sides of the target, for the effect of sorting "in between" items.
+
+[Read more](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#forcing-inverted-swap-zone)
+
+Demo: http://sortablejs.github.io/Sortable#thresholds
+
+### `invertedSwapThreshold` option
+
+Percentage of the target that the inverted swap zone will take up, as a float between `0` and `1`. If not given, will default to `swapThreshold`.
+
+[Read more](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#dealing-with-swap-glitching)
+
+### `direction` option
+
+Direction that the Sortable should sort in. Can be set to `'vertical'`, `'horizontal'`, or a function, which will be called whenever a target is dragged over. Must return `'vertical'` or `'horizontal'`.
+
+[Read more](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#direction)
+
+Example of direction detection for vertical list that includes full column and half column elements:
+
+```js
+Sortable.create(el, {
+ direction: function (evt, target, dragEl) {
+ if (
+ target !== null &&
+ target.className.includes("half-column") &&
+ dragEl.className.includes("half-column")
+ ) {
+ return "horizontal";
+ }
+ return "vertical";
+ },
+});
+```
+
+### `touchStartThreshold` option
+
+This option is similar to `fallbackTolerance` option.
+
+When the `delay` option is set, some phones with very sensitive touch displays like the Samsung Galaxy S8 will fire
+unwanted touchmove events even when your finger is not moving, resulting in the sort not triggering.
+
+This option sets the minimum pointer movement that must occur before the delayed sorting is cancelled.
+
+Values between 3 to 5 are good.
+
+### `disabled` options
+
+Disables the sortable if set to `true`.
+
+Demo: https://jsbin.com/sewokud/edit?js,output
+
+```js
+var sortable = Sortable.create(list);
+
+document.getElementById("switcher").onclick = function () {
+ var state = sortable.option("disabled"); // get
+
+ sortable.option("disabled", !state); // set
+};
+```
+
+### `handle` option
+
+To make list items draggable, Sortable disables text selection by the user.
+That's not always desirable. To allow text selection, define a drag handler,
+which is an area of every list element that allows it to be dragged around.
+
+Demo: https://jsbin.com/numakuh/edit?html,js,output
+
+```js
+Sortable.create(el, {
+ handle: ".my-handle",
+});
+```
+
+```html
+
+ :: list item text one
+ :: list item text two
+
+```
+
+```css
+.my-handle {
+ cursor: move;
+ cursor: -webkit-grabbing;
+}
+```
+
+### `filter` option
+
+```js
+Sortable.create(list, {
+ filter: ".js-remove, .js-edit",
+ onFilter: function (evt) {
+ var item = evt.item,
+ ctrl = evt.target;
+
+ if (Sortable.utils.is(ctrl, ".js-remove")) {
+ // Click on remove button
+ item.parentNode.removeChild(item); // remove sortable item
+ } else if (Sortable.utils.is(ctrl, ".js-edit")) {
+ // Click on edit link
+ // ...
+ }
+ },
+});
+```
+
+### `ghostClass` option
+
+Class name for the drop placeholder (default `sortable-ghost`).
+
+Demo: https://jsbin.com/henuyiw/edit?css,js,output
+
+```css
+.ghost {
+ opacity: 0.4;
+}
+```
+
+```js
+Sortable.create(list, {
+ ghostClass: "ghost",
+});
+```
+
+### `chosenClass` option
+
+Class name for the chosen item (default `sortable-chosen`).
+
+Demo: https://jsbin.com/hoqufox/edit?css,js,output
+
+```css
+.chosen {
+ color: #fff;
+ background-color: #c00;
+}
+```
+
+```js
+Sortable.create(list, {
+ delay: 500,
+ chosenClass: "chosen",
+});
+```
+
+### `forceFallback` option
+
+If set to `true`, the Fallback for non HTML5 Browser will be used, even if we are using an HTML5 Browser.
+This gives us the possibility to test the behaviour for older Browsers even in newer Browser, or make the Drag 'n Drop feel more consistent between Desktop , Mobile and old Browsers.
+
+On top of that, the Fallback always generates a copy of that DOM Element and appends the class `fallbackClass` defined in the options. This behaviour controls the look of this 'dragged' Element.
+
+Demo: https://jsbin.com/sibiput/edit?html,css,js,output
+
+### `fallbackTolerance` option
+
+Emulates the native drag threshold. Specify in pixels how far the mouse should move before it's considered as a drag.
+Useful if the items are also clickable like in a list of links.
+
+When the user clicks inside a sortable element, it's not uncommon for your hand to move a little between the time you press and the time you release.
+Dragging only starts if you move the pointer past a certain tolerance, so that you don't accidentally start dragging every time you click.
+
+3 to 5 are probably good values.
+
+### `dragoverBubble` option
+
+If set to `true`, the dragover event will bubble to parent sortables. Works on both fallback and native dragover event.
+By default, it is false, but Sortable will only stop bubbling the event once the element has been inserted into a parent Sortable, or _can_ be inserted into a parent Sortable, but isn't at that specific time (due to animation, etc).
+
+Since 1.8.0, you will probably want to leave this option as false. Before 1.8.0, it may need to be `true` for nested sortables to work.
+
+### `removeCloneOnHide` option
+
+If set to `false`, the clone is hidden by having it's CSS `display` property set to `none`.
+By default, this option is `true`, meaning Sortable will remove the cloned element from the DOM when it is supposed to be hidden.
+
+### `emptyInsertThreshold` option
+
+The distance (in pixels) the mouse must be from an empty sortable while dragging for the drag element to be inserted into that sortable. Defaults to `5`. Set to `0` to disable this feature.
+
+Demo: https://jsbin.com/becavoj/edit?js,output
diff --git a/entry/entry-complete.js b/entry/entry-complete.js
deleted file mode 100644
index bf3dc5c13..000000000
--- a/entry/entry-complete.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import Sortable from './entry-defaults.js';
-import Swap from '../plugins/Swap';
-import MultiDrag from '../plugins/MultiDrag';
-
-Sortable.mount(new Swap());
-Sortable.mount(new MultiDrag());
-
-export default Sortable;
diff --git a/entry/entry-core.js b/entry/entry-core.js
deleted file mode 100644
index b5c3f77f7..000000000
--- a/entry/entry-core.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import Sortable from '../src/Sortable.js';
-import AutoScroll from '../plugins/AutoScroll';
-import OnSpill from '../plugins/OnSpill';
-import Swap from '../plugins/Swap';
-import MultiDrag from '../plugins/MultiDrag';
-
-export default Sortable;
-
-export {
- Sortable,
-
- // Default
- AutoScroll,
- OnSpill,
-
- // Extra
- Swap,
- MultiDrag
-};
diff --git a/entry/entry-defaults.js b/entry/entry-defaults.js
deleted file mode 100644
index 9d3fb6830..000000000
--- a/entry/entry-defaults.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import Sortable from '../src/Sortable.js';
-import AutoScroll from '../plugins/AutoScroll';
-import { RemoveOnSpill, RevertOnSpill } from '../plugins/OnSpill';
-// Extra
-import Swap from '../plugins/Swap';
-import MultiDrag from '../plugins/MultiDrag';
-
-Sortable.mount(new AutoScroll());
-Sortable.mount(RemoveOnSpill, RevertOnSpill);
-
-export default Sortable;
-
-export {
- Sortable,
-
- // Extra
- Swap,
- MultiDrag
-};
diff --git a/lerna.json b/lerna.json
new file mode 100644
index 000000000..1747d56e5
--- /dev/null
+++ b/lerna.json
@@ -0,0 +1,10 @@
+{
+ "packages": [
+ "packages/sortable",
+ "packages/sortablejs",
+ "packages/plugins/*",
+ "packages/utils"
+ ],
+ "version": "1.11.1",
+ "npmClient": "yarn"
+}
diff --git a/modular/sortable.complete.esm.js b/modular/sortable.complete.esm.js
index 34995a3a4..23374800c 100644
--- a/modular/sortable.complete.esm.js
+++ b/modular/sortable.complete.esm.js
@@ -7,175 +7,184 @@
var version = "1.11.0";
function userAgent(pattern) {
- if (typeof window !== 'undefined' && window.navigator) {
- return !!/*@__PURE__*/navigator.userAgent.match(pattern);
- }
+ if (typeof window !== "undefined" && window.navigator) {
+ return !!(/*@__PURE__*/ navigator.userAgent.match(pattern));
+ }
}
-const IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i);
+const IE11OrLess = userAgent(
+ /(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i
+);
const Edge = userAgent(/Edge/i);
const FireFox = userAgent(/firefox/i);
-const Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);
+const Safari =
+ userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);
const IOS = userAgent(/iP(ad|od|hone)/i);
const ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);
const captureMode = {
- capture: false,
- passive: false
+ capture: false,
+ passive: false,
};
function on(el, event, fn) {
- el.addEventListener(event, fn, !IE11OrLess && captureMode);
+ el.addEventListener(event, fn, !IE11OrLess && captureMode);
}
function off(el, event, fn) {
- el.removeEventListener(event, fn, !IE11OrLess && captureMode);
+ el.removeEventListener(event, fn, !IE11OrLess && captureMode);
}
-function matches(/**HTMLElement*/el, /**String*/selector) {
- if (!selector) return;
-
- selector[0] === '>' && (selector = selector.substring(1));
-
- if (el) {
- try {
- if (el.matches) {
- return el.matches(selector);
- } else if (el.msMatchesSelector) {
- return el.msMatchesSelector(selector);
- } else if (el.webkitMatchesSelector) {
- return el.webkitMatchesSelector(selector);
- }
- } catch(_) {
- return false;
- }
- }
-
- return false;
+function matches(/**HTMLElement*/ el, /**String*/ selector) {
+ if (!selector) return;
+
+ selector[0] === ">" && (selector = selector.substring(1));
+
+ if (el) {
+ try {
+ if (el.matches) {
+ return el.matches(selector);
+ } else if (el.msMatchesSelector) {
+ return el.msMatchesSelector(selector);
+ } else if (el.webkitMatchesSelector) {
+ return el.webkitMatchesSelector(selector);
+ }
+ } catch (_) {
+ return false;
+ }
+ }
+
+ return false;
}
function getParentOrHost(el) {
- return (el.host && el !== document && el.host.nodeType)
- ? el.host
- : el.parentNode;
+ return el.host && el !== document && el.host.nodeType
+ ? el.host
+ : el.parentNode;
}
-function closest(/**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {
- if (el) {
- ctx = ctx || document;
-
- do {
- if (
- selector != null &&
- (
- selector[0] === '>' ?
- el.parentNode === ctx && matches(el, selector) :
- matches(el, selector)
- ) ||
- includeCTX && el === ctx
- ) {
- return el;
- }
-
- if (el === ctx) break;
- /* jshint boss:true */
- } while (el = getParentOrHost(el));
- }
-
- return null;
+function closest(
+ /**HTMLElement*/ el,
+ /**String*/ selector,
+ /**HTMLElement*/ ctx,
+ includeCTX
+) {
+ if (el) {
+ ctx = ctx || document;
+
+ do {
+ if (
+ (selector != null &&
+ (selector[0] === ">"
+ ? el.parentNode === ctx && matches(el, selector)
+ : matches(el, selector))) ||
+ (includeCTX && el === ctx)
+ ) {
+ return el;
+ }
+
+ if (el === ctx) break;
+ /* jshint boss:true */
+ } while ((el = getParentOrHost(el)));
+ }
+
+ return null;
}
const R_SPACE = /\s+/g;
function toggleClass(el, name, state) {
- if (el && name) {
- if (el.classList) {
- el.classList[state ? 'add' : 'remove'](name);
- }
- else {
- let className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');
- el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');
- }
- }
+ if (el && name) {
+ if (el.classList) {
+ el.classList[state ? "add" : "remove"](name);
+ } else {
+ let className = (" " + el.className + " ")
+ .replace(R_SPACE, " ")
+ .replace(" " + name + " ", " ");
+ el.className = (className + (state ? " " + name : "")).replace(
+ R_SPACE,
+ " "
+ );
+ }
+ }
}
-
function css(el, prop, val) {
- let style = el && el.style;
-
- if (style) {
- if (val === void 0) {
- if (document.defaultView && document.defaultView.getComputedStyle) {
- val = document.defaultView.getComputedStyle(el, '');
- }
- else if (el.currentStyle) {
- val = el.currentStyle;
- }
-
- return prop === void 0 ? val : val[prop];
- }
- else {
- if (!(prop in style) && prop.indexOf('webkit') === -1) {
- prop = '-webkit-' + prop;
- }
-
- style[prop] = val + (typeof val === 'string' ? '' : 'px');
- }
- }
+ let style = el && el.style;
+
+ if (style) {
+ if (val === void 0) {
+ if (document.defaultView && document.defaultView.getComputedStyle) {
+ val = document.defaultView.getComputedStyle(el, "");
+ } else if (el.currentStyle) {
+ val = el.currentStyle;
+ }
+
+ return prop === void 0 ? val : val[prop];
+ } else {
+ if (!(prop in style) && prop.indexOf("webkit") === -1) {
+ prop = "-webkit-" + prop;
+ }
+
+ style[prop] = val + (typeof val === "string" ? "" : "px");
+ }
+ }
}
function matrix(el, selfOnly) {
- let appliedTransforms = '';
- if (typeof(el) === 'string') {
- appliedTransforms = el;
- } else {
- do {
- //@ts-ignore
- let transform = css(el, 'transform');
-
- if (transform && transform !== 'none') {
- appliedTransforms = transform + ' ' + appliedTransforms;
- }
- /* jshint boss:true */
- } while (!selfOnly && (el = el.parentNode));
- }
-
- //@ts-ignore
- const matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;
- /*jshint -W056 */
- return matrixFn && (new matrixFn(appliedTransforms));
-}
+ let appliedTransforms = "";
+ if (typeof el === "string") {
+ appliedTransforms = el;
+ } else {
+ do {
+ //@ts-ignore
+ let transform = css(el, "transform");
+
+ if (transform && transform !== "none") {
+ appliedTransforms = transform + " " + appliedTransforms;
+ }
+ /* jshint boss:true */
+ } while (!selfOnly && (el = el.parentNode));
+ }
+ //@ts-ignore
+ const matrixFn =
+ window.DOMMatrix ||
+ window.WebKitCSSMatrix ||
+ window.CSSMatrix ||
+ window.MSCSSMatrix;
+ /*jshint -W056 */
+ return matrixFn && new matrixFn(appliedTransforms);
+}
function find(ctx, tagName, iterator) {
- if (ctx) {
- let list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;
+ if (ctx) {
+ let list = ctx.getElementsByTagName(tagName),
+ i = 0,
+ n = list.length;
- if (iterator) {
- for (; i < n; i++) {
- iterator(list[i], i);
- }
- }
+ if (iterator) {
+ for (; i < n; i++) {
+ iterator(list[i], i);
+ }
+ }
- return list;
- }
+ return list;
+ }
- return [];
+ return [];
}
-
-
function getWindowScrollingElement() {
- let scrollingElement = document.scrollingElement;
+ let scrollingElement = document.scrollingElement;
- if (scrollingElement) {
- return scrollingElement
- } else {
- return document.documentElement
- }
+ if (scrollingElement) {
+ return scrollingElement;
+ } else {
+ return document.documentElement;
+ }
}
-
/**
* Returns the "bounding client rect" of given element
* @param {HTMLElement} el The element whose boundingClientRect is wanted
@@ -185,97 +194,100 @@ function getWindowScrollingElement() {
* @param {[HTMLElement]} container The parent the element will be placed in
* @return {Object} The boundingClientRect of el, with specified adjustments
*/
-function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {
- if (!el.getBoundingClientRect && el !== window) return;
-
- let elRect,
- top,
- left,
- bottom,
- right,
- height,
- width;
-
- if (el !== window && el !== getWindowScrollingElement()) {
- elRect = el.getBoundingClientRect();
- top = elRect.top;
- left = elRect.left;
- bottom = elRect.bottom;
- right = elRect.right;
- height = elRect.height;
- width = elRect.width;
- } else {
- top = 0;
- left = 0;
- bottom = window.innerHeight;
- right = window.innerWidth;
- height = window.innerHeight;
- width = window.innerWidth;
- }
-
- if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {
- // Adjust for translate()
- container = container || el.parentNode;
-
- // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)
- // Not needed on <= IE11
- if (!IE11OrLess) {
- do {
- if (
- container &&
- container.getBoundingClientRect &&
- (
- //@ts-ignore
- css(container, 'transform') !== 'none' ||
- relativeToNonStaticParent &&
- //@ts-ignore
- css(container, 'position') !== 'static'
- )
- ) {
- let containerRect = container.getBoundingClientRect();
-
- // Set relative to edges of padding box of container
- //@ts-ignore
- top -= containerRect.top + parseInt(css(container, 'border-top-width'));
- //@ts-ignore
- left -= containerRect.left + parseInt(css(container, 'border-left-width'));
- bottom = top + elRect.height;
- right = left + elRect.width;
-
- break;
- }
- /* jshint boss:true */
- } while (container = container.parentNode);
- }
- }
-
- if (undoScale && el !== window) {
- // Adjust for scale()
- //@ts-ignore
- let elMatrix = matrix(container || el),
- scaleX = elMatrix && elMatrix.a,
- scaleY = elMatrix && elMatrix.d;
-
- if (elMatrix) {
- top /= scaleY;
- left /= scaleX;
-
- width /= scaleX;
- height /= scaleY;
-
- bottom = top + height;
- right = left + width;
- }
- }
-
- return {
- top: top,
- left: left,
- bottom: bottom,
- right: right,
- width: width,
- height: height
- };
+function getRect(
+ el,
+ relativeToContainingBlock,
+ relativeToNonStaticParent,
+ undoScale,
+ container
+) {
+ if (!el.getBoundingClientRect && el !== window) return;
+
+ let elRect, top, left, bottom, right, height, width;
+
+ if (el !== window && el !== getWindowScrollingElement()) {
+ elRect = el.getBoundingClientRect();
+ top = elRect.top;
+ left = elRect.left;
+ bottom = elRect.bottom;
+ right = elRect.right;
+ height = elRect.height;
+ width = elRect.width;
+ } else {
+ top = 0;
+ left = 0;
+ bottom = window.innerHeight;
+ right = window.innerWidth;
+ height = window.innerHeight;
+ width = window.innerWidth;
+ }
+
+ if (
+ (relativeToContainingBlock || relativeToNonStaticParent) &&
+ el !== window
+ ) {
+ // Adjust for translate()
+ container = container || el.parentNode;
+
+ // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)
+ // Not needed on <= IE11
+ if (!IE11OrLess) {
+ do {
+ if (
+ container &&
+ container.getBoundingClientRect &&
+ //@ts-ignore
+ (css(container, "transform") !== "none" ||
+ (relativeToNonStaticParent &&
+ //@ts-ignore
+ css(container, "position") !== "static"))
+ ) {
+ let containerRect = container.getBoundingClientRect();
+
+ // Set relative to edges of padding box of container
+ //@ts-ignore
+ top -=
+ containerRect.top + parseInt(css(container, "border-top-width"));
+ //@ts-ignore
+ left -=
+ containerRect.left + parseInt(css(container, "border-left-width"));
+ bottom = top + elRect.height;
+ right = left + elRect.width;
+
+ break;
+ }
+ /* jshint boss:true */
+ } while ((container = container.parentNode));
+ }
+ }
+
+ if (undoScale && el !== window) {
+ // Adjust for scale()
+ //@ts-ignore
+ let elMatrix = matrix(container || el),
+ scaleX = elMatrix && elMatrix.a,
+ scaleY = elMatrix && elMatrix.d;
+
+ if (elMatrix) {
+ top /= scaleY;
+ left /= scaleX;
+
+ width /= scaleX;
+ height /= scaleY;
+
+ bottom = top + height;
+ right = left + width;
+ }
+ }
+
+ return {
+ top: top,
+ left: left,
+ bottom: bottom,
+ right: right,
+ width: width,
+ height: height,
+ };
}
/**
@@ -286,34 +298,32 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS
* @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element
*/
function isScrolledPast(el, elSide, parentSide) {
- let parent = getParentAutoScrollElement(el, true),
- //@ts-ignore
- elSideVal = getRect(el)[elSide];
-
- /* jshint boss:true */
- while (parent) {
- //@ts-ignore
- let parentSideVal = getRect(parent)[parentSide],
- visible;
-
- if (parentSide === 'top' || parentSide === 'left') {
- visible = elSideVal >= parentSideVal;
- } else {
- visible = elSideVal <= parentSideVal;
- }
+ let parent = getParentAutoScrollElement(el, true),
+ //@ts-ignore
+ elSideVal = getRect(el)[elSide];
+
+ /* jshint boss:true */
+ while (parent) {
+ //@ts-ignore
+ let parentSideVal = getRect(parent)[parentSide],
+ visible;
+
+ if (parentSide === "top" || parentSide === "left") {
+ visible = elSideVal >= parentSideVal;
+ } else {
+ visible = elSideVal <= parentSideVal;
+ }
- if (!visible) return parent;
+ if (!visible) return parent;
- if (parent === getWindowScrollingElement()) break;
+ if (parent === getWindowScrollingElement()) break;
- parent = getParentAutoScrollElement(parent, false);
- }
+ parent = getParentAutoScrollElement(parent, false);
+ }
- return false;
+ return false;
}
-
-
/**
* Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)
* and non-draggable elements
@@ -323,28 +333,28 @@ function isScrolledPast(el, elSide, parentSide) {
* @return {HTMLElement} The child at index childNum, or null if not found
*/
function getChild(el, childNum, options) {
- let currentChild = 0,
- i = 0,
- children = el.children;
-
- while (i < children.length) {
- if (
- children[i].style.display !== 'none' &&
- //@ts-ignore
- children[i] !== Sortable.ghost &&
- //@ts-ignore
- children[i] !== Sortable.dragged &&
- closest(children[i], options.draggable, el, false)
- ) {
- if (currentChild === childNum) {
- return children[i];
- }
- currentChild++;
- }
-
- i++;
- }
- return null;
+ let currentChild = 0,
+ i = 0,
+ children = el.children;
+
+ while (i < children.length) {
+ if (
+ children[i].style.display !== "none" &&
+ //@ts-ignore
+ children[i] !== Sortable.ghost &&
+ //@ts-ignore
+ children[i] !== Sortable.dragged &&
+ closest(children[i], options.draggable, el, false)
+ ) {
+ if (currentChild === childNum) {
+ return children[i];
+ }
+ currentChild++;
+ }
+
+ i++;
+ }
+ return null;
}
/**
@@ -354,24 +364,21 @@ function getChild(el, childNum, options) {
* @return {HTMLElement} The last child, ignoring ghostEl
*/
function lastChild(el, selector) {
- let last = el.lastElementChild;
-
- while (
- last &&
- (
- //@ts-ignore
- last === Sortable.ghost ||
- //@ts-ignore
- css(last, 'display') === 'none' ||
- selector && !matches(last, selector)
- )
- ) {
- last = last.previousElementSibling;
- }
-
- return last || null;
-}
+ let last = el.lastElementChild;
+
+ while (
+ last &&
+ //@ts-ignore
+ (last === Sortable.ghost ||
+ //@ts-ignore
+ css(last, "display") === "none" ||
+ (selector && !matches(last, selector)))
+ ) {
+ last = last.previousElementSibling;
+ }
+ return last || null;
+}
/**
* Returns the index of an element within its parent for a selected set of
@@ -381,21 +388,25 @@ function lastChild(el, selector) {
* @return {number}
*/
function index(el, selector) {
- let index = 0;
+ let index = 0;
- if (!el || !el.parentNode) {
- return -1;
- }
+ if (!el || !el.parentNode) {
+ return -1;
+ }
- /* jshint boss:true */
- while (el = el.previousElementSibling) {
- //@ts-ignore
- if ((el.nodeName.toUpperCase() !== 'TEMPLATE') && el !== Sortable.clone && (!selector || matches(el, selector))) {
- index++;
- }
- }
+ /* jshint boss:true */
+ while ((el = el.previousElementSibling)) {
+ //@ts-ignore
+ if (
+ el.nodeName.toUpperCase() !== "TEMPLATE" &&
+ el !== Sortable.clone &&
+ (!selector || matches(el, selector))
+ ) {
+ index++;
+ }
+ }
- return index;
+ return index;
}
/**
@@ -405,23 +416,23 @@ function index(el, selector) {
* @return {Array} Offsets in the format of [left, top]
*/
function getRelativeScrollOffset(el) {
- let offsetLeft = 0,
- offsetTop = 0,
- winScroller = getWindowScrollingElement();
-
- if (el) {
- do {
- //@ts-ignore
- let elMatrix = matrix(el),
- scaleX = elMatrix.a,
- scaleY = elMatrix.d;
-
- offsetLeft += el.scrollLeft * scaleX;
- offsetTop += el.scrollTop * scaleY;
- } while (el !== winScroller && (el = el.parentNode));
- }
-
- return [offsetLeft, offsetTop];
+ let offsetLeft = 0,
+ offsetTop = 0,
+ winScroller = getWindowScrollingElement();
+
+ if (el) {
+ do {
+ //@ts-ignore
+ let elMatrix = matrix(el),
+ scaleX = elMatrix.a,
+ scaleY = elMatrix.d;
+
+ offsetLeft += el.scrollLeft * scaleX;
+ offsetTop += el.scrollTop * scaleY;
+ } while (el !== winScroller && (el = el.parentNode));
+ }
+
+ return [offsetLeft, offsetTop];
}
/**
@@ -431,446 +442,480 @@ function getRelativeScrollOffset(el) {
* @return {Number} The index of the object in the array, or -1
*/
function indexOfObject(arr, obj) {
- for (let i in arr) {
- if (!arr.hasOwnProperty(i)) continue;
- for (let key in obj) {
- if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);
- }
- }
- return -1;
+ for (let i in arr) {
+ if (!arr.hasOwnProperty(i)) continue;
+ for (let key in obj) {
+ if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);
+ }
+ }
+ return -1;
}
-
function getParentAutoScrollElement(el, includeSelf) {
- // skip to window
- if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();
-
- let elem = el;
- let gotSelf = false;
- do {
- // we don't need to get elem css if it isn't even overflowing in the first place (performance)
- if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {
- //@ts-ignore
- let elemCSS = css(elem);
- if (
- elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') ||
- elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')
- ) {
- if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();
-
- if (gotSelf || includeSelf) return elem;
- gotSelf = true;
- }
- }
- /* jshint boss:true */
- } while (elem = elem.parentNode);
-
- return getWindowScrollingElement();
+ // skip to window
+ if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();
+
+ let elem = el;
+ let gotSelf = false;
+ do {
+ // we don't need to get elem css if it isn't even overflowing in the first place (performance)
+ if (
+ elem.clientWidth < elem.scrollWidth ||
+ elem.clientHeight < elem.scrollHeight
+ ) {
+ //@ts-ignore
+ let elemCSS = css(elem);
+ if (
+ (elem.clientWidth < elem.scrollWidth &&
+ (elemCSS.overflowX == "auto" || elemCSS.overflowX == "scroll")) ||
+ (elem.clientHeight < elem.scrollHeight &&
+ (elemCSS.overflowY == "auto" || elemCSS.overflowY == "scroll"))
+ ) {
+ if (!elem.getBoundingClientRect || elem === document.body)
+ return getWindowScrollingElement();
+
+ if (gotSelf || includeSelf) return elem;
+ gotSelf = true;
+ }
+ }
+ /* jshint boss:true */
+ } while ((elem = elem.parentNode));
+
+ return getWindowScrollingElement();
}
function extend(dst, src) {
- if (dst && src) {
- for (let key in src) {
- if (src.hasOwnProperty(key)) {
- dst[key] = src[key];
- }
- }
- }
-
- return dst;
-}
+ if (dst && src) {
+ for (let key in src) {
+ if (src.hasOwnProperty(key)) {
+ dst[key] = src[key];
+ }
+ }
+ }
+ return dst;
+}
function isRectEqual(rect1, rect2) {
- return Math.round(rect1.top) === Math.round(rect2.top) &&
- Math.round(rect1.left) === Math.round(rect2.left) &&
- Math.round(rect1.height) === Math.round(rect2.height) &&
- Math.round(rect1.width) === Math.round(rect2.width);
+ return (
+ Math.round(rect1.top) === Math.round(rect2.top) &&
+ Math.round(rect1.left) === Math.round(rect2.left) &&
+ Math.round(rect1.height) === Math.round(rect2.height) &&
+ Math.round(rect1.width) === Math.round(rect2.width)
+ );
}
-
let _throttleTimeout;
function throttle(callback, ms) {
- return function () {
- if (!_throttleTimeout) {
- let args = arguments,
- _this = this;
-
- if (args.length === 1) {
- callback.call(_this, args[0]);
- } else {
- callback.apply(_this, args);
- }
-
- _throttleTimeout = setTimeout(function () {
- _throttleTimeout = void 0;
- }, ms);
- }
- };
-}
+ return function () {
+ if (!_throttleTimeout) {
+ let args = arguments,
+ _this = this;
+ if (args.length === 1) {
+ callback.call(_this, args[0]);
+ } else {
+ callback.apply(_this, args);
+ }
-function cancelThrottle() {
- clearTimeout(_throttleTimeout);
- _throttleTimeout = void 0;
+ _throttleTimeout = setTimeout(function () {
+ _throttleTimeout = void 0;
+ }, ms);
+ }
+ };
}
+function cancelThrottle() {
+ clearTimeout(_throttleTimeout);
+ _throttleTimeout = void 0;
+}
function scrollBy(el, x, y) {
- el.scrollLeft += x;
- el.scrollTop += y;
+ el.scrollLeft += x;
+ el.scrollTop += y;
}
-
function clone(el) {
- //@ts-ignore
- let Polymer = window.Polymer;
- //@ts-ignore
- let $ = window.jQuery || window.Zepto;
-
- if (Polymer && Polymer.dom) {
- return Polymer.dom(el).cloneNode(true);
- }
- else if ($) {
- return $(el).clone(true)[0];
- }
- else {
- return el.cloneNode(true);
- }
+ //@ts-ignore
+ let Polymer = window.Polymer;
+ //@ts-ignore
+ let $ = window.jQuery || window.Zepto;
+
+ if (Polymer && Polymer.dom) {
+ return Polymer.dom(el).cloneNode(true);
+ } else if ($) {
+ return $(el).clone(true)[0];
+ } else {
+ return el.cloneNode(true);
+ }
}
-
function setRect(el, rect) {
- css(el, 'position', 'absolute');
- css(el, 'top', rect.top);
- css(el, 'left', rect.left);
- css(el, 'width', rect.width);
- css(el, 'height', rect.height);
+ css(el, "position", "absolute");
+ css(el, "top", rect.top);
+ css(el, "left", rect.left);
+ css(el, "width", rect.width);
+ css(el, "height", rect.height);
}
function unsetRect(el) {
- css(el, 'position', '');
- css(el, 'top', '');
- css(el, 'left', '');
- css(el, 'width', '');
- css(el, 'height', '');
+ css(el, "position", "");
+ css(el, "top", "");
+ css(el, "left", "");
+ css(el, "width", "");
+ css(el, "height", "");
}
-
-const expando = 'Sortable' + (new Date).getTime();
+const expando = "Sortable" + new Date().getTime();
function AnimationStateManager() {
- let animationStates = [],
- animationCallbackId;
-
- return {
- captureAnimationState() {
- animationStates = [];
- if (!this.options.animation) return;
- let children = [].slice.call(this.el.children);
-
- children.forEach(child => {
- if (css(child, 'display') === 'none' || child === Sortable.ghost) return;
- animationStates.push({
- target: child,
- rect: getRect(child)
- });
- let fromRect = { ...animationStates[animationStates.length - 1].rect };
-
- // If animating: compensate for current animation
- if (child.thisAnimationDuration) {
- let childMatrix = matrix(child, true);
- if (childMatrix) {
- fromRect.top -= childMatrix.f;
- fromRect.left -= childMatrix.e;
- }
- }
-
- child.fromRect = fromRect;
- });
- },
-
- addAnimationState(state) {
- animationStates.push(state);
- },
-
- removeAnimationState(target) {
- animationStates.splice(indexOfObject(animationStates, { target }), 1);
- },
-
- animateAll(callback) {
- if (!this.options.animation) {
- clearTimeout(animationCallbackId);
- if (typeof(callback) === 'function') callback();
- return;
- }
-
- let animating = false,
- animationTime = 0;
-
- animationStates.forEach((state) => {
- let time = 0,
- target = state.target,
- fromRect = target.fromRect,
- toRect = getRect(target),
- prevFromRect = target.prevFromRect,
- prevToRect = target.prevToRect,
- animatingRect = state.rect,
- targetMatrix = matrix(target, true);
-
-
- if (targetMatrix) {
- // Compensate for current animation
- toRect.top -= targetMatrix.f;
- toRect.left -= targetMatrix.e;
- }
-
- target.toRect = toRect;
-
- if (target.thisAnimationDuration) {
- // Could also check if animatingRect is between fromRect and toRect
- if (
- isRectEqual(prevFromRect, toRect) &&
- !isRectEqual(fromRect, toRect) &&
- // Make sure animatingRect is on line between toRect & fromRect
- (animatingRect.top - toRect.top) /
- (animatingRect.left - toRect.left) ===
- (fromRect.top - toRect.top) /
- (fromRect.left - toRect.left)
- ) {
- // If returning to same place as started from animation and on same axis
- time = calculateRealTime(animatingRect, prevFromRect, prevToRect, this.options);
- }
- }
-
- // if fromRect != toRect: animate
- if (!isRectEqual(toRect, fromRect)) {
- target.prevFromRect = fromRect;
- target.prevToRect = toRect;
-
- if (!time) {
- time = this.options.animation;
- }
- this.animate(
- target,
- animatingRect,
- toRect,
- time
- );
- }
-
- if (time) {
- animating = true;
- animationTime = Math.max(animationTime, time);
- clearTimeout(target.animationResetTimer);
- target.animationResetTimer = setTimeout(function() {
- target.animationTime = 0;
- target.prevFromRect = null;
- target.fromRect = null;
- target.prevToRect = null;
- target.thisAnimationDuration = null;
- }, time);
- target.thisAnimationDuration = time;
- }
- });
-
-
- clearTimeout(animationCallbackId);
- if (!animating) {
- if (typeof(callback) === 'function') callback();
- } else {
- animationCallbackId = setTimeout(function() {
- if (typeof(callback) === 'function') callback();
- }, animationTime);
- }
- animationStates = [];
- },
-
- animate(target, currentRect, toRect, duration) {
- if (duration) {
- css(target, 'transition', '');
- css(target, 'transform', '');
- let elMatrix = matrix(this.el),
- scaleX = elMatrix && elMatrix.a,
- scaleY = elMatrix && elMatrix.d,
- translateX = (currentRect.left - toRect.left) / (scaleX || 1),
- translateY = (currentRect.top - toRect.top) / (scaleY || 1);
-
- target.animatingX = !!translateX;
- target.animatingY = !!translateY;
-
- css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');
-
- this.forRepaintDummy = repaint(target); // repaint
-
- css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));
- css(target, 'transform', 'translate3d(0,0,0)');
- (typeof target.animated === 'number') && clearTimeout(target.animated);
- target.animated = setTimeout(function () {
- css(target, 'transition', '');
- css(target, 'transform', '');
- target.animated = false;
-
- target.animatingX = false;
- target.animatingY = false;
- }, duration);
- }
- }
- };
+ let animationStates = [],
+ animationCallbackId;
+
+ return {
+ captureAnimationState() {
+ animationStates = [];
+ if (!this.options.animation) return;
+ let children = [].slice.call(this.el.children);
+
+ children.forEach((child) => {
+ if (css(child, "display") === "none" || child === Sortable.ghost)
+ return;
+ animationStates.push({
+ target: child,
+ rect: getRect(child),
+ });
+ let fromRect = { ...animationStates[animationStates.length - 1].rect };
+
+ // If animating: compensate for current animation
+ if (child.thisAnimationDuration) {
+ let childMatrix = matrix(child, true);
+ if (childMatrix) {
+ fromRect.top -= childMatrix.f;
+ fromRect.left -= childMatrix.e;
+ }
+ }
+
+ child.fromRect = fromRect;
+ });
+ },
+
+ addAnimationState(state) {
+ animationStates.push(state);
+ },
+
+ removeAnimationState(target) {
+ animationStates.splice(indexOfObject(animationStates, { target }), 1);
+ },
+
+ animateAll(callback) {
+ if (!this.options.animation) {
+ clearTimeout(animationCallbackId);
+ if (typeof callback === "function") callback();
+ return;
+ }
+
+ let animating = false,
+ animationTime = 0;
+
+ animationStates.forEach((state) => {
+ let time = 0,
+ target = state.target,
+ fromRect = target.fromRect,
+ toRect = getRect(target),
+ prevFromRect = target.prevFromRect,
+ prevToRect = target.prevToRect,
+ animatingRect = state.rect,
+ targetMatrix = matrix(target, true);
+
+ if (targetMatrix) {
+ // Compensate for current animation
+ toRect.top -= targetMatrix.f;
+ toRect.left -= targetMatrix.e;
+ }
+
+ target.toRect = toRect;
+
+ if (target.thisAnimationDuration) {
+ // Could also check if animatingRect is between fromRect and toRect
+ if (
+ isRectEqual(prevFromRect, toRect) &&
+ !isRectEqual(fromRect, toRect) &&
+ // Make sure animatingRect is on line between toRect & fromRect
+ (animatingRect.top - toRect.top) /
+ (animatingRect.left - toRect.left) ===
+ (fromRect.top - toRect.top) / (fromRect.left - toRect.left)
+ ) {
+ // If returning to same place as started from animation and on same axis
+ time = calculateRealTime(
+ animatingRect,
+ prevFromRect,
+ prevToRect,
+ this.options
+ );
+ }
+ }
+
+ // if fromRect != toRect: animate
+ if (!isRectEqual(toRect, fromRect)) {
+ target.prevFromRect = fromRect;
+ target.prevToRect = toRect;
+
+ if (!time) {
+ time = this.options.animation;
+ }
+ this.animate(target, animatingRect, toRect, time);
+ }
+
+ if (time) {
+ animating = true;
+ animationTime = Math.max(animationTime, time);
+ clearTimeout(target.animationResetTimer);
+ target.animationResetTimer = setTimeout(function () {
+ target.animationTime = 0;
+ target.prevFromRect = null;
+ target.fromRect = null;
+ target.prevToRect = null;
+ target.thisAnimationDuration = null;
+ }, time);
+ target.thisAnimationDuration = time;
+ }
+ });
+
+ clearTimeout(animationCallbackId);
+ if (!animating) {
+ if (typeof callback === "function") callback();
+ } else {
+ animationCallbackId = setTimeout(function () {
+ if (typeof callback === "function") callback();
+ }, animationTime);
+ }
+ animationStates = [];
+ },
+
+ animate(target, currentRect, toRect, duration) {
+ if (duration) {
+ css(target, "transition", "");
+ css(target, "transform", "");
+ let elMatrix = matrix(this.el),
+ scaleX = elMatrix && elMatrix.a,
+ scaleY = elMatrix && elMatrix.d,
+ translateX = (currentRect.left - toRect.left) / (scaleX || 1),
+ translateY = (currentRect.top - toRect.top) / (scaleY || 1);
+
+ target.animatingX = !!translateX;
+ target.animatingY = !!translateY;
+
+ css(
+ target,
+ "transform",
+ "translate3d(" + translateX + "px," + translateY + "px,0)"
+ );
+
+ this.forRepaintDummy = repaint(target); // repaint
+
+ css(
+ target,
+ "transition",
+ "transform " +
+ duration +
+ "ms" +
+ (this.options.easing ? " " + this.options.easing : "")
+ );
+ css(target, "transform", "translate3d(0,0,0)");
+ typeof target.animated === "number" && clearTimeout(target.animated);
+ target.animated = setTimeout(function () {
+ css(target, "transition", "");
+ css(target, "transform", "");
+ target.animated = false;
+
+ target.animatingX = false;
+ target.animatingY = false;
+ }, duration);
+ }
+ },
+ };
}
function repaint(target) {
- return target.offsetWidth;
+ return target.offsetWidth;
}
-
function calculateRealTime(animatingRect, fromRect, toRect, options) {
- return (
- Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) /
- Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2))
- ) * options.animation;
+ return (
+ (Math.sqrt(
+ Math.pow(fromRect.top - animatingRect.top, 2) +
+ Math.pow(fromRect.left - animatingRect.left, 2)
+ ) /
+ Math.sqrt(
+ Math.pow(fromRect.top - toRect.top, 2) +
+ Math.pow(fromRect.left - toRect.left, 2)
+ )) *
+ options.animation
+ );
}
let plugins = [];
const defaults = {
- initializeByDefault: true
+ initializeByDefault: true,
};
var PluginManager = {
- mount(plugin) {
- // Set default static properties
- for (let option in defaults) {
- if (defaults.hasOwnProperty(option) && !(option in plugin)) {
- plugin[option] = defaults[option];
- }
- }
- plugins.push(plugin);
- },
- pluginEvent(eventName, sortable, evt) {
- this.eventCanceled = false;
- evt.cancel = () => {
- this.eventCanceled = true;
- };
- const eventNameGlobal = eventName + 'Global';
- plugins.forEach(plugin => {
- if (!sortable[plugin.pluginName]) return;
- // Fire global events if it exists in this sortable
- if (
- sortable[plugin.pluginName][eventNameGlobal]
- ) {
- sortable[plugin.pluginName][eventNameGlobal]({ sortable, ...evt });
- }
-
- // Only fire plugin event if plugin is enabled in this sortable,
- // and plugin has event defined
- if (
- sortable.options[plugin.pluginName] &&
- sortable[plugin.pluginName][eventName]
- ) {
- sortable[plugin.pluginName][eventName]({ sortable, ...evt });
- }
- });
- },
- initializePlugins(sortable, el, defaults, options) {
- plugins.forEach(plugin => {
- const pluginName = plugin.pluginName;
- if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;
-
- let initialized = new plugin(sortable, el, sortable.options);
- initialized.sortable = sortable;
- initialized.options = sortable.options;
- sortable[pluginName] = initialized;
-
- // Add default options from plugin
- Object.assign(defaults, initialized.defaults);
- });
-
- for (let option in sortable.options) {
- if (!sortable.options.hasOwnProperty(option)) continue;
- let modified = this.modifyOption(sortable, option, sortable.options[option]);
- if (typeof(modified) !== 'undefined') {
- sortable.options[option] = modified;
- }
- }
- },
- getEventProperties(name, sortable) {
- let eventProperties = {};
- plugins.forEach(plugin => {
- if (typeof(plugin.eventProperties) !== 'function') return;
- Object.assign(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));
- });
-
- return eventProperties;
- },
- modifyOption(sortable, name, value) {
- let modifiedValue;
- plugins.forEach(plugin => {
- // Plugin must exist on the Sortable
- if (!sortable[plugin.pluginName]) return;
-
- // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin
- if (plugin.optionListeners && typeof(plugin.optionListeners[name]) === 'function') {
- modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);
- }
- });
-
- return modifiedValue;
- }
+ mount(plugin) {
+ // Set default static properties
+ for (let option in defaults) {
+ if (defaults.hasOwnProperty(option) && !(option in plugin)) {
+ plugin[option] = defaults[option];
+ }
+ }
+ plugins.push(plugin);
+ },
+ pluginEvent(eventName, sortable, evt) {
+ this.eventCanceled = false;
+ evt.cancel = () => {
+ this.eventCanceled = true;
+ };
+ const eventNameGlobal = eventName + "Global";
+ plugins.forEach((plugin) => {
+ if (!sortable[plugin.pluginName]) return;
+ // Fire global events if it exists in this sortable
+ if (sortable[plugin.pluginName][eventNameGlobal]) {
+ sortable[plugin.pluginName][eventNameGlobal]({ sortable, ...evt });
+ }
+
+ // Only fire plugin event if plugin is enabled in this sortable,
+ // and plugin has event defined
+ if (
+ sortable.options[plugin.pluginName] &&
+ sortable[plugin.pluginName][eventName]
+ ) {
+ sortable[plugin.pluginName][eventName]({ sortable, ...evt });
+ }
+ });
+ },
+ initializePlugins(sortable, el, defaults, options) {
+ plugins.forEach((plugin) => {
+ const pluginName = plugin.pluginName;
+ if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;
+
+ let initialized = new plugin(sortable, el, sortable.options);
+ initialized.sortable = sortable;
+ initialized.options = sortable.options;
+ sortable[pluginName] = initialized;
+
+ // Add default options from plugin
+ Object.assign(defaults, initialized.defaults);
+ });
+
+ for (let option in sortable.options) {
+ if (!sortable.options.hasOwnProperty(option)) continue;
+ let modified = this.modifyOption(
+ sortable,
+ option,
+ sortable.options[option]
+ );
+ if (typeof modified !== "undefined") {
+ sortable.options[option] = modified;
+ }
+ }
+ },
+ getEventProperties(name, sortable) {
+ let eventProperties = {};
+ plugins.forEach((plugin) => {
+ if (typeof plugin.eventProperties !== "function") return;
+ Object.assign(
+ eventProperties,
+ plugin.eventProperties.call(sortable[plugin.pluginName], name)
+ );
+ });
+
+ return eventProperties;
+ },
+ modifyOption(sortable, name, value) {
+ let modifiedValue;
+ plugins.forEach((plugin) => {
+ // Plugin must exist on the Sortable
+ if (!sortable[plugin.pluginName]) return;
+
+ // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin
+ if (
+ plugin.optionListeners &&
+ typeof plugin.optionListeners[name] === "function"
+ ) {
+ modifiedValue = plugin.optionListeners[name].call(
+ sortable[plugin.pluginName],
+ value
+ );
+ }
+ });
+
+ return modifiedValue;
+ },
};
-function dispatchEvent(
- {
- sortable, rootEl, name,
- targetEl, cloneEl, toEl, fromEl,
- oldIndex, newIndex,
- oldDraggableIndex, newDraggableIndex,
- originalEvent, putSortable, extraEventProperties
- }
-) {
- sortable = (sortable || (rootEl && rootEl[expando]));
- if (!sortable) return;
-
- let evt,
- options = sortable.options,
- onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);
- // Support for new CustomEvent feature
- if (window.CustomEvent && !IE11OrLess && !Edge) {
- evt = new CustomEvent(name, {
- bubbles: true,
- cancelable: true
- });
- } else {
- evt = document.createEvent('Event');
- evt.initEvent(name, true, true);
- }
-
- evt.to = toEl || rootEl;
- evt.from = fromEl || rootEl;
- evt.item = targetEl || rootEl;
- evt.clone = cloneEl;
-
- evt.oldIndex = oldIndex;
- evt.newIndex = newIndex;
-
- evt.oldDraggableIndex = oldDraggableIndex;
- evt.newDraggableIndex = newDraggableIndex;
-
- evt.originalEvent = originalEvent;
- evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
-
- let allEventProperties = { ...extraEventProperties, ...PluginManager.getEventProperties(name, sortable) };
- for (let option in allEventProperties) {
- evt[option] = allEventProperties[option];
- }
-
- if (rootEl) {
- rootEl.dispatchEvent(evt);
- }
-
- if (options[onName]) {
- options[onName].call(sortable, evt);
- }
+function dispatchEvent({
+ sortable,
+ rootEl,
+ name,
+ targetEl,
+ cloneEl,
+ toEl,
+ fromEl,
+ oldIndex,
+ newIndex,
+ oldDraggableIndex,
+ newDraggableIndex,
+ originalEvent,
+ putSortable,
+ extraEventProperties,
+}) {
+ sortable = sortable || (rootEl && rootEl[expando]);
+ if (!sortable) return;
+
+ let evt,
+ options = sortable.options,
+ onName = "on" + name.charAt(0).toUpperCase() + name.substr(1);
+ // Support for new CustomEvent feature
+ if (window.CustomEvent && !IE11OrLess && !Edge) {
+ evt = new CustomEvent(name, {
+ bubbles: true,
+ cancelable: true,
+ });
+ } else {
+ evt = document.createEvent("Event");
+ evt.initEvent(name, true, true);
+ }
+
+ evt.to = toEl || rootEl;
+ evt.from = fromEl || rootEl;
+ evt.item = targetEl || rootEl;
+ evt.clone = cloneEl;
+
+ evt.oldIndex = oldIndex;
+ evt.newIndex = newIndex;
+
+ evt.oldDraggableIndex = oldDraggableIndex;
+ evt.newDraggableIndex = newDraggableIndex;
+
+ evt.originalEvent = originalEvent;
+ evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
+
+ let allEventProperties = {
+ ...extraEventProperties,
+ ...PluginManager.getEventProperties(name, sortable),
+ };
+ for (let option in allEventProperties) {
+ evt[option] = allEventProperties[option];
+ }
+
+ if (rootEl) {
+ rootEl.dispatchEvent(evt);
+ }
+
+ if (options[onName]) {
+ options[onName].call(sortable, evt);
+ }
}
/**!
@@ -1204,6 +1249,14 @@ function Sortable(el, options) {
)}`;
}
+ const __warn =
+ "" +
+ "Importing Sortable directly from GitHub is deprecated.\n" +
+ "This file will not receive any more updates.\n" +
+ "Please follow the usage instructions to continue getting support: https://github.com/SortableJS/Sortable";
+
+ console.warn(__warn);
+
this.el = el; // root element
this.options = options = Object.assign({}, options);
@@ -2924,984 +2977,1090 @@ Sortable.create = function (el, options) {
Sortable.version = version;
let autoScrolls = [],
- scrollEl,
- scrollRootEl,
- scrolling = false,
- lastAutoScrollX,
- lastAutoScrollY,
- touchEvt$1,
- pointerElemChangedInterval;
+ scrollEl,
+ scrollRootEl,
+ scrolling = false,
+ lastAutoScrollX,
+ lastAutoScrollY,
+ touchEvt$1,
+ pointerElemChangedInterval;
function AutoScrollPlugin() {
+ function AutoScroll() {
+ this.defaults = {
+ scroll: true,
+ scrollSensitivity: 30,
+ scrollSpeed: 10,
+ bubbleScroll: true,
+ };
+
+ // Bind all private methods
+ for (let fn in this) {
+ if (fn.charAt(0) === "_" && typeof this[fn] === "function") {
+ this[fn] = this[fn].bind(this);
+ }
+ }
+ }
- function AutoScroll() {
- this.defaults = {
- scroll: true,
- scrollSensitivity: 30,
- scrollSpeed: 10,
- bubbleScroll: true
- };
-
- // Bind all private methods
- for (let fn in this) {
- if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
- this[fn] = this[fn].bind(this);
- }
- }
- }
-
- AutoScroll.prototype = {
- dragStarted({ originalEvent }) {
- if (this.sortable.nativeDraggable) {
- on(document, 'dragover', this._handleAutoScroll);
- } else {
- if (this.options.supportPointer) {
- on(document, 'pointermove', this._handleFallbackAutoScroll);
- } else if (originalEvent.touches) {
- on(document, 'touchmove', this._handleFallbackAutoScroll);
- } else {
- on(document, 'mousemove', this._handleFallbackAutoScroll);
- }
- }
- },
-
- dragOverCompleted({ originalEvent }) {
- // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)
- if (!this.options.dragOverBubble && !originalEvent.rootEl) {
- this._handleAutoScroll(originalEvent);
- }
- },
-
- drop() {
- if (this.sortable.nativeDraggable) {
- off(document, 'dragover', this._handleAutoScroll);
- } else {
- off(document, 'pointermove', this._handleFallbackAutoScroll);
- off(document, 'touchmove', this._handleFallbackAutoScroll);
- off(document, 'mousemove', this._handleFallbackAutoScroll);
- }
-
- clearPointerElemChangedInterval();
- clearAutoScrolls();
- cancelThrottle();
- },
-
- nulling() {
- touchEvt$1 =
- scrollRootEl =
- scrollEl =
- scrolling =
- pointerElemChangedInterval =
- lastAutoScrollX =
- lastAutoScrollY = null;
-
- autoScrolls.length = 0;
- },
-
- _handleFallbackAutoScroll(evt) {
- this._handleAutoScroll(evt, true);
- },
-
- _handleAutoScroll(evt, fallback) {
- const x = (evt.touches ? evt.touches[0] : evt).clientX,
- y = (evt.touches ? evt.touches[0] : evt).clientY,
-
- elem = document.elementFromPoint(x, y);
-
- touchEvt$1 = evt;
-
- // IE does not seem to have native autoscroll,
- // Edge's autoscroll seems too conditional,
- // MACOS Safari does not have autoscroll,
- // Firefox and Chrome are good
- if (fallback || Edge || IE11OrLess || Safari) {
- autoScroll(evt, this.options, elem, fallback);
-
- // Listener for pointer element change
- let ogElemScroller = getParentAutoScrollElement(elem, true);
- if (
- scrolling &&
- (
- !pointerElemChangedInterval ||
- x !== lastAutoScrollX ||
- y !== lastAutoScrollY
- )
- ) {
- pointerElemChangedInterval && clearPointerElemChangedInterval();
- // Detect for pointer elem change, emulating native DnD behaviour
- pointerElemChangedInterval = setInterval(() => {
- let newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);
- if (newElem !== ogElemScroller) {
- ogElemScroller = newElem;
- clearAutoScrolls();
- }
- autoScroll(evt, this.options, newElem, fallback);
- }, 10);
- lastAutoScrollX = x;
- lastAutoScrollY = y;
- }
- } else {
- // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll
- if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {
- clearAutoScrolls();
- return;
- }
- autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);
- }
- }
- };
-
- return Object.assign(AutoScroll, {
- pluginName: 'scroll',
- initializeByDefault: true
- });
-}
+ AutoScroll.prototype = {
+ dragStarted({ originalEvent }) {
+ if (this.sortable.nativeDraggable) {
+ on(document, "dragover", this._handleAutoScroll);
+ } else {
+ if (this.options.supportPointer) {
+ on(document, "pointermove", this._handleFallbackAutoScroll);
+ } else if (originalEvent.touches) {
+ on(document, "touchmove", this._handleFallbackAutoScroll);
+ } else {
+ on(document, "mousemove", this._handleFallbackAutoScroll);
+ }
+ }
+ },
-function clearAutoScrolls() {
- autoScrolls.forEach(function(autoScroll) {
- clearInterval(autoScroll.pid);
- });
- autoScrolls = [];
-}
+ dragOverCompleted({ originalEvent }) {
+ // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)
+ if (!this.options.dragOverBubble && !originalEvent.rootEl) {
+ this._handleAutoScroll(originalEvent);
+ }
+ },
-function clearPointerElemChangedInterval() {
- clearInterval(pointerElemChangedInterval);
-}
+ drop() {
+ if (this.sortable.nativeDraggable) {
+ off(document, "dragover", this._handleAutoScroll);
+ } else {
+ off(document, "pointermove", this._handleFallbackAutoScroll);
+ off(document, "touchmove", this._handleFallbackAutoScroll);
+ off(document, "mousemove", this._handleFallbackAutoScroll);
+ }
+ clearPointerElemChangedInterval();
+ clearAutoScrolls();
+ cancelThrottle();
+ },
-const autoScroll = throttle(function(evt, options, rootEl, isFallback) {
- // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
- if (!options.scroll) return;
- const x = (evt.touches ? evt.touches[0] : evt).clientX,
- y = (evt.touches ? evt.touches[0] : evt).clientY,
- sens = options.scrollSensitivity,
- speed = options.scrollSpeed,
- winScroller = getWindowScrollingElement();
-
- let scrollThisInstance = false,
- scrollCustomFn;
-
- // New scroll root, set scrollEl
- if (scrollRootEl !== rootEl) {
- scrollRootEl = rootEl;
-
- clearAutoScrolls();
-
- scrollEl = options.scroll;
- scrollCustomFn = options.scrollFn;
-
- if (scrollEl === true) {
- scrollEl = getParentAutoScrollElement(rootEl, true);
- }
- }
-
-
- let layersOut = 0;
- let currentParent = scrollEl;
- do {
- let el = currentParent,
- rect = getRect(el),
-
- top = rect.top,
- bottom = rect.bottom,
- left = rect.left,
- right = rect.right,
-
- width = rect.width,
- height = rect.height,
-
- canScrollX,
- canScrollY,
-
- scrollWidth = el.scrollWidth,
- scrollHeight = el.scrollHeight,
-
- elCSS = css(el),
-
- scrollPosX = el.scrollLeft,
- scrollPosY = el.scrollTop;
-
-
- if (el === winScroller) {
- canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');
- canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');
- } else {
- canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');
- canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');
- }
-
- let vx = canScrollX && (Math.abs(right - x) <= sens && (scrollPosX + width) < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);
- let vy = canScrollY && (Math.abs(bottom - y) <= sens && (scrollPosY + height) < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);
-
-
- if (!autoScrolls[layersOut]) {
- for (let i = 0; i <= layersOut; i++) {
- if (!autoScrolls[i]) {
- autoScrolls[i] = {};
- }
- }
- }
-
- if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {
- autoScrolls[layersOut].el = el;
- autoScrolls[layersOut].vx = vx;
- autoScrolls[layersOut].vy = vy;
-
- clearInterval(autoScrolls[layersOut].pid);
-
- if (vx != 0 || vy != 0) {
- scrollThisInstance = true;
- /* jshint loopfunc:true */
- autoScrolls[layersOut].pid = setInterval((function () {
- // emulate drag over during autoscroll (fallback), emulating native DnD behaviour
- if (isFallback && this.layer === 0) {
- Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely
- }
- let scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;
- let scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;
-
- if (typeof(scrollCustomFn) === 'function') {
- if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {
- return;
- }
- }
-
- scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);
- }).bind({layer: layersOut}), 24);
- }
- }
- layersOut++;
- } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));
- scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not
-}, 30);
+ nulling() {
+ touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;
-const drop = function({
- originalEvent,
- putSortable,
- dragEl,
- activeSortable,
- dispatchSortableEvent,
- hideGhostForTarget,
- unhideGhostForTarget
-}) {
- if (!originalEvent) return;
- let toSortable = putSortable || activeSortable;
- hideGhostForTarget();
- let touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;
- let target = document.elementFromPoint(touch.clientX, touch.clientY);
- unhideGhostForTarget();
- if (toSortable && !toSortable.el.contains(target)) {
- dispatchSortableEvent('spill');
- this.onSpill({ dragEl, putSortable });
- }
-};
+ autoScrolls.length = 0;
+ },
-function Revert() {}
+ _handleFallbackAutoScroll(evt) {
+ this._handleAutoScroll(evt, true);
+ },
+
+ _handleAutoScroll(evt, fallback) {
+ const x = (evt.touches ? evt.touches[0] : evt).clientX,
+ y = (evt.touches ? evt.touches[0] : evt).clientY,
+ elem = document.elementFromPoint(x, y);
+
+ touchEvt$1 = evt;
+
+ // IE does not seem to have native autoscroll,
+ // Edge's autoscroll seems too conditional,
+ // MACOS Safari does not have autoscroll,
+ // Firefox and Chrome are good
+ if (fallback || Edge || IE11OrLess || Safari) {
+ autoScroll(evt, this.options, elem, fallback);
+
+ // Listener for pointer element change
+ let ogElemScroller = getParentAutoScrollElement(elem, true);
+ if (
+ scrolling &&
+ (!pointerElemChangedInterval ||
+ x !== lastAutoScrollX ||
+ y !== lastAutoScrollY)
+ ) {
+ pointerElemChangedInterval && clearPointerElemChangedInterval();
+ // Detect for pointer elem change, emulating native DnD behaviour
+ pointerElemChangedInterval = setInterval(() => {
+ let newElem = getParentAutoScrollElement(
+ document.elementFromPoint(x, y),
+ true
+ );
+ if (newElem !== ogElemScroller) {
+ ogElemScroller = newElem;
+ clearAutoScrolls();
+ }
+ autoScroll(evt, this.options, newElem, fallback);
+ }, 10);
+ lastAutoScrollX = x;
+ lastAutoScrollY = y;
+ }
+ } else {
+ // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll
+ if (
+ !this.options.bubbleScroll ||
+ getParentAutoScrollElement(elem, true) === getWindowScrollingElement()
+ ) {
+ clearAutoScrolls();
+ return;
+ }
+ autoScroll(
+ evt,
+ this.options,
+ getParentAutoScrollElement(elem, false),
+ false
+ );
+ }
+ },
+ };
+
+ return Object.assign(AutoScroll, {
+ pluginName: "scroll",
+ initializeByDefault: true,
+ });
+}
+
+function clearAutoScrolls() {
+ autoScrolls.forEach(function (autoScroll) {
+ clearInterval(autoScroll.pid);
+ });
+ autoScrolls = [];
+}
+
+function clearPointerElemChangedInterval() {
+ clearInterval(pointerElemChangedInterval);
+}
+
+const autoScroll = throttle(function (evt, options, rootEl, isFallback) {
+ // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
+ if (!options.scroll) return;
+ const x = (evt.touches ? evt.touches[0] : evt).clientX,
+ y = (evt.touches ? evt.touches[0] : evt).clientY,
+ sens = options.scrollSensitivity,
+ speed = options.scrollSpeed,
+ winScroller = getWindowScrollingElement();
+
+ let scrollThisInstance = false,
+ scrollCustomFn;
+
+ // New scroll root, set scrollEl
+ if (scrollRootEl !== rootEl) {
+ scrollRootEl = rootEl;
+
+ clearAutoScrolls();
+
+ scrollEl = options.scroll;
+ scrollCustomFn = options.scrollFn;
+
+ if (scrollEl === true) {
+ scrollEl = getParentAutoScrollElement(rootEl, true);
+ }
+ }
+
+ let layersOut = 0;
+ let currentParent = scrollEl;
+ do {
+ let el = currentParent,
+ rect = getRect(el),
+ top = rect.top,
+ bottom = rect.bottom,
+ left = rect.left,
+ right = rect.right,
+ width = rect.width,
+ height = rect.height,
+ canScrollX,
+ canScrollY,
+ scrollWidth = el.scrollWidth,
+ scrollHeight = el.scrollHeight,
+ elCSS = css(el),
+ scrollPosX = el.scrollLeft,
+ scrollPosY = el.scrollTop;
+
+ if (el === winScroller) {
+ canScrollX =
+ width < scrollWidth &&
+ (elCSS.overflowX === "auto" ||
+ elCSS.overflowX === "scroll" ||
+ elCSS.overflowX === "visible");
+ canScrollY =
+ height < scrollHeight &&
+ (elCSS.overflowY === "auto" ||
+ elCSS.overflowY === "scroll" ||
+ elCSS.overflowY === "visible");
+ } else {
+ canScrollX =
+ width < scrollWidth &&
+ (elCSS.overflowX === "auto" || elCSS.overflowX === "scroll");
+ canScrollY =
+ height < scrollHeight &&
+ (elCSS.overflowY === "auto" || elCSS.overflowY === "scroll");
+ }
+
+ let vx =
+ canScrollX &&
+ (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) -
+ (Math.abs(left - x) <= sens && !!scrollPosX);
+ let vy =
+ canScrollY &&
+ (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) -
+ (Math.abs(top - y) <= sens && !!scrollPosY);
+
+ if (!autoScrolls[layersOut]) {
+ for (let i = 0; i <= layersOut; i++) {
+ if (!autoScrolls[i]) {
+ autoScrolls[i] = {};
+ }
+ }
+ }
+
+ if (
+ autoScrolls[layersOut].vx != vx ||
+ autoScrolls[layersOut].vy != vy ||
+ autoScrolls[layersOut].el !== el
+ ) {
+ autoScrolls[layersOut].el = el;
+ autoScrolls[layersOut].vx = vx;
+ autoScrolls[layersOut].vy = vy;
+
+ clearInterval(autoScrolls[layersOut].pid);
+
+ if (vx != 0 || vy != 0) {
+ scrollThisInstance = true;
+ /* jshint loopfunc:true */
+ autoScrolls[layersOut].pid = setInterval(
+ function () {
+ // emulate drag over during autoscroll (fallback), emulating native DnD behaviour
+ if (isFallback && this.layer === 0) {
+ Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely
+ }
+ let scrollOffsetY = autoScrolls[this.layer].vy
+ ? autoScrolls[this.layer].vy * speed
+ : 0;
+ let scrollOffsetX = autoScrolls[this.layer].vx
+ ? autoScrolls[this.layer].vx * speed
+ : 0;
+
+ if (typeof scrollCustomFn === "function") {
+ if (
+ scrollCustomFn.call(
+ Sortable.dragged.parentNode[expando],
+ scrollOffsetX,
+ scrollOffsetY,
+ evt,
+ touchEvt$1,
+ autoScrolls[this.layer].el
+ ) !== "continue"
+ ) {
+ return;
+ }
+ }
+
+ scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);
+ }.bind({ layer: layersOut }),
+ 24
+ );
+ }
+ }
+ layersOut++;
+ } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));
+ scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not
+}, 30);
+
+const drop = function ({
+ originalEvent,
+ putSortable,
+ dragEl,
+ activeSortable,
+ dispatchSortableEvent,
+ hideGhostForTarget,
+ unhideGhostForTarget,
+}) {
+ if (!originalEvent) return;
+ let toSortable = putSortable || activeSortable;
+ hideGhostForTarget();
+ let touch =
+ originalEvent.changedTouches && originalEvent.changedTouches.length
+ ? originalEvent.changedTouches[0]
+ : originalEvent;
+ let target = document.elementFromPoint(touch.clientX, touch.clientY);
+ unhideGhostForTarget();
+ if (toSortable && !toSortable.el.contains(target)) {
+ dispatchSortableEvent("spill");
+ this.onSpill({ dragEl, putSortable });
+ }
+};
+
+function Revert() {}
Revert.prototype = {
- startIndex: null,
- dragStart({ oldDraggableIndex }) {
- this.startIndex = oldDraggableIndex;
- },
- onSpill({ dragEl, putSortable }) {
- this.sortable.captureAnimationState();
- if (putSortable) {
- putSortable.captureAnimationState();
- }
- let nextSibling = getChild(this.sortable.el, this.startIndex, this.options);
-
- if (nextSibling) {
- this.sortable.el.insertBefore(dragEl, nextSibling);
- } else {
- this.sortable.el.appendChild(dragEl);
- }
- this.sortable.animateAll();
- if (putSortable) {
- putSortable.animateAll();
- }
- },
- drop
+ startIndex: null,
+ dragStart({ oldDraggableIndex }) {
+ this.startIndex = oldDraggableIndex;
+ },
+ onSpill({ dragEl, putSortable }) {
+ this.sortable.captureAnimationState();
+ if (putSortable) {
+ putSortable.captureAnimationState();
+ }
+ let nextSibling = getChild(this.sortable.el, this.startIndex, this.options);
+
+ if (nextSibling) {
+ this.sortable.el.insertBefore(dragEl, nextSibling);
+ } else {
+ this.sortable.el.appendChild(dragEl);
+ }
+ this.sortable.animateAll();
+ if (putSortable) {
+ putSortable.animateAll();
+ }
+ },
+ drop,
};
Object.assign(Revert, {
- pluginName: 'revertOnSpill'
+ pluginName: "revertOnSpill",
});
-
function Remove() {}
Remove.prototype = {
- onSpill({ dragEl, putSortable }) {
- const parentSortable = putSortable || this.sortable;
- parentSortable.captureAnimationState();
- dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);
- parentSortable.animateAll();
- },
- drop
+ onSpill({ dragEl, putSortable }) {
+ const parentSortable = putSortable || this.sortable;
+ parentSortable.captureAnimationState();
+ dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);
+ parentSortable.animateAll();
+ },
+ drop,
};
Object.assign(Remove, {
- pluginName: 'removeOnSpill'
+ pluginName: "removeOnSpill",
});
let lastSwapEl;
-
function SwapPlugin() {
- function Swap() {
- this.defaults = {
- swapClass: 'sortable-swap-highlight'
- };
- }
-
- Swap.prototype = {
- dragStart({ dragEl }) {
- lastSwapEl = dragEl;
- },
- dragOverValid({ completed, target, onMove, activeSortable, changed, cancel }) {
- if (!activeSortable.options.swap) return;
- let el = this.sortable.el,
- options = this.options;
- if (target && target !== el) {
- let prevSwapEl = lastSwapEl;
- if (onMove(target) !== false) {
- toggleClass(target, options.swapClass, true);
- lastSwapEl = target;
- } else {
- lastSwapEl = null;
- }
-
- if (prevSwapEl && prevSwapEl !== lastSwapEl) {
- toggleClass(prevSwapEl, options.swapClass, false);
- }
- }
- changed();
-
- completed(true);
- cancel();
- },
- drop({ activeSortable, putSortable, dragEl }) {
- let toSortable = (putSortable || this.sortable);
- let options = this.options;
- lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);
- if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {
- if (dragEl !== lastSwapEl) {
- toSortable.captureAnimationState();
- if (toSortable !== activeSortable) activeSortable.captureAnimationState();
- swapNodes(dragEl, lastSwapEl);
-
- toSortable.animateAll();
- if (toSortable !== activeSortable) activeSortable.animateAll();
- }
- }
- },
- nulling() {
- lastSwapEl = null;
- }
- };
-
- return Object.assign(Swap, {
- pluginName: 'swap',
- eventProperties() {
- return {
- swapItem: lastSwapEl
- };
- }
- });
-}
+ function Swap() {
+ this.defaults = {
+ swapClass: "sortable-swap-highlight",
+ };
+ }
+
+ Swap.prototype = {
+ dragStart({ dragEl }) {
+ lastSwapEl = dragEl;
+ },
+ dragOverValid({
+ completed,
+ target,
+ onMove,
+ activeSortable,
+ changed,
+ cancel,
+ }) {
+ if (!activeSortable.options.swap) return;
+ let el = this.sortable.el,
+ options = this.options;
+ if (target && target !== el) {
+ let prevSwapEl = lastSwapEl;
+ if (onMove(target) !== false) {
+ toggleClass(target, options.swapClass, true);
+ lastSwapEl = target;
+ } else {
+ lastSwapEl = null;
+ }
+
+ if (prevSwapEl && prevSwapEl !== lastSwapEl) {
+ toggleClass(prevSwapEl, options.swapClass, false);
+ }
+ }
+ changed();
+ completed(true);
+ cancel();
+ },
+ drop({ activeSortable, putSortable, dragEl }) {
+ let toSortable = putSortable || this.sortable;
+ let options = this.options;
+ lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);
+ if (
+ lastSwapEl &&
+ (options.swap || (putSortable && putSortable.options.swap))
+ ) {
+ if (dragEl !== lastSwapEl) {
+ toSortable.captureAnimationState();
+ if (toSortable !== activeSortable)
+ activeSortable.captureAnimationState();
+ swapNodes(dragEl, lastSwapEl);
+
+ toSortable.animateAll();
+ if (toSortable !== activeSortable) activeSortable.animateAll();
+ }
+ }
+ },
+ nulling() {
+ lastSwapEl = null;
+ },
+ };
+
+ return Object.assign(Swap, {
+ pluginName: "swap",
+ eventProperties() {
+ return {
+ swapItem: lastSwapEl,
+ };
+ },
+ });
+}
function swapNodes(n1, n2) {
- let p1 = n1.parentNode,
- p2 = n2.parentNode,
- i1, i2;
+ let p1 = n1.parentNode,
+ p2 = n2.parentNode,
+ i1,
+ i2;
- if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;
+ if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;
- i1 = index(n1);
- i2 = index(n2);
+ i1 = index(n1);
+ i2 = index(n2);
- if (p1.isEqualNode(p2) && i1 < i2) {
- i2++;
- }
- p1.insertBefore(n2, p1.children[i1]);
- p2.insertBefore(n1, p2.children[i2]);
+ if (p1.isEqualNode(p2) && i1 < i2) {
+ i2++;
+ }
+ p1.insertBefore(n2, p1.children[i1]);
+ p2.insertBefore(n1, p2.children[i2]);
}
let multiDragElements = [],
- multiDragClones = [],
- lastMultiDragSelect, // for selection with modifier key down (SHIFT)
- multiDragSortable,
- initialFolding = false, // Initial multi-drag fold when drag started
- folding = false, // Folding any other time
- dragStarted = false,
- dragEl$1,
- clonesFromRect,
- clonesHidden;
+ multiDragClones = [],
+ lastMultiDragSelect, // for selection with modifier key down (SHIFT)
+ multiDragSortable,
+ initialFolding = false, // Initial multi-drag fold when drag started
+ folding = false, // Folding any other time
+ dragStarted = false,
+ dragEl$1,
+ clonesFromRect,
+ clonesHidden;
function MultiDragPlugin() {
- function MultiDrag(sortable) {
- // Bind all private methods
- for (let fn in this) {
- if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
- this[fn] = this[fn].bind(this);
- }
- }
-
- if (sortable.options.supportPointer) {
- on(document, 'pointerup', this._deselectMultiDrag);
- } else {
- on(document, 'mouseup', this._deselectMultiDrag);
- on(document, 'touchend', this._deselectMultiDrag);
- }
-
- on(document, 'keydown', this._checkKeyDown);
- on(document, 'keyup', this._checkKeyUp);
-
- this.defaults = {
- selectedClass: 'sortable-selected',
- multiDragKey: null,
- setData(dataTransfer, dragEl) {
- let data = '';
- if (multiDragElements.length && multiDragSortable === sortable) {
- multiDragElements.forEach((multiDragElement, i) => {
- data += (!i ? '' : ', ') + multiDragElement.textContent;
- });
- } else {
- data = dragEl.textContent;
- }
- dataTransfer.setData('Text', data);
- }
- };
- }
-
- MultiDrag.prototype = {
- multiDragKeyDown: false,
- isMultiDrag: false,
-
-
- delayStartGlobal({ dragEl: dragged }) {
- dragEl$1 = dragged;
- },
-
- delayEnded() {
- this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);
- },
-
- setupClone({ sortable, cancel }) {
- if (!this.isMultiDrag) return;
- for (let i = 0; i < multiDragElements.length; i++) {
- multiDragClones.push(clone(multiDragElements[i]));
-
- multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;
-
- multiDragClones[i].draggable = false;
- multiDragClones[i].style['will-change'] = '';
-
- toggleClass(multiDragClones[i], this.options.selectedClass, false);
- multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);
- }
-
- sortable._hideClone();
- cancel();
- },
-
- clone({ sortable, rootEl, dispatchSortableEvent, cancel }) {
- if (!this.isMultiDrag) return;
- if (!this.options.removeCloneOnHide) {
- if (multiDragElements.length && multiDragSortable === sortable) {
- insertMultiDragClones(true, rootEl);
- dispatchSortableEvent('clone');
-
- cancel();
- }
- }
- },
-
- showClone({ cloneNowShown, rootEl, cancel }) {
- if (!this.isMultiDrag) return;
- insertMultiDragClones(false, rootEl);
- multiDragClones.forEach(clone => {
- css(clone, 'display', '');
- });
-
- cloneNowShown();
- clonesHidden = false;
- cancel();
- },
-
- hideClone({ sortable, cloneNowHidden, cancel }) {
- if (!this.isMultiDrag) return;
- multiDragClones.forEach(clone => {
- css(clone, 'display', 'none');
- if (this.options.removeCloneOnHide && clone.parentNode) {
- clone.parentNode.removeChild(clone);
- }
- });
-
- cloneNowHidden();
- clonesHidden = true;
- cancel();
- },
-
- dragStartGlobal({ sortable }) {
- if (!this.isMultiDrag && multiDragSortable) {
- multiDragSortable.multiDrag._deselectMultiDrag();
- }
-
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.sortableIndex = index(multiDragElement);
- });
-
- // Sort multi-drag elements
- multiDragElements = multiDragElements.sort(function(a, b) {
- return a.sortableIndex - b.sortableIndex;
- });
- dragStarted = true;
- },
-
- dragStarted({ sortable }) {
- if (!this.isMultiDrag) return;
- if (this.options.sort) {
- // Capture rects,
- // hide multi drag elements (by positioning them absolute),
- // set multi drag elements rects to dragRect,
- // show multi drag elements,
- // animate to rects,
- // unset rects & remove from DOM
-
- sortable.captureAnimationState();
-
- if (this.options.animation) {
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- css(multiDragElement, 'position', 'absolute');
- });
-
- let dragRect = getRect(dragEl$1, false, true, true);
-
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- setRect(multiDragElement, dragRect);
- });
-
- folding = true;
- initialFolding = true;
- }
- }
-
- sortable.animateAll(() => {
- folding = false;
- initialFolding = false;
-
- if (this.options.animation) {
- multiDragElements.forEach(multiDragElement => {
- unsetRect(multiDragElement);
- });
- }
-
- // Remove all auxiliary multidrag items from el, if sorting enabled
- if (this.options.sort) {
- removeMultiDragElements();
- }
- });
- },
-
- dragOver({ target, completed, cancel }) {
- if (folding && ~multiDragElements.indexOf(target)) {
- completed(false);
- cancel();
- }
- },
-
- revert({ fromSortable, rootEl, sortable, dragRect }) {
- if (multiDragElements.length > 1) {
- // Setup unfold animation
- multiDragElements.forEach(multiDragElement => {
- sortable.addAnimationState({
- target: multiDragElement,
- rect: folding ? getRect(multiDragElement) : dragRect
- });
-
- unsetRect(multiDragElement);
-
- multiDragElement.fromRect = dragRect;
-
- fromSortable.removeAnimationState(multiDragElement);
- });
- folding = false;
- insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);
- }
- },
-
- dragOverCompleted({ sortable, isOwner, insertion, activeSortable, parentEl, putSortable }) {
- let options = this.options;
- if (insertion) {
- // Clones must be hidden before folding animation to capture dragRectAbsolute properly
- if (isOwner) {
- activeSortable._hideClone();
- }
-
- initialFolding = false;
- // If leaving sort:false root, or already folding - Fold to new location
- if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {
- // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible
- let dragRectAbsolute = getRect(dragEl$1, false, true, true);
-
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- setRect(multiDragElement, dragRectAbsolute);
-
- // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted
- // while folding, and so that we can capture them again because old sortable will no longer be fromSortable
- parentEl.appendChild(multiDragElement);
- });
-
- folding = true;
- }
-
- // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out
- if (!isOwner) {
- // Only remove if not folding (folding will remove them anyways)
- if (!folding) {
- removeMultiDragElements();
- }
-
- if (multiDragElements.length > 1) {
- let clonesHiddenBefore = clonesHidden;
- activeSortable._showClone(sortable);
-
- // Unfold animation for clones if showing from hidden
- if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {
- multiDragClones.forEach(clone => {
- activeSortable.addAnimationState({
- target: clone,
- rect: clonesFromRect
- });
-
- clone.fromRect = clonesFromRect;
- clone.thisAnimationDuration = null;
- });
- }
- } else {
- activeSortable._showClone(sortable);
- }
- }
- }
- },
-
- dragOverAnimationCapture({ dragRect, isOwner, activeSortable }) {
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.thisAnimationDuration = null;
- });
-
- if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {
- clonesFromRect = Object.assign({}, dragRect);
- let dragMatrix = matrix(dragEl$1, true);
- clonesFromRect.top -= dragMatrix.f;
- clonesFromRect.left -= dragMatrix.e;
- }
- },
-
- dragOverAnimationComplete() {
- if (folding) {
- folding = false;
- removeMultiDragElements();
- }
- },
-
- drop({ originalEvent: evt, rootEl, parentEl, sortable, dispatchSortableEvent, oldIndex, putSortable }) {
- let toSortable = (putSortable || this.sortable);
-
- if (!evt) return;
-
- let options = this.options,
- children = parentEl.children;
-
- // Multi-drag selection
- if (!dragStarted) {
- if (options.multiDragKey && !this.multiDragKeyDown) {
- this._deselectMultiDrag();
- }
- toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));
-
- if (!~multiDragElements.indexOf(dragEl$1)) {
- multiDragElements.push(dragEl$1);
- dispatchEvent({
- sortable,
- rootEl,
- name: 'select',
- targetEl: dragEl$1,
- originalEvt: evt
- });
-
- // Modifier activated, select from last to dragEl
- if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {
- let lastIndex = index(lastMultiDragSelect),
- currentIndex = index(dragEl$1);
-
- if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {
- // Must include lastMultiDragSelect (select it), in case modified selection from no selection
- // (but previous selection existed)
- let n, i;
- if (currentIndex > lastIndex) {
- i = lastIndex;
- n = currentIndex;
- } else {
- i = currentIndex;
- n = lastIndex + 1;
- }
-
- for (; i < n; i++) {
- if (~multiDragElements.indexOf(children[i])) continue;
- toggleClass(children[i], options.selectedClass, true);
- multiDragElements.push(children[i]);
-
- dispatchEvent({
- sortable,
- rootEl,
- name: 'select',
- targetEl: children[i],
- originalEvt: evt
- });
- }
- }
- } else {
- lastMultiDragSelect = dragEl$1;
- }
-
- multiDragSortable = toSortable;
- } else {
- multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);
- lastMultiDragSelect = null;
- dispatchEvent({
- sortable,
- rootEl,
- name: 'deselect',
- targetEl: dragEl$1,
- originalEvt: evt
- });
- }
- }
-
- // Multi-drag drop
- if (dragStarted && this.isMultiDrag) {
- // Do not "unfold" after around dragEl if reverted
- if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {
- let dragRect = getRect(dragEl$1),
- multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');
-
- if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;
-
- toSortable.captureAnimationState();
-
- if (!initialFolding) {
- if (options.animation) {
- dragEl$1.fromRect = dragRect;
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.thisAnimationDuration = null;
- if (multiDragElement !== dragEl$1) {
- let rect = folding ? getRect(multiDragElement) : dragRect;
- multiDragElement.fromRect = rect;
-
- // Prepare unfold animation
- toSortable.addAnimationState({
- target: multiDragElement,
- rect: rect
- });
- }
- });
- }
-
- // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert
- // properly they must all be removed
- removeMultiDragElements();
-
- multiDragElements.forEach(multiDragElement => {
- if (children[multiDragIndex]) {
- parentEl.insertBefore(multiDragElement, children[multiDragIndex]);
- } else {
- parentEl.appendChild(multiDragElement);
- }
- multiDragIndex++;
- });
-
- // If initial folding is done, the elements may have changed position because they are now
- // unfolding around dragEl, even though dragEl may not have his index changed, so update event
- // must be fired here as Sortable will not.
- if (oldIndex === index(dragEl$1)) {
- let update = false;
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement.sortableIndex !== index(multiDragElement)) {
- update = true;
- return;
- }
- });
-
- if (update) {
- dispatchSortableEvent('update');
- }
- }
- }
-
- // Must be done after capturing individual rects (scroll bar)
- multiDragElements.forEach(multiDragElement => {
- unsetRect(multiDragElement);
- });
-
- toSortable.animateAll();
- }
-
- multiDragSortable = toSortable;
- }
-
- // Remove clones if necessary
- if (rootEl === parentEl || (putSortable && putSortable.lastPutMode !== 'clone')) {
- multiDragClones.forEach(clone => {
- clone.parentNode && clone.parentNode.removeChild(clone);
- });
- }
- },
-
- nullingGlobal() {
- this.isMultiDrag =
- dragStarted = false;
- multiDragClones.length = 0;
- },
-
- destroyGlobal() {
- this._deselectMultiDrag();
- off(document, 'pointerup', this._deselectMultiDrag);
- off(document, 'mouseup', this._deselectMultiDrag);
- off(document, 'touchend', this._deselectMultiDrag);
-
- off(document, 'keydown', this._checkKeyDown);
- off(document, 'keyup', this._checkKeyUp);
- },
-
- _deselectMultiDrag(evt) {
- if (typeof dragStarted !== "undefined" && dragStarted) return;
-
- // Only deselect if selection is in this sortable
- if (multiDragSortable !== this.sortable) return;
-
- // Only deselect if target is not item in this sortable
- if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;
-
- // Only deselect if left click
- if (evt && evt.button !== 0) return;
-
- while (multiDragElements.length) {
- let el = multiDragElements[0];
- toggleClass(el, this.options.selectedClass, false);
- multiDragElements.shift();
- dispatchEvent({
- sortable: this.sortable,
- rootEl: this.sortable.el,
- name: 'deselect',
- targetEl: el,
- originalEvt: evt
- });
- }
- },
-
- _checkKeyDown(evt) {
- if (evt.key === this.options.multiDragKey) {
- this.multiDragKeyDown = true;
- }
- },
-
- _checkKeyUp(evt) {
- if (evt.key === this.options.multiDragKey) {
- this.multiDragKeyDown = false;
- }
- }
- };
-
- return Object.assign(MultiDrag, {
- // Static methods & properties
- pluginName: 'multiDrag',
- utils: {
- /**
- * Selects the provided multi-drag item
- * @param {HTMLElement} el The element to be selected
- */
- select(el) {
- let sortable = el.parentNode[expando];
- if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;
- if (multiDragSortable && multiDragSortable !== sortable) {
- multiDragSortable.multiDrag._deselectMultiDrag();
- multiDragSortable = sortable;
- }
- toggleClass(el, sortable.options.selectedClass, true);
- multiDragElements.push(el);
- },
- /**
- * Deselects the provided multi-drag item
- * @param {HTMLElement} el The element to be deselected
- */
- deselect(el) {
- let sortable = el.parentNode[expando],
- index = multiDragElements.indexOf(el);
- if (!sortable || !sortable.options.multiDrag || !~index) return;
- toggleClass(el, sortable.options.selectedClass, false);
- multiDragElements.splice(index, 1);
- }
- },
- eventProperties() {
- const oldIndicies = [],
- newIndicies = [];
-
- multiDragElements.forEach(multiDragElement => {
- oldIndicies.push({
- multiDragElement,
- index: multiDragElement.sortableIndex
- });
-
- // multiDragElements will already be sorted if folding
- let newIndex;
- if (folding && multiDragElement !== dragEl$1) {
- newIndex = -1;
- } else if (folding) {
- newIndex = index(multiDragElement, ':not(.' + this.options.selectedClass + ')');
- } else {
- newIndex = index(multiDragElement);
- }
- newIndicies.push({
- multiDragElement,
- index: newIndex
- });
- });
- return {
- items: [...multiDragElements],
- clones: [...multiDragClones],
- oldIndicies,
- newIndicies
- };
- },
- optionListeners: {
- multiDragKey(key) {
- key = key.toLowerCase();
- if (key === 'ctrl') {
- key = 'Control';
- } else if (key.length > 1) {
- key = key.charAt(0).toUpperCase() + key.substr(1);
- }
- return key;
- }
- }
- });
+ function MultiDrag(sortable) {
+ // Bind all private methods
+ for (let fn in this) {
+ if (fn.charAt(0) === "_" && typeof this[fn] === "function") {
+ this[fn] = this[fn].bind(this);
+ }
+ }
+
+ if (sortable.options.supportPointer) {
+ on(document, "pointerup", this._deselectMultiDrag);
+ } else {
+ on(document, "mouseup", this._deselectMultiDrag);
+ on(document, "touchend", this._deselectMultiDrag);
+ }
+
+ on(document, "keydown", this._checkKeyDown);
+ on(document, "keyup", this._checkKeyUp);
+
+ this.defaults = {
+ selectedClass: "sortable-selected",
+ multiDragKey: null,
+ setData(dataTransfer, dragEl) {
+ let data = "";
+ if (multiDragElements.length && multiDragSortable === sortable) {
+ multiDragElements.forEach((multiDragElement, i) => {
+ data += (!i ? "" : ", ") + multiDragElement.textContent;
+ });
+ } else {
+ data = dragEl.textContent;
+ }
+ dataTransfer.setData("Text", data);
+ },
+ };
+ }
+
+ MultiDrag.prototype = {
+ multiDragKeyDown: false,
+ isMultiDrag: false,
+
+ delayStartGlobal({ dragEl: dragged }) {
+ dragEl$1 = dragged;
+ },
+
+ delayEnded() {
+ this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);
+ },
+
+ setupClone({ sortable, cancel }) {
+ if (!this.isMultiDrag) return;
+ for (let i = 0; i < multiDragElements.length; i++) {
+ multiDragClones.push(clone(multiDragElements[i]));
+
+ multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;
+
+ multiDragClones[i].draggable = false;
+ multiDragClones[i].style["will-change"] = "";
+
+ toggleClass(multiDragClones[i], this.options.selectedClass, false);
+ multiDragElements[i] === dragEl$1 &&
+ toggleClass(multiDragClones[i], this.options.chosenClass, false);
+ }
+
+ sortable._hideClone();
+ cancel();
+ },
+
+ clone({ sortable, rootEl, dispatchSortableEvent, cancel }) {
+ if (!this.isMultiDrag) return;
+ if (!this.options.removeCloneOnHide) {
+ if (multiDragElements.length && multiDragSortable === sortable) {
+ insertMultiDragClones(true, rootEl);
+ dispatchSortableEvent("clone");
+
+ cancel();
+ }
+ }
+ },
+
+ showClone({ cloneNowShown, rootEl, cancel }) {
+ if (!this.isMultiDrag) return;
+ insertMultiDragClones(false, rootEl);
+ multiDragClones.forEach((clone) => {
+ css(clone, "display", "");
+ });
+
+ cloneNowShown();
+ clonesHidden = false;
+ cancel();
+ },
+
+ hideClone({ sortable, cloneNowHidden, cancel }) {
+ if (!this.isMultiDrag) return;
+ multiDragClones.forEach((clone) => {
+ css(clone, "display", "none");
+ if (this.options.removeCloneOnHide && clone.parentNode) {
+ clone.parentNode.removeChild(clone);
+ }
+ });
+
+ cloneNowHidden();
+ clonesHidden = true;
+ cancel();
+ },
+
+ dragStartGlobal({ sortable }) {
+ if (!this.isMultiDrag && multiDragSortable) {
+ multiDragSortable.multiDrag._deselectMultiDrag();
+ }
+
+ multiDragElements.forEach((multiDragElement) => {
+ multiDragElement.sortableIndex = index(multiDragElement);
+ });
+
+ // Sort multi-drag elements
+ multiDragElements = multiDragElements.sort(function (a, b) {
+ return a.sortableIndex - b.sortableIndex;
+ });
+ dragStarted = true;
+ },
+
+ dragStarted({ sortable }) {
+ if (!this.isMultiDrag) return;
+ if (this.options.sort) {
+ // Capture rects,
+ // hide multi drag elements (by positioning them absolute),
+ // set multi drag elements rects to dragRect,
+ // show multi drag elements,
+ // animate to rects,
+ // unset rects & remove from DOM
+
+ sortable.captureAnimationState();
+
+ if (this.options.animation) {
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ css(multiDragElement, "position", "absolute");
+ });
+
+ let dragRect = getRect(dragEl$1, false, true, true);
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ setRect(multiDragElement, dragRect);
+ });
+
+ folding = true;
+ initialFolding = true;
+ }
+ }
+
+ sortable.animateAll(() => {
+ folding = false;
+ initialFolding = false;
+
+ if (this.options.animation) {
+ multiDragElements.forEach((multiDragElement) => {
+ unsetRect(multiDragElement);
+ });
+ }
+
+ // Remove all auxiliary multidrag items from el, if sorting enabled
+ if (this.options.sort) {
+ removeMultiDragElements();
+ }
+ });
+ },
+
+ dragOver({ target, completed, cancel }) {
+ if (folding && ~multiDragElements.indexOf(target)) {
+ completed(false);
+ cancel();
+ }
+ },
+
+ revert({ fromSortable, rootEl, sortable, dragRect }) {
+ if (multiDragElements.length > 1) {
+ // Setup unfold animation
+ multiDragElements.forEach((multiDragElement) => {
+ sortable.addAnimationState({
+ target: multiDragElement,
+ rect: folding ? getRect(multiDragElement) : dragRect,
+ });
+
+ unsetRect(multiDragElement);
+
+ multiDragElement.fromRect = dragRect;
+
+ fromSortable.removeAnimationState(multiDragElement);
+ });
+ folding = false;
+ insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);
+ }
+ },
+
+ dragOverCompleted({
+ sortable,
+ isOwner,
+ insertion,
+ activeSortable,
+ parentEl,
+ putSortable,
+ }) {
+ let options = this.options;
+ if (insertion) {
+ // Clones must be hidden before folding animation to capture dragRectAbsolute properly
+ if (isOwner) {
+ activeSortable._hideClone();
+ }
+
+ initialFolding = false;
+ // If leaving sort:false root, or already folding - Fold to new location
+ if (
+ options.animation &&
+ multiDragElements.length > 1 &&
+ (folding ||
+ (!isOwner && !activeSortable.options.sort && !putSortable))
+ ) {
+ // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible
+ let dragRectAbsolute = getRect(dragEl$1, false, true, true);
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ setRect(multiDragElement, dragRectAbsolute);
+
+ // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted
+ // while folding, and so that we can capture them again because old sortable will no longer be fromSortable
+ parentEl.appendChild(multiDragElement);
+ });
+
+ folding = true;
+ }
+
+ // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out
+ if (!isOwner) {
+ // Only remove if not folding (folding will remove them anyways)
+ if (!folding) {
+ removeMultiDragElements();
+ }
+
+ if (multiDragElements.length > 1) {
+ let clonesHiddenBefore = clonesHidden;
+ activeSortable._showClone(sortable);
+
+ // Unfold animation for clones if showing from hidden
+ if (
+ activeSortable.options.animation &&
+ !clonesHidden &&
+ clonesHiddenBefore
+ ) {
+ multiDragClones.forEach((clone) => {
+ activeSortable.addAnimationState({
+ target: clone,
+ rect: clonesFromRect,
+ });
+
+ clone.fromRect = clonesFromRect;
+ clone.thisAnimationDuration = null;
+ });
+ }
+ } else {
+ activeSortable._showClone(sortable);
+ }
+ }
+ }
+ },
+
+ dragOverAnimationCapture({ dragRect, isOwner, activeSortable }) {
+ multiDragElements.forEach((multiDragElement) => {
+ multiDragElement.thisAnimationDuration = null;
+ });
+
+ if (
+ activeSortable.options.animation &&
+ !isOwner &&
+ activeSortable.multiDrag.isMultiDrag
+ ) {
+ clonesFromRect = Object.assign({}, dragRect);
+ let dragMatrix = matrix(dragEl$1, true);
+ clonesFromRect.top -= dragMatrix.f;
+ clonesFromRect.left -= dragMatrix.e;
+ }
+ },
+
+ dragOverAnimationComplete() {
+ if (folding) {
+ folding = false;
+ removeMultiDragElements();
+ }
+ },
+
+ drop({
+ originalEvent: evt,
+ rootEl,
+ parentEl,
+ sortable,
+ dispatchSortableEvent,
+ oldIndex,
+ putSortable,
+ }) {
+ let toSortable = putSortable || this.sortable;
+
+ if (!evt) return;
+
+ let options = this.options,
+ children = parentEl.children;
+
+ // Multi-drag selection
+ if (!dragStarted) {
+ if (options.multiDragKey && !this.multiDragKeyDown) {
+ this._deselectMultiDrag();
+ }
+ toggleClass(
+ dragEl$1,
+ options.selectedClass,
+ !~multiDragElements.indexOf(dragEl$1)
+ );
+
+ if (!~multiDragElements.indexOf(dragEl$1)) {
+ multiDragElements.push(dragEl$1);
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "select",
+ targetEl: dragEl$1,
+ originalEvt: evt,
+ });
+
+ // Modifier activated, select from last to dragEl
+ if (
+ evt.shiftKey &&
+ lastMultiDragSelect &&
+ sortable.el.contains(lastMultiDragSelect)
+ ) {
+ let lastIndex = index(lastMultiDragSelect),
+ currentIndex = index(dragEl$1);
+
+ if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {
+ // Must include lastMultiDragSelect (select it), in case modified selection from no selection
+ // (but previous selection existed)
+ let n, i;
+ if (currentIndex > lastIndex) {
+ i = lastIndex;
+ n = currentIndex;
+ } else {
+ i = currentIndex;
+ n = lastIndex + 1;
+ }
+
+ for (; i < n; i++) {
+ if (~multiDragElements.indexOf(children[i])) continue;
+ toggleClass(children[i], options.selectedClass, true);
+ multiDragElements.push(children[i]);
+
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "select",
+ targetEl: children[i],
+ originalEvt: evt,
+ });
+ }
+ }
+ } else {
+ lastMultiDragSelect = dragEl$1;
+ }
+
+ multiDragSortable = toSortable;
+ } else {
+ multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);
+ lastMultiDragSelect = null;
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "deselect",
+ targetEl: dragEl$1,
+ originalEvt: evt,
+ });
+ }
+ }
+
+ // Multi-drag drop
+ if (dragStarted && this.isMultiDrag) {
+ // Do not "unfold" after around dragEl if reverted
+ if (
+ (parentEl[expando].options.sort || parentEl !== rootEl) &&
+ multiDragElements.length > 1
+ ) {
+ let dragRect = getRect(dragEl$1),
+ multiDragIndex = index(
+ dragEl$1,
+ ":not(." + this.options.selectedClass + ")"
+ );
+
+ if (!initialFolding && options.animation)
+ dragEl$1.thisAnimationDuration = null;
+
+ toSortable.captureAnimationState();
+
+ if (!initialFolding) {
+ if (options.animation) {
+ dragEl$1.fromRect = dragRect;
+ multiDragElements.forEach((multiDragElement) => {
+ multiDragElement.thisAnimationDuration = null;
+ if (multiDragElement !== dragEl$1) {
+ let rect = folding ? getRect(multiDragElement) : dragRect;
+ multiDragElement.fromRect = rect;
+
+ // Prepare unfold animation
+ toSortable.addAnimationState({
+ target: multiDragElement,
+ rect: rect,
+ });
+ }
+ });
+ }
+
+ // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert
+ // properly they must all be removed
+ removeMultiDragElements();
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (children[multiDragIndex]) {
+ parentEl.insertBefore(
+ multiDragElement,
+ children[multiDragIndex]
+ );
+ } else {
+ parentEl.appendChild(multiDragElement);
+ }
+ multiDragIndex++;
+ });
+
+ // If initial folding is done, the elements may have changed position because they are now
+ // unfolding around dragEl, even though dragEl may not have his index changed, so update event
+ // must be fired here as Sortable will not.
+ if (oldIndex === index(dragEl$1)) {
+ let update = false;
+ multiDragElements.forEach((multiDragElement) => {
+ if (
+ multiDragElement.sortableIndex !== index(multiDragElement)
+ ) {
+ update = true;
+ return;
+ }
+ });
+
+ if (update) {
+ dispatchSortableEvent("update");
+ }
+ }
+ }
+
+ // Must be done after capturing individual rects (scroll bar)
+ multiDragElements.forEach((multiDragElement) => {
+ unsetRect(multiDragElement);
+ });
+
+ toSortable.animateAll();
+ }
+
+ multiDragSortable = toSortable;
+ }
+
+ // Remove clones if necessary
+ if (
+ rootEl === parentEl ||
+ (putSortable && putSortable.lastPutMode !== "clone")
+ ) {
+ multiDragClones.forEach((clone) => {
+ clone.parentNode && clone.parentNode.removeChild(clone);
+ });
+ }
+ },
+
+ nullingGlobal() {
+ this.isMultiDrag = dragStarted = false;
+ multiDragClones.length = 0;
+ },
+
+ destroyGlobal() {
+ this._deselectMultiDrag();
+ off(document, "pointerup", this._deselectMultiDrag);
+ off(document, "mouseup", this._deselectMultiDrag);
+ off(document, "touchend", this._deselectMultiDrag);
+
+ off(document, "keydown", this._checkKeyDown);
+ off(document, "keyup", this._checkKeyUp);
+ },
+
+ _deselectMultiDrag(evt) {
+ if (typeof dragStarted !== "undefined" && dragStarted) return;
+
+ // Only deselect if selection is in this sortable
+ if (multiDragSortable !== this.sortable) return;
+
+ // Only deselect if target is not item in this sortable
+ if (
+ evt &&
+ closest(evt.target, this.options.draggable, this.sortable.el, false)
+ )
+ return;
+
+ // Only deselect if left click
+ if (evt && evt.button !== 0) return;
+
+ while (multiDragElements.length) {
+ let el = multiDragElements[0];
+ toggleClass(el, this.options.selectedClass, false);
+ multiDragElements.shift();
+ dispatchEvent({
+ sortable: this.sortable,
+ rootEl: this.sortable.el,
+ name: "deselect",
+ targetEl: el,
+ originalEvt: evt,
+ });
+ }
+ },
+
+ _checkKeyDown(evt) {
+ if (evt.key === this.options.multiDragKey) {
+ this.multiDragKeyDown = true;
+ }
+ },
+
+ _checkKeyUp(evt) {
+ if (evt.key === this.options.multiDragKey) {
+ this.multiDragKeyDown = false;
+ }
+ },
+ };
+
+ return Object.assign(MultiDrag, {
+ // Static methods & properties
+ pluginName: "multiDrag",
+ utils: {
+ /**
+ * Selects the provided multi-drag item
+ * @param {HTMLElement} el The element to be selected
+ */
+ select(el) {
+ let sortable = el.parentNode[expando];
+ if (
+ !sortable ||
+ !sortable.options.multiDrag ||
+ ~multiDragElements.indexOf(el)
+ )
+ return;
+ if (multiDragSortable && multiDragSortable !== sortable) {
+ multiDragSortable.multiDrag._deselectMultiDrag();
+ multiDragSortable = sortable;
+ }
+ toggleClass(el, sortable.options.selectedClass, true);
+ multiDragElements.push(el);
+ },
+ /**
+ * Deselects the provided multi-drag item
+ * @param {HTMLElement} el The element to be deselected
+ */
+ deselect(el) {
+ let sortable = el.parentNode[expando],
+ index = multiDragElements.indexOf(el);
+ if (!sortable || !sortable.options.multiDrag || !~index) return;
+ toggleClass(el, sortable.options.selectedClass, false);
+ multiDragElements.splice(index, 1);
+ },
+ },
+ eventProperties() {
+ const oldIndicies = [],
+ newIndicies = [];
+
+ multiDragElements.forEach((multiDragElement) => {
+ oldIndicies.push({
+ multiDragElement,
+ index: multiDragElement.sortableIndex,
+ });
+
+ // multiDragElements will already be sorted if folding
+ let newIndex;
+ if (folding && multiDragElement !== dragEl$1) {
+ newIndex = -1;
+ } else if (folding) {
+ newIndex = index(
+ multiDragElement,
+ ":not(." + this.options.selectedClass + ")"
+ );
+ } else {
+ newIndex = index(multiDragElement);
+ }
+ newIndicies.push({
+ multiDragElement,
+ index: newIndex,
+ });
+ });
+ return {
+ items: [...multiDragElements],
+ clones: [...multiDragClones],
+ oldIndicies,
+ newIndicies,
+ };
+ },
+ optionListeners: {
+ multiDragKey(key) {
+ key = key.toLowerCase();
+ if (key === "ctrl") {
+ key = "Control";
+ } else if (key.length > 1) {
+ key = key.charAt(0).toUpperCase() + key.substr(1);
+ }
+ return key;
+ },
+ },
+ });
}
function insertMultiDragElements(clonesInserted, rootEl) {
- multiDragElements.forEach((multiDragElement, i) => {
- let target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];
- if (target) {
- rootEl.insertBefore(multiDragElement, target);
- } else {
- rootEl.appendChild(multiDragElement);
- }
- });
+ multiDragElements.forEach((multiDragElement, i) => {
+ let target =
+ rootEl.children[
+ multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)
+ ];
+ if (target) {
+ rootEl.insertBefore(multiDragElement, target);
+ } else {
+ rootEl.appendChild(multiDragElement);
+ }
+ });
}
/**
@@ -3910,21 +4069,23 @@ function insertMultiDragElements(clonesInserted, rootEl) {
* @param {HTMLElement} rootEl
*/
function insertMultiDragClones(elementsInserted, rootEl) {
- multiDragClones.forEach((clone, i) => {
- let target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];
- if (target) {
- rootEl.insertBefore(clone, target);
- } else {
- rootEl.appendChild(clone);
- }
- });
+ multiDragClones.forEach((clone, i) => {
+ let target =
+ rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];
+ if (target) {
+ rootEl.insertBefore(clone, target);
+ } else {
+ rootEl.appendChild(clone);
+ }
+ });
}
function removeMultiDragElements() {
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);
- });
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ multiDragElement.parentNode &&
+ multiDragElement.parentNode.removeChild(multiDragElement);
+ });
}
Sortable.mount(new AutoScrollPlugin());
diff --git a/modular/sortable.core.esm.js b/modular/sortable.core.esm.js
index 0801811b7..4a98a0e0c 100644
--- a/modular/sortable.core.esm.js
+++ b/modular/sortable.core.esm.js
@@ -7,175 +7,184 @@
var version = "1.11.0";
function userAgent(pattern) {
- if (typeof window !== 'undefined' && window.navigator) {
- return !!/*@__PURE__*/navigator.userAgent.match(pattern);
- }
+ if (typeof window !== "undefined" && window.navigator) {
+ return !!(/*@__PURE__*/ navigator.userAgent.match(pattern));
+ }
}
-const IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i);
+const IE11OrLess = userAgent(
+ /(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i
+);
const Edge = userAgent(/Edge/i);
const FireFox = userAgent(/firefox/i);
-const Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);
+const Safari =
+ userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);
const IOS = userAgent(/iP(ad|od|hone)/i);
const ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);
const captureMode = {
- capture: false,
- passive: false
+ capture: false,
+ passive: false,
};
function on(el, event, fn) {
- el.addEventListener(event, fn, !IE11OrLess && captureMode);
+ el.addEventListener(event, fn, !IE11OrLess && captureMode);
}
function off(el, event, fn) {
- el.removeEventListener(event, fn, !IE11OrLess && captureMode);
+ el.removeEventListener(event, fn, !IE11OrLess && captureMode);
}
-function matches(/**HTMLElement*/el, /**String*/selector) {
- if (!selector) return;
-
- selector[0] === '>' && (selector = selector.substring(1));
-
- if (el) {
- try {
- if (el.matches) {
- return el.matches(selector);
- } else if (el.msMatchesSelector) {
- return el.msMatchesSelector(selector);
- } else if (el.webkitMatchesSelector) {
- return el.webkitMatchesSelector(selector);
- }
- } catch(_) {
- return false;
- }
- }
-
- return false;
+function matches(/**HTMLElement*/ el, /**String*/ selector) {
+ if (!selector) return;
+
+ selector[0] === ">" && (selector = selector.substring(1));
+
+ if (el) {
+ try {
+ if (el.matches) {
+ return el.matches(selector);
+ } else if (el.msMatchesSelector) {
+ return el.msMatchesSelector(selector);
+ } else if (el.webkitMatchesSelector) {
+ return el.webkitMatchesSelector(selector);
+ }
+ } catch (_) {
+ return false;
+ }
+ }
+
+ return false;
}
function getParentOrHost(el) {
- return (el.host && el !== document && el.host.nodeType)
- ? el.host
- : el.parentNode;
+ return el.host && el !== document && el.host.nodeType
+ ? el.host
+ : el.parentNode;
}
-function closest(/**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {
- if (el) {
- ctx = ctx || document;
-
- do {
- if (
- selector != null &&
- (
- selector[0] === '>' ?
- el.parentNode === ctx && matches(el, selector) :
- matches(el, selector)
- ) ||
- includeCTX && el === ctx
- ) {
- return el;
- }
-
- if (el === ctx) break;
- /* jshint boss:true */
- } while (el = getParentOrHost(el));
- }
-
- return null;
+function closest(
+ /**HTMLElement*/ el,
+ /**String*/ selector,
+ /**HTMLElement*/ ctx,
+ includeCTX
+) {
+ if (el) {
+ ctx = ctx || document;
+
+ do {
+ if (
+ (selector != null &&
+ (selector[0] === ">"
+ ? el.parentNode === ctx && matches(el, selector)
+ : matches(el, selector))) ||
+ (includeCTX && el === ctx)
+ ) {
+ return el;
+ }
+
+ if (el === ctx) break;
+ /* jshint boss:true */
+ } while ((el = getParentOrHost(el)));
+ }
+
+ return null;
}
const R_SPACE = /\s+/g;
function toggleClass(el, name, state) {
- if (el && name) {
- if (el.classList) {
- el.classList[state ? 'add' : 'remove'](name);
- }
- else {
- let className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');
- el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');
- }
- }
+ if (el && name) {
+ if (el.classList) {
+ el.classList[state ? "add" : "remove"](name);
+ } else {
+ let className = (" " + el.className + " ")
+ .replace(R_SPACE, " ")
+ .replace(" " + name + " ", " ");
+ el.className = (className + (state ? " " + name : "")).replace(
+ R_SPACE,
+ " "
+ );
+ }
+ }
}
-
function css(el, prop, val) {
- let style = el && el.style;
-
- if (style) {
- if (val === void 0) {
- if (document.defaultView && document.defaultView.getComputedStyle) {
- val = document.defaultView.getComputedStyle(el, '');
- }
- else if (el.currentStyle) {
- val = el.currentStyle;
- }
-
- return prop === void 0 ? val : val[prop];
- }
- else {
- if (!(prop in style) && prop.indexOf('webkit') === -1) {
- prop = '-webkit-' + prop;
- }
-
- style[prop] = val + (typeof val === 'string' ? '' : 'px');
- }
- }
+ let style = el && el.style;
+
+ if (style) {
+ if (val === void 0) {
+ if (document.defaultView && document.defaultView.getComputedStyle) {
+ val = document.defaultView.getComputedStyle(el, "");
+ } else if (el.currentStyle) {
+ val = el.currentStyle;
+ }
+
+ return prop === void 0 ? val : val[prop];
+ } else {
+ if (!(prop in style) && prop.indexOf("webkit") === -1) {
+ prop = "-webkit-" + prop;
+ }
+
+ style[prop] = val + (typeof val === "string" ? "" : "px");
+ }
+ }
}
function matrix(el, selfOnly) {
- let appliedTransforms = '';
- if (typeof(el) === 'string') {
- appliedTransforms = el;
- } else {
- do {
- //@ts-ignore
- let transform = css(el, 'transform');
-
- if (transform && transform !== 'none') {
- appliedTransforms = transform + ' ' + appliedTransforms;
- }
- /* jshint boss:true */
- } while (!selfOnly && (el = el.parentNode));
- }
-
- //@ts-ignore
- const matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;
- /*jshint -W056 */
- return matrixFn && (new matrixFn(appliedTransforms));
-}
+ let appliedTransforms = "";
+ if (typeof el === "string") {
+ appliedTransforms = el;
+ } else {
+ do {
+ //@ts-ignore
+ let transform = css(el, "transform");
+
+ if (transform && transform !== "none") {
+ appliedTransforms = transform + " " + appliedTransforms;
+ }
+ /* jshint boss:true */
+ } while (!selfOnly && (el = el.parentNode));
+ }
+ //@ts-ignore
+ const matrixFn =
+ window.DOMMatrix ||
+ window.WebKitCSSMatrix ||
+ window.CSSMatrix ||
+ window.MSCSSMatrix;
+ /*jshint -W056 */
+ return matrixFn && new matrixFn(appliedTransforms);
+}
function find(ctx, tagName, iterator) {
- if (ctx) {
- let list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;
+ if (ctx) {
+ let list = ctx.getElementsByTagName(tagName),
+ i = 0,
+ n = list.length;
- if (iterator) {
- for (; i < n; i++) {
- iterator(list[i], i);
- }
- }
+ if (iterator) {
+ for (; i < n; i++) {
+ iterator(list[i], i);
+ }
+ }
- return list;
- }
+ return list;
+ }
- return [];
+ return [];
}
-
-
function getWindowScrollingElement() {
- let scrollingElement = document.scrollingElement;
+ let scrollingElement = document.scrollingElement;
- if (scrollingElement) {
- return scrollingElement
- } else {
- return document.documentElement
- }
+ if (scrollingElement) {
+ return scrollingElement;
+ } else {
+ return document.documentElement;
+ }
}
-
/**
* Returns the "bounding client rect" of given element
* @param {HTMLElement} el The element whose boundingClientRect is wanted
@@ -185,97 +194,100 @@ function getWindowScrollingElement() {
* @param {[HTMLElement]} container The parent the element will be placed in
* @return {Object} The boundingClientRect of el, with specified adjustments
*/
-function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {
- if (!el.getBoundingClientRect && el !== window) return;
-
- let elRect,
- top,
- left,
- bottom,
- right,
- height,
- width;
-
- if (el !== window && el !== getWindowScrollingElement()) {
- elRect = el.getBoundingClientRect();
- top = elRect.top;
- left = elRect.left;
- bottom = elRect.bottom;
- right = elRect.right;
- height = elRect.height;
- width = elRect.width;
- } else {
- top = 0;
- left = 0;
- bottom = window.innerHeight;
- right = window.innerWidth;
- height = window.innerHeight;
- width = window.innerWidth;
- }
-
- if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {
- // Adjust for translate()
- container = container || el.parentNode;
-
- // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)
- // Not needed on <= IE11
- if (!IE11OrLess) {
- do {
- if (
- container &&
- container.getBoundingClientRect &&
- (
- //@ts-ignore
- css(container, 'transform') !== 'none' ||
- relativeToNonStaticParent &&
- //@ts-ignore
- css(container, 'position') !== 'static'
- )
- ) {
- let containerRect = container.getBoundingClientRect();
-
- // Set relative to edges of padding box of container
- //@ts-ignore
- top -= containerRect.top + parseInt(css(container, 'border-top-width'));
- //@ts-ignore
- left -= containerRect.left + parseInt(css(container, 'border-left-width'));
- bottom = top + elRect.height;
- right = left + elRect.width;
-
- break;
- }
- /* jshint boss:true */
- } while (container = container.parentNode);
- }
- }
-
- if (undoScale && el !== window) {
- // Adjust for scale()
- //@ts-ignore
- let elMatrix = matrix(container || el),
- scaleX = elMatrix && elMatrix.a,
- scaleY = elMatrix && elMatrix.d;
-
- if (elMatrix) {
- top /= scaleY;
- left /= scaleX;
-
- width /= scaleX;
- height /= scaleY;
-
- bottom = top + height;
- right = left + width;
- }
- }
-
- return {
- top: top,
- left: left,
- bottom: bottom,
- right: right,
- width: width,
- height: height
- };
+function getRect(
+ el,
+ relativeToContainingBlock,
+ relativeToNonStaticParent,
+ undoScale,
+ container
+) {
+ if (!el.getBoundingClientRect && el !== window) return;
+
+ let elRect, top, left, bottom, right, height, width;
+
+ if (el !== window && el !== getWindowScrollingElement()) {
+ elRect = el.getBoundingClientRect();
+ top = elRect.top;
+ left = elRect.left;
+ bottom = elRect.bottom;
+ right = elRect.right;
+ height = elRect.height;
+ width = elRect.width;
+ } else {
+ top = 0;
+ left = 0;
+ bottom = window.innerHeight;
+ right = window.innerWidth;
+ height = window.innerHeight;
+ width = window.innerWidth;
+ }
+
+ if (
+ (relativeToContainingBlock || relativeToNonStaticParent) &&
+ el !== window
+ ) {
+ // Adjust for translate()
+ container = container || el.parentNode;
+
+ // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)
+ // Not needed on <= IE11
+ if (!IE11OrLess) {
+ do {
+ if (
+ container &&
+ container.getBoundingClientRect &&
+ //@ts-ignore
+ (css(container, "transform") !== "none" ||
+ (relativeToNonStaticParent &&
+ //@ts-ignore
+ css(container, "position") !== "static"))
+ ) {
+ let containerRect = container.getBoundingClientRect();
+
+ // Set relative to edges of padding box of container
+ //@ts-ignore
+ top -=
+ containerRect.top + parseInt(css(container, "border-top-width"));
+ //@ts-ignore
+ left -=
+ containerRect.left + parseInt(css(container, "border-left-width"));
+ bottom = top + elRect.height;
+ right = left + elRect.width;
+
+ break;
+ }
+ /* jshint boss:true */
+ } while ((container = container.parentNode));
+ }
+ }
+
+ if (undoScale && el !== window) {
+ // Adjust for scale()
+ //@ts-ignore
+ let elMatrix = matrix(container || el),
+ scaleX = elMatrix && elMatrix.a,
+ scaleY = elMatrix && elMatrix.d;
+
+ if (elMatrix) {
+ top /= scaleY;
+ left /= scaleX;
+
+ width /= scaleX;
+ height /= scaleY;
+
+ bottom = top + height;
+ right = left + width;
+ }
+ }
+
+ return {
+ top: top,
+ left: left,
+ bottom: bottom,
+ right: right,
+ width: width,
+ height: height,
+ };
}
/**
@@ -286,34 +298,32 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS
* @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element
*/
function isScrolledPast(el, elSide, parentSide) {
- let parent = getParentAutoScrollElement(el, true),
- //@ts-ignore
- elSideVal = getRect(el)[elSide];
-
- /* jshint boss:true */
- while (parent) {
- //@ts-ignore
- let parentSideVal = getRect(parent)[parentSide],
- visible;
-
- if (parentSide === 'top' || parentSide === 'left') {
- visible = elSideVal >= parentSideVal;
- } else {
- visible = elSideVal <= parentSideVal;
- }
+ let parent = getParentAutoScrollElement(el, true),
+ //@ts-ignore
+ elSideVal = getRect(el)[elSide];
+
+ /* jshint boss:true */
+ while (parent) {
+ //@ts-ignore
+ let parentSideVal = getRect(parent)[parentSide],
+ visible;
+
+ if (parentSide === "top" || parentSide === "left") {
+ visible = elSideVal >= parentSideVal;
+ } else {
+ visible = elSideVal <= parentSideVal;
+ }
- if (!visible) return parent;
+ if (!visible) return parent;
- if (parent === getWindowScrollingElement()) break;
+ if (parent === getWindowScrollingElement()) break;
- parent = getParentAutoScrollElement(parent, false);
- }
+ parent = getParentAutoScrollElement(parent, false);
+ }
- return false;
+ return false;
}
-
-
/**
* Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)
* and non-draggable elements
@@ -323,28 +333,28 @@ function isScrolledPast(el, elSide, parentSide) {
* @return {HTMLElement} The child at index childNum, or null if not found
*/
function getChild(el, childNum, options) {
- let currentChild = 0,
- i = 0,
- children = el.children;
-
- while (i < children.length) {
- if (
- children[i].style.display !== 'none' &&
- //@ts-ignore
- children[i] !== Sortable.ghost &&
- //@ts-ignore
- children[i] !== Sortable.dragged &&
- closest(children[i], options.draggable, el, false)
- ) {
- if (currentChild === childNum) {
- return children[i];
- }
- currentChild++;
- }
-
- i++;
- }
- return null;
+ let currentChild = 0,
+ i = 0,
+ children = el.children;
+
+ while (i < children.length) {
+ if (
+ children[i].style.display !== "none" &&
+ //@ts-ignore
+ children[i] !== Sortable.ghost &&
+ //@ts-ignore
+ children[i] !== Sortable.dragged &&
+ closest(children[i], options.draggable, el, false)
+ ) {
+ if (currentChild === childNum) {
+ return children[i];
+ }
+ currentChild++;
+ }
+
+ i++;
+ }
+ return null;
}
/**
@@ -354,24 +364,21 @@ function getChild(el, childNum, options) {
* @return {HTMLElement} The last child, ignoring ghostEl
*/
function lastChild(el, selector) {
- let last = el.lastElementChild;
-
- while (
- last &&
- (
- //@ts-ignore
- last === Sortable.ghost ||
- //@ts-ignore
- css(last, 'display') === 'none' ||
- selector && !matches(last, selector)
- )
- ) {
- last = last.previousElementSibling;
- }
-
- return last || null;
-}
+ let last = el.lastElementChild;
+
+ while (
+ last &&
+ //@ts-ignore
+ (last === Sortable.ghost ||
+ //@ts-ignore
+ css(last, "display") === "none" ||
+ (selector && !matches(last, selector)))
+ ) {
+ last = last.previousElementSibling;
+ }
+ return last || null;
+}
/**
* Returns the index of an element within its parent for a selected set of
@@ -381,21 +388,25 @@ function lastChild(el, selector) {
* @return {number}
*/
function index(el, selector) {
- let index = 0;
+ let index = 0;
- if (!el || !el.parentNode) {
- return -1;
- }
+ if (!el || !el.parentNode) {
+ return -1;
+ }
- /* jshint boss:true */
- while (el = el.previousElementSibling) {
- //@ts-ignore
- if ((el.nodeName.toUpperCase() !== 'TEMPLATE') && el !== Sortable.clone && (!selector || matches(el, selector))) {
- index++;
- }
- }
+ /* jshint boss:true */
+ while ((el = el.previousElementSibling)) {
+ //@ts-ignore
+ if (
+ el.nodeName.toUpperCase() !== "TEMPLATE" &&
+ el !== Sortable.clone &&
+ (!selector || matches(el, selector))
+ ) {
+ index++;
+ }
+ }
- return index;
+ return index;
}
/**
@@ -405,23 +416,23 @@ function index(el, selector) {
* @return {Array} Offsets in the format of [left, top]
*/
function getRelativeScrollOffset(el) {
- let offsetLeft = 0,
- offsetTop = 0,
- winScroller = getWindowScrollingElement();
-
- if (el) {
- do {
- //@ts-ignore
- let elMatrix = matrix(el),
- scaleX = elMatrix.a,
- scaleY = elMatrix.d;
-
- offsetLeft += el.scrollLeft * scaleX;
- offsetTop += el.scrollTop * scaleY;
- } while (el !== winScroller && (el = el.parentNode));
- }
-
- return [offsetLeft, offsetTop];
+ let offsetLeft = 0,
+ offsetTop = 0,
+ winScroller = getWindowScrollingElement();
+
+ if (el) {
+ do {
+ //@ts-ignore
+ let elMatrix = matrix(el),
+ scaleX = elMatrix.a,
+ scaleY = elMatrix.d;
+
+ offsetLeft += el.scrollLeft * scaleX;
+ offsetTop += el.scrollTop * scaleY;
+ } while (el !== winScroller && (el = el.parentNode));
+ }
+
+ return [offsetLeft, offsetTop];
}
/**
@@ -431,446 +442,480 @@ function getRelativeScrollOffset(el) {
* @return {Number} The index of the object in the array, or -1
*/
function indexOfObject(arr, obj) {
- for (let i in arr) {
- if (!arr.hasOwnProperty(i)) continue;
- for (let key in obj) {
- if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);
- }
- }
- return -1;
+ for (let i in arr) {
+ if (!arr.hasOwnProperty(i)) continue;
+ for (let key in obj) {
+ if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);
+ }
+ }
+ return -1;
}
-
function getParentAutoScrollElement(el, includeSelf) {
- // skip to window
- if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();
-
- let elem = el;
- let gotSelf = false;
- do {
- // we don't need to get elem css if it isn't even overflowing in the first place (performance)
- if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {
- //@ts-ignore
- let elemCSS = css(elem);
- if (
- elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') ||
- elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')
- ) {
- if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();
-
- if (gotSelf || includeSelf) return elem;
- gotSelf = true;
- }
- }
- /* jshint boss:true */
- } while (elem = elem.parentNode);
-
- return getWindowScrollingElement();
+ // skip to window
+ if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();
+
+ let elem = el;
+ let gotSelf = false;
+ do {
+ // we don't need to get elem css if it isn't even overflowing in the first place (performance)
+ if (
+ elem.clientWidth < elem.scrollWidth ||
+ elem.clientHeight < elem.scrollHeight
+ ) {
+ //@ts-ignore
+ let elemCSS = css(elem);
+ if (
+ (elem.clientWidth < elem.scrollWidth &&
+ (elemCSS.overflowX == "auto" || elemCSS.overflowX == "scroll")) ||
+ (elem.clientHeight < elem.scrollHeight &&
+ (elemCSS.overflowY == "auto" || elemCSS.overflowY == "scroll"))
+ ) {
+ if (!elem.getBoundingClientRect || elem === document.body)
+ return getWindowScrollingElement();
+
+ if (gotSelf || includeSelf) return elem;
+ gotSelf = true;
+ }
+ }
+ /* jshint boss:true */
+ } while ((elem = elem.parentNode));
+
+ return getWindowScrollingElement();
}
function extend(dst, src) {
- if (dst && src) {
- for (let key in src) {
- if (src.hasOwnProperty(key)) {
- dst[key] = src[key];
- }
- }
- }
-
- return dst;
-}
+ if (dst && src) {
+ for (let key in src) {
+ if (src.hasOwnProperty(key)) {
+ dst[key] = src[key];
+ }
+ }
+ }
+ return dst;
+}
function isRectEqual(rect1, rect2) {
- return Math.round(rect1.top) === Math.round(rect2.top) &&
- Math.round(rect1.left) === Math.round(rect2.left) &&
- Math.round(rect1.height) === Math.round(rect2.height) &&
- Math.round(rect1.width) === Math.round(rect2.width);
+ return (
+ Math.round(rect1.top) === Math.round(rect2.top) &&
+ Math.round(rect1.left) === Math.round(rect2.left) &&
+ Math.round(rect1.height) === Math.round(rect2.height) &&
+ Math.round(rect1.width) === Math.round(rect2.width)
+ );
}
-
let _throttleTimeout;
function throttle(callback, ms) {
- return function () {
- if (!_throttleTimeout) {
- let args = arguments,
- _this = this;
-
- if (args.length === 1) {
- callback.call(_this, args[0]);
- } else {
- callback.apply(_this, args);
- }
-
- _throttleTimeout = setTimeout(function () {
- _throttleTimeout = void 0;
- }, ms);
- }
- };
-}
+ return function () {
+ if (!_throttleTimeout) {
+ let args = arguments,
+ _this = this;
+ if (args.length === 1) {
+ callback.call(_this, args[0]);
+ } else {
+ callback.apply(_this, args);
+ }
-function cancelThrottle() {
- clearTimeout(_throttleTimeout);
- _throttleTimeout = void 0;
+ _throttleTimeout = setTimeout(function () {
+ _throttleTimeout = void 0;
+ }, ms);
+ }
+ };
}
+function cancelThrottle() {
+ clearTimeout(_throttleTimeout);
+ _throttleTimeout = void 0;
+}
function scrollBy(el, x, y) {
- el.scrollLeft += x;
- el.scrollTop += y;
+ el.scrollLeft += x;
+ el.scrollTop += y;
}
-
function clone(el) {
- //@ts-ignore
- let Polymer = window.Polymer;
- //@ts-ignore
- let $ = window.jQuery || window.Zepto;
-
- if (Polymer && Polymer.dom) {
- return Polymer.dom(el).cloneNode(true);
- }
- else if ($) {
- return $(el).clone(true)[0];
- }
- else {
- return el.cloneNode(true);
- }
+ //@ts-ignore
+ let Polymer = window.Polymer;
+ //@ts-ignore
+ let $ = window.jQuery || window.Zepto;
+
+ if (Polymer && Polymer.dom) {
+ return Polymer.dom(el).cloneNode(true);
+ } else if ($) {
+ return $(el).clone(true)[0];
+ } else {
+ return el.cloneNode(true);
+ }
}
-
function setRect(el, rect) {
- css(el, 'position', 'absolute');
- css(el, 'top', rect.top);
- css(el, 'left', rect.left);
- css(el, 'width', rect.width);
- css(el, 'height', rect.height);
+ css(el, "position", "absolute");
+ css(el, "top", rect.top);
+ css(el, "left", rect.left);
+ css(el, "width", rect.width);
+ css(el, "height", rect.height);
}
function unsetRect(el) {
- css(el, 'position', '');
- css(el, 'top', '');
- css(el, 'left', '');
- css(el, 'width', '');
- css(el, 'height', '');
+ css(el, "position", "");
+ css(el, "top", "");
+ css(el, "left", "");
+ css(el, "width", "");
+ css(el, "height", "");
}
-
-const expando = 'Sortable' + (new Date).getTime();
+const expando = "Sortable" + new Date().getTime();
function AnimationStateManager() {
- let animationStates = [],
- animationCallbackId;
-
- return {
- captureAnimationState() {
- animationStates = [];
- if (!this.options.animation) return;
- let children = [].slice.call(this.el.children);
-
- children.forEach(child => {
- if (css(child, 'display') === 'none' || child === Sortable.ghost) return;
- animationStates.push({
- target: child,
- rect: getRect(child)
- });
- let fromRect = { ...animationStates[animationStates.length - 1].rect };
-
- // If animating: compensate for current animation
- if (child.thisAnimationDuration) {
- let childMatrix = matrix(child, true);
- if (childMatrix) {
- fromRect.top -= childMatrix.f;
- fromRect.left -= childMatrix.e;
- }
- }
-
- child.fromRect = fromRect;
- });
- },
-
- addAnimationState(state) {
- animationStates.push(state);
- },
-
- removeAnimationState(target) {
- animationStates.splice(indexOfObject(animationStates, { target }), 1);
- },
-
- animateAll(callback) {
- if (!this.options.animation) {
- clearTimeout(animationCallbackId);
- if (typeof(callback) === 'function') callback();
- return;
- }
-
- let animating = false,
- animationTime = 0;
-
- animationStates.forEach((state) => {
- let time = 0,
- target = state.target,
- fromRect = target.fromRect,
- toRect = getRect(target),
- prevFromRect = target.prevFromRect,
- prevToRect = target.prevToRect,
- animatingRect = state.rect,
- targetMatrix = matrix(target, true);
-
-
- if (targetMatrix) {
- // Compensate for current animation
- toRect.top -= targetMatrix.f;
- toRect.left -= targetMatrix.e;
- }
-
- target.toRect = toRect;
-
- if (target.thisAnimationDuration) {
- // Could also check if animatingRect is between fromRect and toRect
- if (
- isRectEqual(prevFromRect, toRect) &&
- !isRectEqual(fromRect, toRect) &&
- // Make sure animatingRect is on line between toRect & fromRect
- (animatingRect.top - toRect.top) /
- (animatingRect.left - toRect.left) ===
- (fromRect.top - toRect.top) /
- (fromRect.left - toRect.left)
- ) {
- // If returning to same place as started from animation and on same axis
- time = calculateRealTime(animatingRect, prevFromRect, prevToRect, this.options);
- }
- }
-
- // if fromRect != toRect: animate
- if (!isRectEqual(toRect, fromRect)) {
- target.prevFromRect = fromRect;
- target.prevToRect = toRect;
-
- if (!time) {
- time = this.options.animation;
- }
- this.animate(
- target,
- animatingRect,
- toRect,
- time
- );
- }
-
- if (time) {
- animating = true;
- animationTime = Math.max(animationTime, time);
- clearTimeout(target.animationResetTimer);
- target.animationResetTimer = setTimeout(function() {
- target.animationTime = 0;
- target.prevFromRect = null;
- target.fromRect = null;
- target.prevToRect = null;
- target.thisAnimationDuration = null;
- }, time);
- target.thisAnimationDuration = time;
- }
- });
-
-
- clearTimeout(animationCallbackId);
- if (!animating) {
- if (typeof(callback) === 'function') callback();
- } else {
- animationCallbackId = setTimeout(function() {
- if (typeof(callback) === 'function') callback();
- }, animationTime);
- }
- animationStates = [];
- },
-
- animate(target, currentRect, toRect, duration) {
- if (duration) {
- css(target, 'transition', '');
- css(target, 'transform', '');
- let elMatrix = matrix(this.el),
- scaleX = elMatrix && elMatrix.a,
- scaleY = elMatrix && elMatrix.d,
- translateX = (currentRect.left - toRect.left) / (scaleX || 1),
- translateY = (currentRect.top - toRect.top) / (scaleY || 1);
-
- target.animatingX = !!translateX;
- target.animatingY = !!translateY;
-
- css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');
-
- this.forRepaintDummy = repaint(target); // repaint
-
- css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));
- css(target, 'transform', 'translate3d(0,0,0)');
- (typeof target.animated === 'number') && clearTimeout(target.animated);
- target.animated = setTimeout(function () {
- css(target, 'transition', '');
- css(target, 'transform', '');
- target.animated = false;
-
- target.animatingX = false;
- target.animatingY = false;
- }, duration);
- }
- }
- };
+ let animationStates = [],
+ animationCallbackId;
+
+ return {
+ captureAnimationState() {
+ animationStates = [];
+ if (!this.options.animation) return;
+ let children = [].slice.call(this.el.children);
+
+ children.forEach((child) => {
+ if (css(child, "display") === "none" || child === Sortable.ghost)
+ return;
+ animationStates.push({
+ target: child,
+ rect: getRect(child),
+ });
+ let fromRect = { ...animationStates[animationStates.length - 1].rect };
+
+ // If animating: compensate for current animation
+ if (child.thisAnimationDuration) {
+ let childMatrix = matrix(child, true);
+ if (childMatrix) {
+ fromRect.top -= childMatrix.f;
+ fromRect.left -= childMatrix.e;
+ }
+ }
+
+ child.fromRect = fromRect;
+ });
+ },
+
+ addAnimationState(state) {
+ animationStates.push(state);
+ },
+
+ removeAnimationState(target) {
+ animationStates.splice(indexOfObject(animationStates, { target }), 1);
+ },
+
+ animateAll(callback) {
+ if (!this.options.animation) {
+ clearTimeout(animationCallbackId);
+ if (typeof callback === "function") callback();
+ return;
+ }
+
+ let animating = false,
+ animationTime = 0;
+
+ animationStates.forEach((state) => {
+ let time = 0,
+ target = state.target,
+ fromRect = target.fromRect,
+ toRect = getRect(target),
+ prevFromRect = target.prevFromRect,
+ prevToRect = target.prevToRect,
+ animatingRect = state.rect,
+ targetMatrix = matrix(target, true);
+
+ if (targetMatrix) {
+ // Compensate for current animation
+ toRect.top -= targetMatrix.f;
+ toRect.left -= targetMatrix.e;
+ }
+
+ target.toRect = toRect;
+
+ if (target.thisAnimationDuration) {
+ // Could also check if animatingRect is between fromRect and toRect
+ if (
+ isRectEqual(prevFromRect, toRect) &&
+ !isRectEqual(fromRect, toRect) &&
+ // Make sure animatingRect is on line between toRect & fromRect
+ (animatingRect.top - toRect.top) /
+ (animatingRect.left - toRect.left) ===
+ (fromRect.top - toRect.top) / (fromRect.left - toRect.left)
+ ) {
+ // If returning to same place as started from animation and on same axis
+ time = calculateRealTime(
+ animatingRect,
+ prevFromRect,
+ prevToRect,
+ this.options
+ );
+ }
+ }
+
+ // if fromRect != toRect: animate
+ if (!isRectEqual(toRect, fromRect)) {
+ target.prevFromRect = fromRect;
+ target.prevToRect = toRect;
+
+ if (!time) {
+ time = this.options.animation;
+ }
+ this.animate(target, animatingRect, toRect, time);
+ }
+
+ if (time) {
+ animating = true;
+ animationTime = Math.max(animationTime, time);
+ clearTimeout(target.animationResetTimer);
+ target.animationResetTimer = setTimeout(function () {
+ target.animationTime = 0;
+ target.prevFromRect = null;
+ target.fromRect = null;
+ target.prevToRect = null;
+ target.thisAnimationDuration = null;
+ }, time);
+ target.thisAnimationDuration = time;
+ }
+ });
+
+ clearTimeout(animationCallbackId);
+ if (!animating) {
+ if (typeof callback === "function") callback();
+ } else {
+ animationCallbackId = setTimeout(function () {
+ if (typeof callback === "function") callback();
+ }, animationTime);
+ }
+ animationStates = [];
+ },
+
+ animate(target, currentRect, toRect, duration) {
+ if (duration) {
+ css(target, "transition", "");
+ css(target, "transform", "");
+ let elMatrix = matrix(this.el),
+ scaleX = elMatrix && elMatrix.a,
+ scaleY = elMatrix && elMatrix.d,
+ translateX = (currentRect.left - toRect.left) / (scaleX || 1),
+ translateY = (currentRect.top - toRect.top) / (scaleY || 1);
+
+ target.animatingX = !!translateX;
+ target.animatingY = !!translateY;
+
+ css(
+ target,
+ "transform",
+ "translate3d(" + translateX + "px," + translateY + "px,0)"
+ );
+
+ this.forRepaintDummy = repaint(target); // repaint
+
+ css(
+ target,
+ "transition",
+ "transform " +
+ duration +
+ "ms" +
+ (this.options.easing ? " " + this.options.easing : "")
+ );
+ css(target, "transform", "translate3d(0,0,0)");
+ typeof target.animated === "number" && clearTimeout(target.animated);
+ target.animated = setTimeout(function () {
+ css(target, "transition", "");
+ css(target, "transform", "");
+ target.animated = false;
+
+ target.animatingX = false;
+ target.animatingY = false;
+ }, duration);
+ }
+ },
+ };
}
function repaint(target) {
- return target.offsetWidth;
+ return target.offsetWidth;
}
-
function calculateRealTime(animatingRect, fromRect, toRect, options) {
- return (
- Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) /
- Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2))
- ) * options.animation;
+ return (
+ (Math.sqrt(
+ Math.pow(fromRect.top - animatingRect.top, 2) +
+ Math.pow(fromRect.left - animatingRect.left, 2)
+ ) /
+ Math.sqrt(
+ Math.pow(fromRect.top - toRect.top, 2) +
+ Math.pow(fromRect.left - toRect.left, 2)
+ )) *
+ options.animation
+ );
}
let plugins = [];
const defaults = {
- initializeByDefault: true
+ initializeByDefault: true,
};
var PluginManager = {
- mount(plugin) {
- // Set default static properties
- for (let option in defaults) {
- if (defaults.hasOwnProperty(option) && !(option in plugin)) {
- plugin[option] = defaults[option];
- }
- }
- plugins.push(plugin);
- },
- pluginEvent(eventName, sortable, evt) {
- this.eventCanceled = false;
- evt.cancel = () => {
- this.eventCanceled = true;
- };
- const eventNameGlobal = eventName + 'Global';
- plugins.forEach(plugin => {
- if (!sortable[plugin.pluginName]) return;
- // Fire global events if it exists in this sortable
- if (
- sortable[plugin.pluginName][eventNameGlobal]
- ) {
- sortable[plugin.pluginName][eventNameGlobal]({ sortable, ...evt });
- }
-
- // Only fire plugin event if plugin is enabled in this sortable,
- // and plugin has event defined
- if (
- sortable.options[plugin.pluginName] &&
- sortable[plugin.pluginName][eventName]
- ) {
- sortable[plugin.pluginName][eventName]({ sortable, ...evt });
- }
- });
- },
- initializePlugins(sortable, el, defaults, options) {
- plugins.forEach(plugin => {
- const pluginName = plugin.pluginName;
- if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;
-
- let initialized = new plugin(sortable, el, sortable.options);
- initialized.sortable = sortable;
- initialized.options = sortable.options;
- sortable[pluginName] = initialized;
-
- // Add default options from plugin
- Object.assign(defaults, initialized.defaults);
- });
-
- for (let option in sortable.options) {
- if (!sortable.options.hasOwnProperty(option)) continue;
- let modified = this.modifyOption(sortable, option, sortable.options[option]);
- if (typeof(modified) !== 'undefined') {
- sortable.options[option] = modified;
- }
- }
- },
- getEventProperties(name, sortable) {
- let eventProperties = {};
- plugins.forEach(plugin => {
- if (typeof(plugin.eventProperties) !== 'function') return;
- Object.assign(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));
- });
-
- return eventProperties;
- },
- modifyOption(sortable, name, value) {
- let modifiedValue;
- plugins.forEach(plugin => {
- // Plugin must exist on the Sortable
- if (!sortable[plugin.pluginName]) return;
-
- // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin
- if (plugin.optionListeners && typeof(plugin.optionListeners[name]) === 'function') {
- modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);
- }
- });
-
- return modifiedValue;
- }
+ mount(plugin) {
+ // Set default static properties
+ for (let option in defaults) {
+ if (defaults.hasOwnProperty(option) && !(option in plugin)) {
+ plugin[option] = defaults[option];
+ }
+ }
+ plugins.push(plugin);
+ },
+ pluginEvent(eventName, sortable, evt) {
+ this.eventCanceled = false;
+ evt.cancel = () => {
+ this.eventCanceled = true;
+ };
+ const eventNameGlobal = eventName + "Global";
+ plugins.forEach((plugin) => {
+ if (!sortable[plugin.pluginName]) return;
+ // Fire global events if it exists in this sortable
+ if (sortable[plugin.pluginName][eventNameGlobal]) {
+ sortable[plugin.pluginName][eventNameGlobal]({ sortable, ...evt });
+ }
+
+ // Only fire plugin event if plugin is enabled in this sortable,
+ // and plugin has event defined
+ if (
+ sortable.options[plugin.pluginName] &&
+ sortable[plugin.pluginName][eventName]
+ ) {
+ sortable[plugin.pluginName][eventName]({ sortable, ...evt });
+ }
+ });
+ },
+ initializePlugins(sortable, el, defaults, options) {
+ plugins.forEach((plugin) => {
+ const pluginName = plugin.pluginName;
+ if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;
+
+ let initialized = new plugin(sortable, el, sortable.options);
+ initialized.sortable = sortable;
+ initialized.options = sortable.options;
+ sortable[pluginName] = initialized;
+
+ // Add default options from plugin
+ Object.assign(defaults, initialized.defaults);
+ });
+
+ for (let option in sortable.options) {
+ if (!sortable.options.hasOwnProperty(option)) continue;
+ let modified = this.modifyOption(
+ sortable,
+ option,
+ sortable.options[option]
+ );
+ if (typeof modified !== "undefined") {
+ sortable.options[option] = modified;
+ }
+ }
+ },
+ getEventProperties(name, sortable) {
+ let eventProperties = {};
+ plugins.forEach((plugin) => {
+ if (typeof plugin.eventProperties !== "function") return;
+ Object.assign(
+ eventProperties,
+ plugin.eventProperties.call(sortable[plugin.pluginName], name)
+ );
+ });
+
+ return eventProperties;
+ },
+ modifyOption(sortable, name, value) {
+ let modifiedValue;
+ plugins.forEach((plugin) => {
+ // Plugin must exist on the Sortable
+ if (!sortable[plugin.pluginName]) return;
+
+ // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin
+ if (
+ plugin.optionListeners &&
+ typeof plugin.optionListeners[name] === "function"
+ ) {
+ modifiedValue = plugin.optionListeners[name].call(
+ sortable[plugin.pluginName],
+ value
+ );
+ }
+ });
+
+ return modifiedValue;
+ },
};
-function dispatchEvent(
- {
- sortable, rootEl, name,
- targetEl, cloneEl, toEl, fromEl,
- oldIndex, newIndex,
- oldDraggableIndex, newDraggableIndex,
- originalEvent, putSortable, extraEventProperties
- }
-) {
- sortable = (sortable || (rootEl && rootEl[expando]));
- if (!sortable) return;
-
- let evt,
- options = sortable.options,
- onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);
- // Support for new CustomEvent feature
- if (window.CustomEvent && !IE11OrLess && !Edge) {
- evt = new CustomEvent(name, {
- bubbles: true,
- cancelable: true
- });
- } else {
- evt = document.createEvent('Event');
- evt.initEvent(name, true, true);
- }
-
- evt.to = toEl || rootEl;
- evt.from = fromEl || rootEl;
- evt.item = targetEl || rootEl;
- evt.clone = cloneEl;
-
- evt.oldIndex = oldIndex;
- evt.newIndex = newIndex;
-
- evt.oldDraggableIndex = oldDraggableIndex;
- evt.newDraggableIndex = newDraggableIndex;
-
- evt.originalEvent = originalEvent;
- evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
-
- let allEventProperties = { ...extraEventProperties, ...PluginManager.getEventProperties(name, sortable) };
- for (let option in allEventProperties) {
- evt[option] = allEventProperties[option];
- }
-
- if (rootEl) {
- rootEl.dispatchEvent(evt);
- }
-
- if (options[onName]) {
- options[onName].call(sortable, evt);
- }
+function dispatchEvent({
+ sortable,
+ rootEl,
+ name,
+ targetEl,
+ cloneEl,
+ toEl,
+ fromEl,
+ oldIndex,
+ newIndex,
+ oldDraggableIndex,
+ newDraggableIndex,
+ originalEvent,
+ putSortable,
+ extraEventProperties,
+}) {
+ sortable = sortable || (rootEl && rootEl[expando]);
+ if (!sortable) return;
+
+ let evt,
+ options = sortable.options,
+ onName = "on" + name.charAt(0).toUpperCase() + name.substr(1);
+ // Support for new CustomEvent feature
+ if (window.CustomEvent && !IE11OrLess && !Edge) {
+ evt = new CustomEvent(name, {
+ bubbles: true,
+ cancelable: true,
+ });
+ } else {
+ evt = document.createEvent("Event");
+ evt.initEvent(name, true, true);
+ }
+
+ evt.to = toEl || rootEl;
+ evt.from = fromEl || rootEl;
+ evt.item = targetEl || rootEl;
+ evt.clone = cloneEl;
+
+ evt.oldIndex = oldIndex;
+ evt.newIndex = newIndex;
+
+ evt.oldDraggableIndex = oldDraggableIndex;
+ evt.newDraggableIndex = newDraggableIndex;
+
+ evt.originalEvent = originalEvent;
+ evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
+
+ let allEventProperties = {
+ ...extraEventProperties,
+ ...PluginManager.getEventProperties(name, sortable),
+ };
+ for (let option in allEventProperties) {
+ evt[option] = allEventProperties[option];
+ }
+
+ if (rootEl) {
+ rootEl.dispatchEvent(evt);
+ }
+
+ if (options[onName]) {
+ options[onName].call(sortable, evt);
+ }
}
/**!
@@ -1204,6 +1249,14 @@ function Sortable(el, options) {
)}`;
}
+ const __warn =
+ "" +
+ "Importing Sortable directly from GitHub is deprecated.\n" +
+ "This file will not receive any more updates.\n" +
+ "Please follow the usage instructions to continue getting support: https://github.com/SortableJS/Sortable";
+
+ console.warn(__warn);
+
this.el = el; // root element
this.options = options = Object.assign({}, options);
@@ -2924,987 +2977,1092 @@ Sortable.create = function (el, options) {
Sortable.version = version;
let autoScrolls = [],
- scrollEl,
- scrollRootEl,
- scrolling = false,
- lastAutoScrollX,
- lastAutoScrollY,
- touchEvt$1,
- pointerElemChangedInterval;
+ scrollEl,
+ scrollRootEl,
+ scrolling = false,
+ lastAutoScrollX,
+ lastAutoScrollY,
+ touchEvt$1,
+ pointerElemChangedInterval;
function AutoScrollPlugin() {
+ function AutoScroll() {
+ this.defaults = {
+ scroll: true,
+ scrollSensitivity: 30,
+ scrollSpeed: 10,
+ bubbleScroll: true,
+ };
+
+ // Bind all private methods
+ for (let fn in this) {
+ if (fn.charAt(0) === "_" && typeof this[fn] === "function") {
+ this[fn] = this[fn].bind(this);
+ }
+ }
+ }
- function AutoScroll() {
- this.defaults = {
- scroll: true,
- scrollSensitivity: 30,
- scrollSpeed: 10,
- bubbleScroll: true
- };
-
- // Bind all private methods
- for (let fn in this) {
- if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
- this[fn] = this[fn].bind(this);
- }
- }
- }
-
- AutoScroll.prototype = {
- dragStarted({ originalEvent }) {
- if (this.sortable.nativeDraggable) {
- on(document, 'dragover', this._handleAutoScroll);
- } else {
- if (this.options.supportPointer) {
- on(document, 'pointermove', this._handleFallbackAutoScroll);
- } else if (originalEvent.touches) {
- on(document, 'touchmove', this._handleFallbackAutoScroll);
- } else {
- on(document, 'mousemove', this._handleFallbackAutoScroll);
- }
- }
- },
-
- dragOverCompleted({ originalEvent }) {
- // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)
- if (!this.options.dragOverBubble && !originalEvent.rootEl) {
- this._handleAutoScroll(originalEvent);
- }
- },
-
- drop() {
- if (this.sortable.nativeDraggable) {
- off(document, 'dragover', this._handleAutoScroll);
- } else {
- off(document, 'pointermove', this._handleFallbackAutoScroll);
- off(document, 'touchmove', this._handleFallbackAutoScroll);
- off(document, 'mousemove', this._handleFallbackAutoScroll);
- }
-
- clearPointerElemChangedInterval();
- clearAutoScrolls();
- cancelThrottle();
- },
-
- nulling() {
- touchEvt$1 =
- scrollRootEl =
- scrollEl =
- scrolling =
- pointerElemChangedInterval =
- lastAutoScrollX =
- lastAutoScrollY = null;
-
- autoScrolls.length = 0;
- },
-
- _handleFallbackAutoScroll(evt) {
- this._handleAutoScroll(evt, true);
- },
-
- _handleAutoScroll(evt, fallback) {
- const x = (evt.touches ? evt.touches[0] : evt).clientX,
- y = (evt.touches ? evt.touches[0] : evt).clientY,
-
- elem = document.elementFromPoint(x, y);
-
- touchEvt$1 = evt;
-
- // IE does not seem to have native autoscroll,
- // Edge's autoscroll seems too conditional,
- // MACOS Safari does not have autoscroll,
- // Firefox and Chrome are good
- if (fallback || Edge || IE11OrLess || Safari) {
- autoScroll(evt, this.options, elem, fallback);
-
- // Listener for pointer element change
- let ogElemScroller = getParentAutoScrollElement(elem, true);
- if (
- scrolling &&
- (
- !pointerElemChangedInterval ||
- x !== lastAutoScrollX ||
- y !== lastAutoScrollY
- )
- ) {
- pointerElemChangedInterval && clearPointerElemChangedInterval();
- // Detect for pointer elem change, emulating native DnD behaviour
- pointerElemChangedInterval = setInterval(() => {
- let newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);
- if (newElem !== ogElemScroller) {
- ogElemScroller = newElem;
- clearAutoScrolls();
- }
- autoScroll(evt, this.options, newElem, fallback);
- }, 10);
- lastAutoScrollX = x;
- lastAutoScrollY = y;
- }
- } else {
- // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll
- if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {
- clearAutoScrolls();
- return;
- }
- autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);
- }
- }
- };
-
- return Object.assign(AutoScroll, {
- pluginName: 'scroll',
- initializeByDefault: true
- });
-}
+ AutoScroll.prototype = {
+ dragStarted({ originalEvent }) {
+ if (this.sortable.nativeDraggable) {
+ on(document, "dragover", this._handleAutoScroll);
+ } else {
+ if (this.options.supportPointer) {
+ on(document, "pointermove", this._handleFallbackAutoScroll);
+ } else if (originalEvent.touches) {
+ on(document, "touchmove", this._handleFallbackAutoScroll);
+ } else {
+ on(document, "mousemove", this._handleFallbackAutoScroll);
+ }
+ }
+ },
-function clearAutoScrolls() {
- autoScrolls.forEach(function(autoScroll) {
- clearInterval(autoScroll.pid);
- });
- autoScrolls = [];
-}
+ dragOverCompleted({ originalEvent }) {
+ // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)
+ if (!this.options.dragOverBubble && !originalEvent.rootEl) {
+ this._handleAutoScroll(originalEvent);
+ }
+ },
-function clearPointerElemChangedInterval() {
- clearInterval(pointerElemChangedInterval);
-}
+ drop() {
+ if (this.sortable.nativeDraggable) {
+ off(document, "dragover", this._handleAutoScroll);
+ } else {
+ off(document, "pointermove", this._handleFallbackAutoScroll);
+ off(document, "touchmove", this._handleFallbackAutoScroll);
+ off(document, "mousemove", this._handleFallbackAutoScroll);
+ }
+ clearPointerElemChangedInterval();
+ clearAutoScrolls();
+ cancelThrottle();
+ },
-const autoScroll = throttle(function(evt, options, rootEl, isFallback) {
- // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
- if (!options.scroll) return;
- const x = (evt.touches ? evt.touches[0] : evt).clientX,
- y = (evt.touches ? evt.touches[0] : evt).clientY,
- sens = options.scrollSensitivity,
- speed = options.scrollSpeed,
- winScroller = getWindowScrollingElement();
-
- let scrollThisInstance = false,
- scrollCustomFn;
-
- // New scroll root, set scrollEl
- if (scrollRootEl !== rootEl) {
- scrollRootEl = rootEl;
-
- clearAutoScrolls();
-
- scrollEl = options.scroll;
- scrollCustomFn = options.scrollFn;
-
- if (scrollEl === true) {
- scrollEl = getParentAutoScrollElement(rootEl, true);
- }
- }
-
-
- let layersOut = 0;
- let currentParent = scrollEl;
- do {
- let el = currentParent,
- rect = getRect(el),
-
- top = rect.top,
- bottom = rect.bottom,
- left = rect.left,
- right = rect.right,
-
- width = rect.width,
- height = rect.height,
-
- canScrollX,
- canScrollY,
-
- scrollWidth = el.scrollWidth,
- scrollHeight = el.scrollHeight,
-
- elCSS = css(el),
-
- scrollPosX = el.scrollLeft,
- scrollPosY = el.scrollTop;
-
-
- if (el === winScroller) {
- canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');
- canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');
- } else {
- canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');
- canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');
- }
-
- let vx = canScrollX && (Math.abs(right - x) <= sens && (scrollPosX + width) < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);
- let vy = canScrollY && (Math.abs(bottom - y) <= sens && (scrollPosY + height) < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);
-
-
- if (!autoScrolls[layersOut]) {
- for (let i = 0; i <= layersOut; i++) {
- if (!autoScrolls[i]) {
- autoScrolls[i] = {};
- }
- }
- }
-
- if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {
- autoScrolls[layersOut].el = el;
- autoScrolls[layersOut].vx = vx;
- autoScrolls[layersOut].vy = vy;
-
- clearInterval(autoScrolls[layersOut].pid);
-
- if (vx != 0 || vy != 0) {
- scrollThisInstance = true;
- /* jshint loopfunc:true */
- autoScrolls[layersOut].pid = setInterval((function () {
- // emulate drag over during autoscroll (fallback), emulating native DnD behaviour
- if (isFallback && this.layer === 0) {
- Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely
- }
- let scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;
- let scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;
-
- if (typeof(scrollCustomFn) === 'function') {
- if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {
- return;
- }
- }
-
- scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);
- }).bind({layer: layersOut}), 24);
- }
- }
- layersOut++;
- } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));
- scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not
-}, 30);
+ nulling() {
+ touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;
-const drop = function({
- originalEvent,
- putSortable,
- dragEl,
- activeSortable,
- dispatchSortableEvent,
- hideGhostForTarget,
- unhideGhostForTarget
-}) {
- if (!originalEvent) return;
- let toSortable = putSortable || activeSortable;
- hideGhostForTarget();
- let touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;
- let target = document.elementFromPoint(touch.clientX, touch.clientY);
- unhideGhostForTarget();
- if (toSortable && !toSortable.el.contains(target)) {
- dispatchSortableEvent('spill');
- this.onSpill({ dragEl, putSortable });
- }
-};
+ autoScrolls.length = 0;
+ },
-function Revert() {}
+ _handleFallbackAutoScroll(evt) {
+ this._handleAutoScroll(evt, true);
+ },
+
+ _handleAutoScroll(evt, fallback) {
+ const x = (evt.touches ? evt.touches[0] : evt).clientX,
+ y = (evt.touches ? evt.touches[0] : evt).clientY,
+ elem = document.elementFromPoint(x, y);
+
+ touchEvt$1 = evt;
+
+ // IE does not seem to have native autoscroll,
+ // Edge's autoscroll seems too conditional,
+ // MACOS Safari does not have autoscroll,
+ // Firefox and Chrome are good
+ if (fallback || Edge || IE11OrLess || Safari) {
+ autoScroll(evt, this.options, elem, fallback);
+
+ // Listener for pointer element change
+ let ogElemScroller = getParentAutoScrollElement(elem, true);
+ if (
+ scrolling &&
+ (!pointerElemChangedInterval ||
+ x !== lastAutoScrollX ||
+ y !== lastAutoScrollY)
+ ) {
+ pointerElemChangedInterval && clearPointerElemChangedInterval();
+ // Detect for pointer elem change, emulating native DnD behaviour
+ pointerElemChangedInterval = setInterval(() => {
+ let newElem = getParentAutoScrollElement(
+ document.elementFromPoint(x, y),
+ true
+ );
+ if (newElem !== ogElemScroller) {
+ ogElemScroller = newElem;
+ clearAutoScrolls();
+ }
+ autoScroll(evt, this.options, newElem, fallback);
+ }, 10);
+ lastAutoScrollX = x;
+ lastAutoScrollY = y;
+ }
+ } else {
+ // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll
+ if (
+ !this.options.bubbleScroll ||
+ getParentAutoScrollElement(elem, true) === getWindowScrollingElement()
+ ) {
+ clearAutoScrolls();
+ return;
+ }
+ autoScroll(
+ evt,
+ this.options,
+ getParentAutoScrollElement(elem, false),
+ false
+ );
+ }
+ },
+ };
+
+ return Object.assign(AutoScroll, {
+ pluginName: "scroll",
+ initializeByDefault: true,
+ });
+}
+
+function clearAutoScrolls() {
+ autoScrolls.forEach(function (autoScroll) {
+ clearInterval(autoScroll.pid);
+ });
+ autoScrolls = [];
+}
+
+function clearPointerElemChangedInterval() {
+ clearInterval(pointerElemChangedInterval);
+}
+
+const autoScroll = throttle(function (evt, options, rootEl, isFallback) {
+ // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
+ if (!options.scroll) return;
+ const x = (evt.touches ? evt.touches[0] : evt).clientX,
+ y = (evt.touches ? evt.touches[0] : evt).clientY,
+ sens = options.scrollSensitivity,
+ speed = options.scrollSpeed,
+ winScroller = getWindowScrollingElement();
+
+ let scrollThisInstance = false,
+ scrollCustomFn;
+
+ // New scroll root, set scrollEl
+ if (scrollRootEl !== rootEl) {
+ scrollRootEl = rootEl;
+
+ clearAutoScrolls();
+
+ scrollEl = options.scroll;
+ scrollCustomFn = options.scrollFn;
+
+ if (scrollEl === true) {
+ scrollEl = getParentAutoScrollElement(rootEl, true);
+ }
+ }
+
+ let layersOut = 0;
+ let currentParent = scrollEl;
+ do {
+ let el = currentParent,
+ rect = getRect(el),
+ top = rect.top,
+ bottom = rect.bottom,
+ left = rect.left,
+ right = rect.right,
+ width = rect.width,
+ height = rect.height,
+ canScrollX,
+ canScrollY,
+ scrollWidth = el.scrollWidth,
+ scrollHeight = el.scrollHeight,
+ elCSS = css(el),
+ scrollPosX = el.scrollLeft,
+ scrollPosY = el.scrollTop;
+
+ if (el === winScroller) {
+ canScrollX =
+ width < scrollWidth &&
+ (elCSS.overflowX === "auto" ||
+ elCSS.overflowX === "scroll" ||
+ elCSS.overflowX === "visible");
+ canScrollY =
+ height < scrollHeight &&
+ (elCSS.overflowY === "auto" ||
+ elCSS.overflowY === "scroll" ||
+ elCSS.overflowY === "visible");
+ } else {
+ canScrollX =
+ width < scrollWidth &&
+ (elCSS.overflowX === "auto" || elCSS.overflowX === "scroll");
+ canScrollY =
+ height < scrollHeight &&
+ (elCSS.overflowY === "auto" || elCSS.overflowY === "scroll");
+ }
+
+ let vx =
+ canScrollX &&
+ (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) -
+ (Math.abs(left - x) <= sens && !!scrollPosX);
+ let vy =
+ canScrollY &&
+ (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) -
+ (Math.abs(top - y) <= sens && !!scrollPosY);
+
+ if (!autoScrolls[layersOut]) {
+ for (let i = 0; i <= layersOut; i++) {
+ if (!autoScrolls[i]) {
+ autoScrolls[i] = {};
+ }
+ }
+ }
+
+ if (
+ autoScrolls[layersOut].vx != vx ||
+ autoScrolls[layersOut].vy != vy ||
+ autoScrolls[layersOut].el !== el
+ ) {
+ autoScrolls[layersOut].el = el;
+ autoScrolls[layersOut].vx = vx;
+ autoScrolls[layersOut].vy = vy;
+
+ clearInterval(autoScrolls[layersOut].pid);
+
+ if (vx != 0 || vy != 0) {
+ scrollThisInstance = true;
+ /* jshint loopfunc:true */
+ autoScrolls[layersOut].pid = setInterval(
+ function () {
+ // emulate drag over during autoscroll (fallback), emulating native DnD behaviour
+ if (isFallback && this.layer === 0) {
+ Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely
+ }
+ let scrollOffsetY = autoScrolls[this.layer].vy
+ ? autoScrolls[this.layer].vy * speed
+ : 0;
+ let scrollOffsetX = autoScrolls[this.layer].vx
+ ? autoScrolls[this.layer].vx * speed
+ : 0;
+
+ if (typeof scrollCustomFn === "function") {
+ if (
+ scrollCustomFn.call(
+ Sortable.dragged.parentNode[expando],
+ scrollOffsetX,
+ scrollOffsetY,
+ evt,
+ touchEvt$1,
+ autoScrolls[this.layer].el
+ ) !== "continue"
+ ) {
+ return;
+ }
+ }
+
+ scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);
+ }.bind({ layer: layersOut }),
+ 24
+ );
+ }
+ }
+ layersOut++;
+ } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));
+ scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not
+}, 30);
+
+const drop = function ({
+ originalEvent,
+ putSortable,
+ dragEl,
+ activeSortable,
+ dispatchSortableEvent,
+ hideGhostForTarget,
+ unhideGhostForTarget,
+}) {
+ if (!originalEvent) return;
+ let toSortable = putSortable || activeSortable;
+ hideGhostForTarget();
+ let touch =
+ originalEvent.changedTouches && originalEvent.changedTouches.length
+ ? originalEvent.changedTouches[0]
+ : originalEvent;
+ let target = document.elementFromPoint(touch.clientX, touch.clientY);
+ unhideGhostForTarget();
+ if (toSortable && !toSortable.el.contains(target)) {
+ dispatchSortableEvent("spill");
+ this.onSpill({ dragEl, putSortable });
+ }
+};
+
+function Revert() {}
Revert.prototype = {
- startIndex: null,
- dragStart({ oldDraggableIndex }) {
- this.startIndex = oldDraggableIndex;
- },
- onSpill({ dragEl, putSortable }) {
- this.sortable.captureAnimationState();
- if (putSortable) {
- putSortable.captureAnimationState();
- }
- let nextSibling = getChild(this.sortable.el, this.startIndex, this.options);
-
- if (nextSibling) {
- this.sortable.el.insertBefore(dragEl, nextSibling);
- } else {
- this.sortable.el.appendChild(dragEl);
- }
- this.sortable.animateAll();
- if (putSortable) {
- putSortable.animateAll();
- }
- },
- drop
+ startIndex: null,
+ dragStart({ oldDraggableIndex }) {
+ this.startIndex = oldDraggableIndex;
+ },
+ onSpill({ dragEl, putSortable }) {
+ this.sortable.captureAnimationState();
+ if (putSortable) {
+ putSortable.captureAnimationState();
+ }
+ let nextSibling = getChild(this.sortable.el, this.startIndex, this.options);
+
+ if (nextSibling) {
+ this.sortable.el.insertBefore(dragEl, nextSibling);
+ } else {
+ this.sortable.el.appendChild(dragEl);
+ }
+ this.sortable.animateAll();
+ if (putSortable) {
+ putSortable.animateAll();
+ }
+ },
+ drop,
};
Object.assign(Revert, {
- pluginName: 'revertOnSpill'
+ pluginName: "revertOnSpill",
});
-
function Remove() {}
Remove.prototype = {
- onSpill({ dragEl, putSortable }) {
- const parentSortable = putSortable || this.sortable;
- parentSortable.captureAnimationState();
- dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);
- parentSortable.animateAll();
- },
- drop
+ onSpill({ dragEl, putSortable }) {
+ const parentSortable = putSortable || this.sortable;
+ parentSortable.captureAnimationState();
+ dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);
+ parentSortable.animateAll();
+ },
+ drop,
};
Object.assign(Remove, {
- pluginName: 'removeOnSpill'
+ pluginName: "removeOnSpill",
});
-
var OnSpill = [Remove, Revert];
let lastSwapEl;
-
function SwapPlugin() {
- function Swap() {
- this.defaults = {
- swapClass: 'sortable-swap-highlight'
- };
- }
-
- Swap.prototype = {
- dragStart({ dragEl }) {
- lastSwapEl = dragEl;
- },
- dragOverValid({ completed, target, onMove, activeSortable, changed, cancel }) {
- if (!activeSortable.options.swap) return;
- let el = this.sortable.el,
- options = this.options;
- if (target && target !== el) {
- let prevSwapEl = lastSwapEl;
- if (onMove(target) !== false) {
- toggleClass(target, options.swapClass, true);
- lastSwapEl = target;
- } else {
- lastSwapEl = null;
- }
-
- if (prevSwapEl && prevSwapEl !== lastSwapEl) {
- toggleClass(prevSwapEl, options.swapClass, false);
- }
- }
- changed();
-
- completed(true);
- cancel();
- },
- drop({ activeSortable, putSortable, dragEl }) {
- let toSortable = (putSortable || this.sortable);
- let options = this.options;
- lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);
- if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {
- if (dragEl !== lastSwapEl) {
- toSortable.captureAnimationState();
- if (toSortable !== activeSortable) activeSortable.captureAnimationState();
- swapNodes(dragEl, lastSwapEl);
-
- toSortable.animateAll();
- if (toSortable !== activeSortable) activeSortable.animateAll();
- }
- }
- },
- nulling() {
- lastSwapEl = null;
- }
- };
-
- return Object.assign(Swap, {
- pluginName: 'swap',
- eventProperties() {
- return {
- swapItem: lastSwapEl
- };
- }
- });
-}
+ function Swap() {
+ this.defaults = {
+ swapClass: "sortable-swap-highlight",
+ };
+ }
+
+ Swap.prototype = {
+ dragStart({ dragEl }) {
+ lastSwapEl = dragEl;
+ },
+ dragOverValid({
+ completed,
+ target,
+ onMove,
+ activeSortable,
+ changed,
+ cancel,
+ }) {
+ if (!activeSortable.options.swap) return;
+ let el = this.sortable.el,
+ options = this.options;
+ if (target && target !== el) {
+ let prevSwapEl = lastSwapEl;
+ if (onMove(target) !== false) {
+ toggleClass(target, options.swapClass, true);
+ lastSwapEl = target;
+ } else {
+ lastSwapEl = null;
+ }
+
+ if (prevSwapEl && prevSwapEl !== lastSwapEl) {
+ toggleClass(prevSwapEl, options.swapClass, false);
+ }
+ }
+ changed();
+ completed(true);
+ cancel();
+ },
+ drop({ activeSortable, putSortable, dragEl }) {
+ let toSortable = putSortable || this.sortable;
+ let options = this.options;
+ lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);
+ if (
+ lastSwapEl &&
+ (options.swap || (putSortable && putSortable.options.swap))
+ ) {
+ if (dragEl !== lastSwapEl) {
+ toSortable.captureAnimationState();
+ if (toSortable !== activeSortable)
+ activeSortable.captureAnimationState();
+ swapNodes(dragEl, lastSwapEl);
+
+ toSortable.animateAll();
+ if (toSortable !== activeSortable) activeSortable.animateAll();
+ }
+ }
+ },
+ nulling() {
+ lastSwapEl = null;
+ },
+ };
+
+ return Object.assign(Swap, {
+ pluginName: "swap",
+ eventProperties() {
+ return {
+ swapItem: lastSwapEl,
+ };
+ },
+ });
+}
function swapNodes(n1, n2) {
- let p1 = n1.parentNode,
- p2 = n2.parentNode,
- i1, i2;
+ let p1 = n1.parentNode,
+ p2 = n2.parentNode,
+ i1,
+ i2;
- if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;
+ if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;
- i1 = index(n1);
- i2 = index(n2);
+ i1 = index(n1);
+ i2 = index(n2);
- if (p1.isEqualNode(p2) && i1 < i2) {
- i2++;
- }
- p1.insertBefore(n2, p1.children[i1]);
- p2.insertBefore(n1, p2.children[i2]);
+ if (p1.isEqualNode(p2) && i1 < i2) {
+ i2++;
+ }
+ p1.insertBefore(n2, p1.children[i1]);
+ p2.insertBefore(n1, p2.children[i2]);
}
let multiDragElements = [],
- multiDragClones = [],
- lastMultiDragSelect, // for selection with modifier key down (SHIFT)
- multiDragSortable,
- initialFolding = false, // Initial multi-drag fold when drag started
- folding = false, // Folding any other time
- dragStarted = false,
- dragEl$1,
- clonesFromRect,
- clonesHidden;
+ multiDragClones = [],
+ lastMultiDragSelect, // for selection with modifier key down (SHIFT)
+ multiDragSortable,
+ initialFolding = false, // Initial multi-drag fold when drag started
+ folding = false, // Folding any other time
+ dragStarted = false,
+ dragEl$1,
+ clonesFromRect,
+ clonesHidden;
function MultiDragPlugin() {
- function MultiDrag(sortable) {
- // Bind all private methods
- for (let fn in this) {
- if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
- this[fn] = this[fn].bind(this);
- }
- }
-
- if (sortable.options.supportPointer) {
- on(document, 'pointerup', this._deselectMultiDrag);
- } else {
- on(document, 'mouseup', this._deselectMultiDrag);
- on(document, 'touchend', this._deselectMultiDrag);
- }
-
- on(document, 'keydown', this._checkKeyDown);
- on(document, 'keyup', this._checkKeyUp);
-
- this.defaults = {
- selectedClass: 'sortable-selected',
- multiDragKey: null,
- setData(dataTransfer, dragEl) {
- let data = '';
- if (multiDragElements.length && multiDragSortable === sortable) {
- multiDragElements.forEach((multiDragElement, i) => {
- data += (!i ? '' : ', ') + multiDragElement.textContent;
- });
- } else {
- data = dragEl.textContent;
- }
- dataTransfer.setData('Text', data);
- }
- };
- }
-
- MultiDrag.prototype = {
- multiDragKeyDown: false,
- isMultiDrag: false,
-
-
- delayStartGlobal({ dragEl: dragged }) {
- dragEl$1 = dragged;
- },
-
- delayEnded() {
- this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);
- },
-
- setupClone({ sortable, cancel }) {
- if (!this.isMultiDrag) return;
- for (let i = 0; i < multiDragElements.length; i++) {
- multiDragClones.push(clone(multiDragElements[i]));
-
- multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;
-
- multiDragClones[i].draggable = false;
- multiDragClones[i].style['will-change'] = '';
-
- toggleClass(multiDragClones[i], this.options.selectedClass, false);
- multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);
- }
-
- sortable._hideClone();
- cancel();
- },
-
- clone({ sortable, rootEl, dispatchSortableEvent, cancel }) {
- if (!this.isMultiDrag) return;
- if (!this.options.removeCloneOnHide) {
- if (multiDragElements.length && multiDragSortable === sortable) {
- insertMultiDragClones(true, rootEl);
- dispatchSortableEvent('clone');
-
- cancel();
- }
- }
- },
-
- showClone({ cloneNowShown, rootEl, cancel }) {
- if (!this.isMultiDrag) return;
- insertMultiDragClones(false, rootEl);
- multiDragClones.forEach(clone => {
- css(clone, 'display', '');
- });
-
- cloneNowShown();
- clonesHidden = false;
- cancel();
- },
-
- hideClone({ sortable, cloneNowHidden, cancel }) {
- if (!this.isMultiDrag) return;
- multiDragClones.forEach(clone => {
- css(clone, 'display', 'none');
- if (this.options.removeCloneOnHide && clone.parentNode) {
- clone.parentNode.removeChild(clone);
- }
- });
-
- cloneNowHidden();
- clonesHidden = true;
- cancel();
- },
-
- dragStartGlobal({ sortable }) {
- if (!this.isMultiDrag && multiDragSortable) {
- multiDragSortable.multiDrag._deselectMultiDrag();
- }
-
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.sortableIndex = index(multiDragElement);
- });
-
- // Sort multi-drag elements
- multiDragElements = multiDragElements.sort(function(a, b) {
- return a.sortableIndex - b.sortableIndex;
- });
- dragStarted = true;
- },
-
- dragStarted({ sortable }) {
- if (!this.isMultiDrag) return;
- if (this.options.sort) {
- // Capture rects,
- // hide multi drag elements (by positioning them absolute),
- // set multi drag elements rects to dragRect,
- // show multi drag elements,
- // animate to rects,
- // unset rects & remove from DOM
-
- sortable.captureAnimationState();
-
- if (this.options.animation) {
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- css(multiDragElement, 'position', 'absolute');
- });
-
- let dragRect = getRect(dragEl$1, false, true, true);
-
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- setRect(multiDragElement, dragRect);
- });
-
- folding = true;
- initialFolding = true;
- }
- }
-
- sortable.animateAll(() => {
- folding = false;
- initialFolding = false;
-
- if (this.options.animation) {
- multiDragElements.forEach(multiDragElement => {
- unsetRect(multiDragElement);
- });
- }
-
- // Remove all auxiliary multidrag items from el, if sorting enabled
- if (this.options.sort) {
- removeMultiDragElements();
- }
- });
- },
-
- dragOver({ target, completed, cancel }) {
- if (folding && ~multiDragElements.indexOf(target)) {
- completed(false);
- cancel();
- }
- },
-
- revert({ fromSortable, rootEl, sortable, dragRect }) {
- if (multiDragElements.length > 1) {
- // Setup unfold animation
- multiDragElements.forEach(multiDragElement => {
- sortable.addAnimationState({
- target: multiDragElement,
- rect: folding ? getRect(multiDragElement) : dragRect
- });
-
- unsetRect(multiDragElement);
-
- multiDragElement.fromRect = dragRect;
-
- fromSortable.removeAnimationState(multiDragElement);
- });
- folding = false;
- insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);
- }
- },
-
- dragOverCompleted({ sortable, isOwner, insertion, activeSortable, parentEl, putSortable }) {
- let options = this.options;
- if (insertion) {
- // Clones must be hidden before folding animation to capture dragRectAbsolute properly
- if (isOwner) {
- activeSortable._hideClone();
- }
-
- initialFolding = false;
- // If leaving sort:false root, or already folding - Fold to new location
- if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {
- // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible
- let dragRectAbsolute = getRect(dragEl$1, false, true, true);
-
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- setRect(multiDragElement, dragRectAbsolute);
-
- // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted
- // while folding, and so that we can capture them again because old sortable will no longer be fromSortable
- parentEl.appendChild(multiDragElement);
- });
-
- folding = true;
- }
-
- // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out
- if (!isOwner) {
- // Only remove if not folding (folding will remove them anyways)
- if (!folding) {
- removeMultiDragElements();
- }
-
- if (multiDragElements.length > 1) {
- let clonesHiddenBefore = clonesHidden;
- activeSortable._showClone(sortable);
-
- // Unfold animation for clones if showing from hidden
- if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {
- multiDragClones.forEach(clone => {
- activeSortable.addAnimationState({
- target: clone,
- rect: clonesFromRect
- });
-
- clone.fromRect = clonesFromRect;
- clone.thisAnimationDuration = null;
- });
- }
- } else {
- activeSortable._showClone(sortable);
- }
- }
- }
- },
-
- dragOverAnimationCapture({ dragRect, isOwner, activeSortable }) {
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.thisAnimationDuration = null;
- });
-
- if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {
- clonesFromRect = Object.assign({}, dragRect);
- let dragMatrix = matrix(dragEl$1, true);
- clonesFromRect.top -= dragMatrix.f;
- clonesFromRect.left -= dragMatrix.e;
- }
- },
-
- dragOverAnimationComplete() {
- if (folding) {
- folding = false;
- removeMultiDragElements();
- }
- },
-
- drop({ originalEvent: evt, rootEl, parentEl, sortable, dispatchSortableEvent, oldIndex, putSortable }) {
- let toSortable = (putSortable || this.sortable);
-
- if (!evt) return;
-
- let options = this.options,
- children = parentEl.children;
-
- // Multi-drag selection
- if (!dragStarted) {
- if (options.multiDragKey && !this.multiDragKeyDown) {
- this._deselectMultiDrag();
- }
- toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));
-
- if (!~multiDragElements.indexOf(dragEl$1)) {
- multiDragElements.push(dragEl$1);
- dispatchEvent({
- sortable,
- rootEl,
- name: 'select',
- targetEl: dragEl$1,
- originalEvt: evt
- });
-
- // Modifier activated, select from last to dragEl
- if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {
- let lastIndex = index(lastMultiDragSelect),
- currentIndex = index(dragEl$1);
-
- if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {
- // Must include lastMultiDragSelect (select it), in case modified selection from no selection
- // (but previous selection existed)
- let n, i;
- if (currentIndex > lastIndex) {
- i = lastIndex;
- n = currentIndex;
- } else {
- i = currentIndex;
- n = lastIndex + 1;
- }
-
- for (; i < n; i++) {
- if (~multiDragElements.indexOf(children[i])) continue;
- toggleClass(children[i], options.selectedClass, true);
- multiDragElements.push(children[i]);
-
- dispatchEvent({
- sortable,
- rootEl,
- name: 'select',
- targetEl: children[i],
- originalEvt: evt
- });
- }
- }
- } else {
- lastMultiDragSelect = dragEl$1;
- }
-
- multiDragSortable = toSortable;
- } else {
- multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);
- lastMultiDragSelect = null;
- dispatchEvent({
- sortable,
- rootEl,
- name: 'deselect',
- targetEl: dragEl$1,
- originalEvt: evt
- });
- }
- }
-
- // Multi-drag drop
- if (dragStarted && this.isMultiDrag) {
- // Do not "unfold" after around dragEl if reverted
- if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {
- let dragRect = getRect(dragEl$1),
- multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');
-
- if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;
-
- toSortable.captureAnimationState();
-
- if (!initialFolding) {
- if (options.animation) {
- dragEl$1.fromRect = dragRect;
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.thisAnimationDuration = null;
- if (multiDragElement !== dragEl$1) {
- let rect = folding ? getRect(multiDragElement) : dragRect;
- multiDragElement.fromRect = rect;
-
- // Prepare unfold animation
- toSortable.addAnimationState({
- target: multiDragElement,
- rect: rect
- });
- }
- });
- }
-
- // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert
- // properly they must all be removed
- removeMultiDragElements();
-
- multiDragElements.forEach(multiDragElement => {
- if (children[multiDragIndex]) {
- parentEl.insertBefore(multiDragElement, children[multiDragIndex]);
- } else {
- parentEl.appendChild(multiDragElement);
- }
- multiDragIndex++;
- });
-
- // If initial folding is done, the elements may have changed position because they are now
- // unfolding around dragEl, even though dragEl may not have his index changed, so update event
- // must be fired here as Sortable will not.
- if (oldIndex === index(dragEl$1)) {
- let update = false;
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement.sortableIndex !== index(multiDragElement)) {
- update = true;
- return;
- }
- });
-
- if (update) {
- dispatchSortableEvent('update');
- }
- }
- }
-
- // Must be done after capturing individual rects (scroll bar)
- multiDragElements.forEach(multiDragElement => {
- unsetRect(multiDragElement);
- });
-
- toSortable.animateAll();
- }
-
- multiDragSortable = toSortable;
- }
-
- // Remove clones if necessary
- if (rootEl === parentEl || (putSortable && putSortable.lastPutMode !== 'clone')) {
- multiDragClones.forEach(clone => {
- clone.parentNode && clone.parentNode.removeChild(clone);
- });
- }
- },
-
- nullingGlobal() {
- this.isMultiDrag =
- dragStarted = false;
- multiDragClones.length = 0;
- },
-
- destroyGlobal() {
- this._deselectMultiDrag();
- off(document, 'pointerup', this._deselectMultiDrag);
- off(document, 'mouseup', this._deselectMultiDrag);
- off(document, 'touchend', this._deselectMultiDrag);
-
- off(document, 'keydown', this._checkKeyDown);
- off(document, 'keyup', this._checkKeyUp);
- },
-
- _deselectMultiDrag(evt) {
- if (typeof dragStarted !== "undefined" && dragStarted) return;
-
- // Only deselect if selection is in this sortable
- if (multiDragSortable !== this.sortable) return;
-
- // Only deselect if target is not item in this sortable
- if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;
-
- // Only deselect if left click
- if (evt && evt.button !== 0) return;
-
- while (multiDragElements.length) {
- let el = multiDragElements[0];
- toggleClass(el, this.options.selectedClass, false);
- multiDragElements.shift();
- dispatchEvent({
- sortable: this.sortable,
- rootEl: this.sortable.el,
- name: 'deselect',
- targetEl: el,
- originalEvt: evt
- });
- }
- },
-
- _checkKeyDown(evt) {
- if (evt.key === this.options.multiDragKey) {
- this.multiDragKeyDown = true;
- }
- },
-
- _checkKeyUp(evt) {
- if (evt.key === this.options.multiDragKey) {
- this.multiDragKeyDown = false;
- }
- }
- };
-
- return Object.assign(MultiDrag, {
- // Static methods & properties
- pluginName: 'multiDrag',
- utils: {
- /**
- * Selects the provided multi-drag item
- * @param {HTMLElement} el The element to be selected
- */
- select(el) {
- let sortable = el.parentNode[expando];
- if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;
- if (multiDragSortable && multiDragSortable !== sortable) {
- multiDragSortable.multiDrag._deselectMultiDrag();
- multiDragSortable = sortable;
- }
- toggleClass(el, sortable.options.selectedClass, true);
- multiDragElements.push(el);
- },
- /**
- * Deselects the provided multi-drag item
- * @param {HTMLElement} el The element to be deselected
- */
- deselect(el) {
- let sortable = el.parentNode[expando],
- index = multiDragElements.indexOf(el);
- if (!sortable || !sortable.options.multiDrag || !~index) return;
- toggleClass(el, sortable.options.selectedClass, false);
- multiDragElements.splice(index, 1);
- }
- },
- eventProperties() {
- const oldIndicies = [],
- newIndicies = [];
-
- multiDragElements.forEach(multiDragElement => {
- oldIndicies.push({
- multiDragElement,
- index: multiDragElement.sortableIndex
- });
-
- // multiDragElements will already be sorted if folding
- let newIndex;
- if (folding && multiDragElement !== dragEl$1) {
- newIndex = -1;
- } else if (folding) {
- newIndex = index(multiDragElement, ':not(.' + this.options.selectedClass + ')');
- } else {
- newIndex = index(multiDragElement);
- }
- newIndicies.push({
- multiDragElement,
- index: newIndex
- });
- });
- return {
- items: [...multiDragElements],
- clones: [...multiDragClones],
- oldIndicies,
- newIndicies
- };
- },
- optionListeners: {
- multiDragKey(key) {
- key = key.toLowerCase();
- if (key === 'ctrl') {
- key = 'Control';
- } else if (key.length > 1) {
- key = key.charAt(0).toUpperCase() + key.substr(1);
- }
- return key;
- }
- }
- });
+ function MultiDrag(sortable) {
+ // Bind all private methods
+ for (let fn in this) {
+ if (fn.charAt(0) === "_" && typeof this[fn] === "function") {
+ this[fn] = this[fn].bind(this);
+ }
+ }
+
+ if (sortable.options.supportPointer) {
+ on(document, "pointerup", this._deselectMultiDrag);
+ } else {
+ on(document, "mouseup", this._deselectMultiDrag);
+ on(document, "touchend", this._deselectMultiDrag);
+ }
+
+ on(document, "keydown", this._checkKeyDown);
+ on(document, "keyup", this._checkKeyUp);
+
+ this.defaults = {
+ selectedClass: "sortable-selected",
+ multiDragKey: null,
+ setData(dataTransfer, dragEl) {
+ let data = "";
+ if (multiDragElements.length && multiDragSortable === sortable) {
+ multiDragElements.forEach((multiDragElement, i) => {
+ data += (!i ? "" : ", ") + multiDragElement.textContent;
+ });
+ } else {
+ data = dragEl.textContent;
+ }
+ dataTransfer.setData("Text", data);
+ },
+ };
+ }
+
+ MultiDrag.prototype = {
+ multiDragKeyDown: false,
+ isMultiDrag: false,
+
+ delayStartGlobal({ dragEl: dragged }) {
+ dragEl$1 = dragged;
+ },
+
+ delayEnded() {
+ this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);
+ },
+
+ setupClone({ sortable, cancel }) {
+ if (!this.isMultiDrag) return;
+ for (let i = 0; i < multiDragElements.length; i++) {
+ multiDragClones.push(clone(multiDragElements[i]));
+
+ multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;
+
+ multiDragClones[i].draggable = false;
+ multiDragClones[i].style["will-change"] = "";
+
+ toggleClass(multiDragClones[i], this.options.selectedClass, false);
+ multiDragElements[i] === dragEl$1 &&
+ toggleClass(multiDragClones[i], this.options.chosenClass, false);
+ }
+
+ sortable._hideClone();
+ cancel();
+ },
+
+ clone({ sortable, rootEl, dispatchSortableEvent, cancel }) {
+ if (!this.isMultiDrag) return;
+ if (!this.options.removeCloneOnHide) {
+ if (multiDragElements.length && multiDragSortable === sortable) {
+ insertMultiDragClones(true, rootEl);
+ dispatchSortableEvent("clone");
+
+ cancel();
+ }
+ }
+ },
+
+ showClone({ cloneNowShown, rootEl, cancel }) {
+ if (!this.isMultiDrag) return;
+ insertMultiDragClones(false, rootEl);
+ multiDragClones.forEach((clone) => {
+ css(clone, "display", "");
+ });
+
+ cloneNowShown();
+ clonesHidden = false;
+ cancel();
+ },
+
+ hideClone({ sortable, cloneNowHidden, cancel }) {
+ if (!this.isMultiDrag) return;
+ multiDragClones.forEach((clone) => {
+ css(clone, "display", "none");
+ if (this.options.removeCloneOnHide && clone.parentNode) {
+ clone.parentNode.removeChild(clone);
+ }
+ });
+
+ cloneNowHidden();
+ clonesHidden = true;
+ cancel();
+ },
+
+ dragStartGlobal({ sortable }) {
+ if (!this.isMultiDrag && multiDragSortable) {
+ multiDragSortable.multiDrag._deselectMultiDrag();
+ }
+
+ multiDragElements.forEach((multiDragElement) => {
+ multiDragElement.sortableIndex = index(multiDragElement);
+ });
+
+ // Sort multi-drag elements
+ multiDragElements = multiDragElements.sort(function (a, b) {
+ return a.sortableIndex - b.sortableIndex;
+ });
+ dragStarted = true;
+ },
+
+ dragStarted({ sortable }) {
+ if (!this.isMultiDrag) return;
+ if (this.options.sort) {
+ // Capture rects,
+ // hide multi drag elements (by positioning them absolute),
+ // set multi drag elements rects to dragRect,
+ // show multi drag elements,
+ // animate to rects,
+ // unset rects & remove from DOM
+
+ sortable.captureAnimationState();
+
+ if (this.options.animation) {
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ css(multiDragElement, "position", "absolute");
+ });
+
+ let dragRect = getRect(dragEl$1, false, true, true);
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ setRect(multiDragElement, dragRect);
+ });
+
+ folding = true;
+ initialFolding = true;
+ }
+ }
+
+ sortable.animateAll(() => {
+ folding = false;
+ initialFolding = false;
+
+ if (this.options.animation) {
+ multiDragElements.forEach((multiDragElement) => {
+ unsetRect(multiDragElement);
+ });
+ }
+
+ // Remove all auxiliary multidrag items from el, if sorting enabled
+ if (this.options.sort) {
+ removeMultiDragElements();
+ }
+ });
+ },
+
+ dragOver({ target, completed, cancel }) {
+ if (folding && ~multiDragElements.indexOf(target)) {
+ completed(false);
+ cancel();
+ }
+ },
+
+ revert({ fromSortable, rootEl, sortable, dragRect }) {
+ if (multiDragElements.length > 1) {
+ // Setup unfold animation
+ multiDragElements.forEach((multiDragElement) => {
+ sortable.addAnimationState({
+ target: multiDragElement,
+ rect: folding ? getRect(multiDragElement) : dragRect,
+ });
+
+ unsetRect(multiDragElement);
+
+ multiDragElement.fromRect = dragRect;
+
+ fromSortable.removeAnimationState(multiDragElement);
+ });
+ folding = false;
+ insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);
+ }
+ },
+
+ dragOverCompleted({
+ sortable,
+ isOwner,
+ insertion,
+ activeSortable,
+ parentEl,
+ putSortable,
+ }) {
+ let options = this.options;
+ if (insertion) {
+ // Clones must be hidden before folding animation to capture dragRectAbsolute properly
+ if (isOwner) {
+ activeSortable._hideClone();
+ }
+
+ initialFolding = false;
+ // If leaving sort:false root, or already folding - Fold to new location
+ if (
+ options.animation &&
+ multiDragElements.length > 1 &&
+ (folding ||
+ (!isOwner && !activeSortable.options.sort && !putSortable))
+ ) {
+ // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible
+ let dragRectAbsolute = getRect(dragEl$1, false, true, true);
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ setRect(multiDragElement, dragRectAbsolute);
+
+ // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted
+ // while folding, and so that we can capture them again because old sortable will no longer be fromSortable
+ parentEl.appendChild(multiDragElement);
+ });
+
+ folding = true;
+ }
+
+ // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out
+ if (!isOwner) {
+ // Only remove if not folding (folding will remove them anyways)
+ if (!folding) {
+ removeMultiDragElements();
+ }
+
+ if (multiDragElements.length > 1) {
+ let clonesHiddenBefore = clonesHidden;
+ activeSortable._showClone(sortable);
+
+ // Unfold animation for clones if showing from hidden
+ if (
+ activeSortable.options.animation &&
+ !clonesHidden &&
+ clonesHiddenBefore
+ ) {
+ multiDragClones.forEach((clone) => {
+ activeSortable.addAnimationState({
+ target: clone,
+ rect: clonesFromRect,
+ });
+
+ clone.fromRect = clonesFromRect;
+ clone.thisAnimationDuration = null;
+ });
+ }
+ } else {
+ activeSortable._showClone(sortable);
+ }
+ }
+ }
+ },
+
+ dragOverAnimationCapture({ dragRect, isOwner, activeSortable }) {
+ multiDragElements.forEach((multiDragElement) => {
+ multiDragElement.thisAnimationDuration = null;
+ });
+
+ if (
+ activeSortable.options.animation &&
+ !isOwner &&
+ activeSortable.multiDrag.isMultiDrag
+ ) {
+ clonesFromRect = Object.assign({}, dragRect);
+ let dragMatrix = matrix(dragEl$1, true);
+ clonesFromRect.top -= dragMatrix.f;
+ clonesFromRect.left -= dragMatrix.e;
+ }
+ },
+
+ dragOverAnimationComplete() {
+ if (folding) {
+ folding = false;
+ removeMultiDragElements();
+ }
+ },
+
+ drop({
+ originalEvent: evt,
+ rootEl,
+ parentEl,
+ sortable,
+ dispatchSortableEvent,
+ oldIndex,
+ putSortable,
+ }) {
+ let toSortable = putSortable || this.sortable;
+
+ if (!evt) return;
+
+ let options = this.options,
+ children = parentEl.children;
+
+ // Multi-drag selection
+ if (!dragStarted) {
+ if (options.multiDragKey && !this.multiDragKeyDown) {
+ this._deselectMultiDrag();
+ }
+ toggleClass(
+ dragEl$1,
+ options.selectedClass,
+ !~multiDragElements.indexOf(dragEl$1)
+ );
+
+ if (!~multiDragElements.indexOf(dragEl$1)) {
+ multiDragElements.push(dragEl$1);
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "select",
+ targetEl: dragEl$1,
+ originalEvt: evt,
+ });
+
+ // Modifier activated, select from last to dragEl
+ if (
+ evt.shiftKey &&
+ lastMultiDragSelect &&
+ sortable.el.contains(lastMultiDragSelect)
+ ) {
+ let lastIndex = index(lastMultiDragSelect),
+ currentIndex = index(dragEl$1);
+
+ if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {
+ // Must include lastMultiDragSelect (select it), in case modified selection from no selection
+ // (but previous selection existed)
+ let n, i;
+ if (currentIndex > lastIndex) {
+ i = lastIndex;
+ n = currentIndex;
+ } else {
+ i = currentIndex;
+ n = lastIndex + 1;
+ }
+
+ for (; i < n; i++) {
+ if (~multiDragElements.indexOf(children[i])) continue;
+ toggleClass(children[i], options.selectedClass, true);
+ multiDragElements.push(children[i]);
+
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "select",
+ targetEl: children[i],
+ originalEvt: evt,
+ });
+ }
+ }
+ } else {
+ lastMultiDragSelect = dragEl$1;
+ }
+
+ multiDragSortable = toSortable;
+ } else {
+ multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);
+ lastMultiDragSelect = null;
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "deselect",
+ targetEl: dragEl$1,
+ originalEvt: evt,
+ });
+ }
+ }
+
+ // Multi-drag drop
+ if (dragStarted && this.isMultiDrag) {
+ // Do not "unfold" after around dragEl if reverted
+ if (
+ (parentEl[expando].options.sort || parentEl !== rootEl) &&
+ multiDragElements.length > 1
+ ) {
+ let dragRect = getRect(dragEl$1),
+ multiDragIndex = index(
+ dragEl$1,
+ ":not(." + this.options.selectedClass + ")"
+ );
+
+ if (!initialFolding && options.animation)
+ dragEl$1.thisAnimationDuration = null;
+
+ toSortable.captureAnimationState();
+
+ if (!initialFolding) {
+ if (options.animation) {
+ dragEl$1.fromRect = dragRect;
+ multiDragElements.forEach((multiDragElement) => {
+ multiDragElement.thisAnimationDuration = null;
+ if (multiDragElement !== dragEl$1) {
+ let rect = folding ? getRect(multiDragElement) : dragRect;
+ multiDragElement.fromRect = rect;
+
+ // Prepare unfold animation
+ toSortable.addAnimationState({
+ target: multiDragElement,
+ rect: rect,
+ });
+ }
+ });
+ }
+
+ // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert
+ // properly they must all be removed
+ removeMultiDragElements();
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (children[multiDragIndex]) {
+ parentEl.insertBefore(
+ multiDragElement,
+ children[multiDragIndex]
+ );
+ } else {
+ parentEl.appendChild(multiDragElement);
+ }
+ multiDragIndex++;
+ });
+
+ // If initial folding is done, the elements may have changed position because they are now
+ // unfolding around dragEl, even though dragEl may not have his index changed, so update event
+ // must be fired here as Sortable will not.
+ if (oldIndex === index(dragEl$1)) {
+ let update = false;
+ multiDragElements.forEach((multiDragElement) => {
+ if (
+ multiDragElement.sortableIndex !== index(multiDragElement)
+ ) {
+ update = true;
+ return;
+ }
+ });
+
+ if (update) {
+ dispatchSortableEvent("update");
+ }
+ }
+ }
+
+ // Must be done after capturing individual rects (scroll bar)
+ multiDragElements.forEach((multiDragElement) => {
+ unsetRect(multiDragElement);
+ });
+
+ toSortable.animateAll();
+ }
+
+ multiDragSortable = toSortable;
+ }
+
+ // Remove clones if necessary
+ if (
+ rootEl === parentEl ||
+ (putSortable && putSortable.lastPutMode !== "clone")
+ ) {
+ multiDragClones.forEach((clone) => {
+ clone.parentNode && clone.parentNode.removeChild(clone);
+ });
+ }
+ },
+
+ nullingGlobal() {
+ this.isMultiDrag = dragStarted = false;
+ multiDragClones.length = 0;
+ },
+
+ destroyGlobal() {
+ this._deselectMultiDrag();
+ off(document, "pointerup", this._deselectMultiDrag);
+ off(document, "mouseup", this._deselectMultiDrag);
+ off(document, "touchend", this._deselectMultiDrag);
+
+ off(document, "keydown", this._checkKeyDown);
+ off(document, "keyup", this._checkKeyUp);
+ },
+
+ _deselectMultiDrag(evt) {
+ if (typeof dragStarted !== "undefined" && dragStarted) return;
+
+ // Only deselect if selection is in this sortable
+ if (multiDragSortable !== this.sortable) return;
+
+ // Only deselect if target is not item in this sortable
+ if (
+ evt &&
+ closest(evt.target, this.options.draggable, this.sortable.el, false)
+ )
+ return;
+
+ // Only deselect if left click
+ if (evt && evt.button !== 0) return;
+
+ while (multiDragElements.length) {
+ let el = multiDragElements[0];
+ toggleClass(el, this.options.selectedClass, false);
+ multiDragElements.shift();
+ dispatchEvent({
+ sortable: this.sortable,
+ rootEl: this.sortable.el,
+ name: "deselect",
+ targetEl: el,
+ originalEvt: evt,
+ });
+ }
+ },
+
+ _checkKeyDown(evt) {
+ if (evt.key === this.options.multiDragKey) {
+ this.multiDragKeyDown = true;
+ }
+ },
+
+ _checkKeyUp(evt) {
+ if (evt.key === this.options.multiDragKey) {
+ this.multiDragKeyDown = false;
+ }
+ },
+ };
+
+ return Object.assign(MultiDrag, {
+ // Static methods & properties
+ pluginName: "multiDrag",
+ utils: {
+ /**
+ * Selects the provided multi-drag item
+ * @param {HTMLElement} el The element to be selected
+ */
+ select(el) {
+ let sortable = el.parentNode[expando];
+ if (
+ !sortable ||
+ !sortable.options.multiDrag ||
+ ~multiDragElements.indexOf(el)
+ )
+ return;
+ if (multiDragSortable && multiDragSortable !== sortable) {
+ multiDragSortable.multiDrag._deselectMultiDrag();
+ multiDragSortable = sortable;
+ }
+ toggleClass(el, sortable.options.selectedClass, true);
+ multiDragElements.push(el);
+ },
+ /**
+ * Deselects the provided multi-drag item
+ * @param {HTMLElement} el The element to be deselected
+ */
+ deselect(el) {
+ let sortable = el.parentNode[expando],
+ index = multiDragElements.indexOf(el);
+ if (!sortable || !sortable.options.multiDrag || !~index) return;
+ toggleClass(el, sortable.options.selectedClass, false);
+ multiDragElements.splice(index, 1);
+ },
+ },
+ eventProperties() {
+ const oldIndicies = [],
+ newIndicies = [];
+
+ multiDragElements.forEach((multiDragElement) => {
+ oldIndicies.push({
+ multiDragElement,
+ index: multiDragElement.sortableIndex,
+ });
+
+ // multiDragElements will already be sorted if folding
+ let newIndex;
+ if (folding && multiDragElement !== dragEl$1) {
+ newIndex = -1;
+ } else if (folding) {
+ newIndex = index(
+ multiDragElement,
+ ":not(." + this.options.selectedClass + ")"
+ );
+ } else {
+ newIndex = index(multiDragElement);
+ }
+ newIndicies.push({
+ multiDragElement,
+ index: newIndex,
+ });
+ });
+ return {
+ items: [...multiDragElements],
+ clones: [...multiDragClones],
+ oldIndicies,
+ newIndicies,
+ };
+ },
+ optionListeners: {
+ multiDragKey(key) {
+ key = key.toLowerCase();
+ if (key === "ctrl") {
+ key = "Control";
+ } else if (key.length > 1) {
+ key = key.charAt(0).toUpperCase() + key.substr(1);
+ }
+ return key;
+ },
+ },
+ });
}
function insertMultiDragElements(clonesInserted, rootEl) {
- multiDragElements.forEach((multiDragElement, i) => {
- let target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];
- if (target) {
- rootEl.insertBefore(multiDragElement, target);
- } else {
- rootEl.appendChild(multiDragElement);
- }
- });
+ multiDragElements.forEach((multiDragElement, i) => {
+ let target =
+ rootEl.children[
+ multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)
+ ];
+ if (target) {
+ rootEl.insertBefore(multiDragElement, target);
+ } else {
+ rootEl.appendChild(multiDragElement);
+ }
+ });
}
/**
@@ -3913,22 +4071,30 @@ function insertMultiDragElements(clonesInserted, rootEl) {
* @param {HTMLElement} rootEl
*/
function insertMultiDragClones(elementsInserted, rootEl) {
- multiDragClones.forEach((clone, i) => {
- let target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];
- if (target) {
- rootEl.insertBefore(clone, target);
- } else {
- rootEl.appendChild(clone);
- }
- });
+ multiDragClones.forEach((clone, i) => {
+ let target =
+ rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];
+ if (target) {
+ rootEl.insertBefore(clone, target);
+ } else {
+ rootEl.appendChild(clone);
+ }
+ });
}
function removeMultiDragElements() {
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);
- });
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ multiDragElement.parentNode &&
+ multiDragElement.parentNode.removeChild(multiDragElement);
+ });
}
export default Sortable;
-export { AutoScrollPlugin as AutoScroll, MultiDragPlugin as MultiDrag, OnSpill, Sortable, SwapPlugin as Swap };
+export {
+ AutoScrollPlugin as AutoScroll,
+ MultiDragPlugin as MultiDrag,
+ OnSpill,
+ Sortable,
+ SwapPlugin as Swap,
+};
diff --git a/modular/sortable.esm.js b/modular/sortable.esm.js
index 27cc75e24..77a8ab785 100644
--- a/modular/sortable.esm.js
+++ b/modular/sortable.esm.js
@@ -7,175 +7,184 @@
var version = "1.11.0";
function userAgent(pattern) {
- if (typeof window !== 'undefined' && window.navigator) {
- return !!/*@__PURE__*/navigator.userAgent.match(pattern);
- }
+ if (typeof window !== "undefined" && window.navigator) {
+ return !!(/*@__PURE__*/ navigator.userAgent.match(pattern));
+ }
}
-const IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i);
+const IE11OrLess = userAgent(
+ /(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i
+);
const Edge = userAgent(/Edge/i);
const FireFox = userAgent(/firefox/i);
-const Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);
+const Safari =
+ userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);
const IOS = userAgent(/iP(ad|od|hone)/i);
const ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);
const captureMode = {
- capture: false,
- passive: false
+ capture: false,
+ passive: false,
};
function on(el, event, fn) {
- el.addEventListener(event, fn, !IE11OrLess && captureMode);
+ el.addEventListener(event, fn, !IE11OrLess && captureMode);
}
function off(el, event, fn) {
- el.removeEventListener(event, fn, !IE11OrLess && captureMode);
+ el.removeEventListener(event, fn, !IE11OrLess && captureMode);
}
-function matches(/**HTMLElement*/el, /**String*/selector) {
- if (!selector) return;
-
- selector[0] === '>' && (selector = selector.substring(1));
-
- if (el) {
- try {
- if (el.matches) {
- return el.matches(selector);
- } else if (el.msMatchesSelector) {
- return el.msMatchesSelector(selector);
- } else if (el.webkitMatchesSelector) {
- return el.webkitMatchesSelector(selector);
- }
- } catch(_) {
- return false;
- }
- }
-
- return false;
+function matches(/**HTMLElement*/ el, /**String*/ selector) {
+ if (!selector) return;
+
+ selector[0] === ">" && (selector = selector.substring(1));
+
+ if (el) {
+ try {
+ if (el.matches) {
+ return el.matches(selector);
+ } else if (el.msMatchesSelector) {
+ return el.msMatchesSelector(selector);
+ } else if (el.webkitMatchesSelector) {
+ return el.webkitMatchesSelector(selector);
+ }
+ } catch (_) {
+ return false;
+ }
+ }
+
+ return false;
}
function getParentOrHost(el) {
- return (el.host && el !== document && el.host.nodeType)
- ? el.host
- : el.parentNode;
+ return el.host && el !== document && el.host.nodeType
+ ? el.host
+ : el.parentNode;
}
-function closest(/**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {
- if (el) {
- ctx = ctx || document;
-
- do {
- if (
- selector != null &&
- (
- selector[0] === '>' ?
- el.parentNode === ctx && matches(el, selector) :
- matches(el, selector)
- ) ||
- includeCTX && el === ctx
- ) {
- return el;
- }
-
- if (el === ctx) break;
- /* jshint boss:true */
- } while (el = getParentOrHost(el));
- }
-
- return null;
+function closest(
+ /**HTMLElement*/ el,
+ /**String*/ selector,
+ /**HTMLElement*/ ctx,
+ includeCTX
+) {
+ if (el) {
+ ctx = ctx || document;
+
+ do {
+ if (
+ (selector != null &&
+ (selector[0] === ">"
+ ? el.parentNode === ctx && matches(el, selector)
+ : matches(el, selector))) ||
+ (includeCTX && el === ctx)
+ ) {
+ return el;
+ }
+
+ if (el === ctx) break;
+ /* jshint boss:true */
+ } while ((el = getParentOrHost(el)));
+ }
+
+ return null;
}
const R_SPACE = /\s+/g;
function toggleClass(el, name, state) {
- if (el && name) {
- if (el.classList) {
- el.classList[state ? 'add' : 'remove'](name);
- }
- else {
- let className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');
- el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');
- }
- }
+ if (el && name) {
+ if (el.classList) {
+ el.classList[state ? "add" : "remove"](name);
+ } else {
+ let className = (" " + el.className + " ")
+ .replace(R_SPACE, " ")
+ .replace(" " + name + " ", " ");
+ el.className = (className + (state ? " " + name : "")).replace(
+ R_SPACE,
+ " "
+ );
+ }
+ }
}
-
function css(el, prop, val) {
- let style = el && el.style;
-
- if (style) {
- if (val === void 0) {
- if (document.defaultView && document.defaultView.getComputedStyle) {
- val = document.defaultView.getComputedStyle(el, '');
- }
- else if (el.currentStyle) {
- val = el.currentStyle;
- }
-
- return prop === void 0 ? val : val[prop];
- }
- else {
- if (!(prop in style) && prop.indexOf('webkit') === -1) {
- prop = '-webkit-' + prop;
- }
-
- style[prop] = val + (typeof val === 'string' ? '' : 'px');
- }
- }
+ let style = el && el.style;
+
+ if (style) {
+ if (val === void 0) {
+ if (document.defaultView && document.defaultView.getComputedStyle) {
+ val = document.defaultView.getComputedStyle(el, "");
+ } else if (el.currentStyle) {
+ val = el.currentStyle;
+ }
+
+ return prop === void 0 ? val : val[prop];
+ } else {
+ if (!(prop in style) && prop.indexOf("webkit") === -1) {
+ prop = "-webkit-" + prop;
+ }
+
+ style[prop] = val + (typeof val === "string" ? "" : "px");
+ }
+ }
}
function matrix(el, selfOnly) {
- let appliedTransforms = '';
- if (typeof(el) === 'string') {
- appliedTransforms = el;
- } else {
- do {
- //@ts-ignore
- let transform = css(el, 'transform');
-
- if (transform && transform !== 'none') {
- appliedTransforms = transform + ' ' + appliedTransforms;
- }
- /* jshint boss:true */
- } while (!selfOnly && (el = el.parentNode));
- }
-
- //@ts-ignore
- const matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;
- /*jshint -W056 */
- return matrixFn && (new matrixFn(appliedTransforms));
-}
+ let appliedTransforms = "";
+ if (typeof el === "string") {
+ appliedTransforms = el;
+ } else {
+ do {
+ //@ts-ignore
+ let transform = css(el, "transform");
+
+ if (transform && transform !== "none") {
+ appliedTransforms = transform + " " + appliedTransforms;
+ }
+ /* jshint boss:true */
+ } while (!selfOnly && (el = el.parentNode));
+ }
+ //@ts-ignore
+ const matrixFn =
+ window.DOMMatrix ||
+ window.WebKitCSSMatrix ||
+ window.CSSMatrix ||
+ window.MSCSSMatrix;
+ /*jshint -W056 */
+ return matrixFn && new matrixFn(appliedTransforms);
+}
function find(ctx, tagName, iterator) {
- if (ctx) {
- let list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;
+ if (ctx) {
+ let list = ctx.getElementsByTagName(tagName),
+ i = 0,
+ n = list.length;
- if (iterator) {
- for (; i < n; i++) {
- iterator(list[i], i);
- }
- }
+ if (iterator) {
+ for (; i < n; i++) {
+ iterator(list[i], i);
+ }
+ }
- return list;
- }
+ return list;
+ }
- return [];
+ return [];
}
-
-
function getWindowScrollingElement() {
- let scrollingElement = document.scrollingElement;
+ let scrollingElement = document.scrollingElement;
- if (scrollingElement) {
- return scrollingElement
- } else {
- return document.documentElement
- }
+ if (scrollingElement) {
+ return scrollingElement;
+ } else {
+ return document.documentElement;
+ }
}
-
/**
* Returns the "bounding client rect" of given element
* @param {HTMLElement} el The element whose boundingClientRect is wanted
@@ -185,97 +194,100 @@ function getWindowScrollingElement() {
* @param {[HTMLElement]} container The parent the element will be placed in
* @return {Object} The boundingClientRect of el, with specified adjustments
*/
-function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {
- if (!el.getBoundingClientRect && el !== window) return;
-
- let elRect,
- top,
- left,
- bottom,
- right,
- height,
- width;
-
- if (el !== window && el !== getWindowScrollingElement()) {
- elRect = el.getBoundingClientRect();
- top = elRect.top;
- left = elRect.left;
- bottom = elRect.bottom;
- right = elRect.right;
- height = elRect.height;
- width = elRect.width;
- } else {
- top = 0;
- left = 0;
- bottom = window.innerHeight;
- right = window.innerWidth;
- height = window.innerHeight;
- width = window.innerWidth;
- }
-
- if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {
- // Adjust for translate()
- container = container || el.parentNode;
-
- // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)
- // Not needed on <= IE11
- if (!IE11OrLess) {
- do {
- if (
- container &&
- container.getBoundingClientRect &&
- (
- //@ts-ignore
- css(container, 'transform') !== 'none' ||
- relativeToNonStaticParent &&
- //@ts-ignore
- css(container, 'position') !== 'static'
- )
- ) {
- let containerRect = container.getBoundingClientRect();
-
- // Set relative to edges of padding box of container
- //@ts-ignore
- top -= containerRect.top + parseInt(css(container, 'border-top-width'));
- //@ts-ignore
- left -= containerRect.left + parseInt(css(container, 'border-left-width'));
- bottom = top + elRect.height;
- right = left + elRect.width;
-
- break;
- }
- /* jshint boss:true */
- } while (container = container.parentNode);
- }
- }
-
- if (undoScale && el !== window) {
- // Adjust for scale()
- //@ts-ignore
- let elMatrix = matrix(container || el),
- scaleX = elMatrix && elMatrix.a,
- scaleY = elMatrix && elMatrix.d;
-
- if (elMatrix) {
- top /= scaleY;
- left /= scaleX;
-
- width /= scaleX;
- height /= scaleY;
-
- bottom = top + height;
- right = left + width;
- }
- }
-
- return {
- top: top,
- left: left,
- bottom: bottom,
- right: right,
- width: width,
- height: height
- };
+function getRect(
+ el,
+ relativeToContainingBlock,
+ relativeToNonStaticParent,
+ undoScale,
+ container
+) {
+ if (!el.getBoundingClientRect && el !== window) return;
+
+ let elRect, top, left, bottom, right, height, width;
+
+ if (el !== window && el !== getWindowScrollingElement()) {
+ elRect = el.getBoundingClientRect();
+ top = elRect.top;
+ left = elRect.left;
+ bottom = elRect.bottom;
+ right = elRect.right;
+ height = elRect.height;
+ width = elRect.width;
+ } else {
+ top = 0;
+ left = 0;
+ bottom = window.innerHeight;
+ right = window.innerWidth;
+ height = window.innerHeight;
+ width = window.innerWidth;
+ }
+
+ if (
+ (relativeToContainingBlock || relativeToNonStaticParent) &&
+ el !== window
+ ) {
+ // Adjust for translate()
+ container = container || el.parentNode;
+
+ // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)
+ // Not needed on <= IE11
+ if (!IE11OrLess) {
+ do {
+ if (
+ container &&
+ container.getBoundingClientRect &&
+ //@ts-ignore
+ (css(container, "transform") !== "none" ||
+ (relativeToNonStaticParent &&
+ //@ts-ignore
+ css(container, "position") !== "static"))
+ ) {
+ let containerRect = container.getBoundingClientRect();
+
+ // Set relative to edges of padding box of container
+ //@ts-ignore
+ top -=
+ containerRect.top + parseInt(css(container, "border-top-width"));
+ //@ts-ignore
+ left -=
+ containerRect.left + parseInt(css(container, "border-left-width"));
+ bottom = top + elRect.height;
+ right = left + elRect.width;
+
+ break;
+ }
+ /* jshint boss:true */
+ } while ((container = container.parentNode));
+ }
+ }
+
+ if (undoScale && el !== window) {
+ // Adjust for scale()
+ //@ts-ignore
+ let elMatrix = matrix(container || el),
+ scaleX = elMatrix && elMatrix.a,
+ scaleY = elMatrix && elMatrix.d;
+
+ if (elMatrix) {
+ top /= scaleY;
+ left /= scaleX;
+
+ width /= scaleX;
+ height /= scaleY;
+
+ bottom = top + height;
+ right = left + width;
+ }
+ }
+
+ return {
+ top: top,
+ left: left,
+ bottom: bottom,
+ right: right,
+ width: width,
+ height: height,
+ };
}
/**
@@ -286,34 +298,32 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS
* @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element
*/
function isScrolledPast(el, elSide, parentSide) {
- let parent = getParentAutoScrollElement(el, true),
- //@ts-ignore
- elSideVal = getRect(el)[elSide];
-
- /* jshint boss:true */
- while (parent) {
- //@ts-ignore
- let parentSideVal = getRect(parent)[parentSide],
- visible;
-
- if (parentSide === 'top' || parentSide === 'left') {
- visible = elSideVal >= parentSideVal;
- } else {
- visible = elSideVal <= parentSideVal;
- }
+ let parent = getParentAutoScrollElement(el, true),
+ //@ts-ignore
+ elSideVal = getRect(el)[elSide];
+
+ /* jshint boss:true */
+ while (parent) {
+ //@ts-ignore
+ let parentSideVal = getRect(parent)[parentSide],
+ visible;
+
+ if (parentSide === "top" || parentSide === "left") {
+ visible = elSideVal >= parentSideVal;
+ } else {
+ visible = elSideVal <= parentSideVal;
+ }
- if (!visible) return parent;
+ if (!visible) return parent;
- if (parent === getWindowScrollingElement()) break;
+ if (parent === getWindowScrollingElement()) break;
- parent = getParentAutoScrollElement(parent, false);
- }
+ parent = getParentAutoScrollElement(parent, false);
+ }
- return false;
+ return false;
}
-
-
/**
* Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)
* and non-draggable elements
@@ -323,28 +333,28 @@ function isScrolledPast(el, elSide, parentSide) {
* @return {HTMLElement} The child at index childNum, or null if not found
*/
function getChild(el, childNum, options) {
- let currentChild = 0,
- i = 0,
- children = el.children;
-
- while (i < children.length) {
- if (
- children[i].style.display !== 'none' &&
- //@ts-ignore
- children[i] !== Sortable.ghost &&
- //@ts-ignore
- children[i] !== Sortable.dragged &&
- closest(children[i], options.draggable, el, false)
- ) {
- if (currentChild === childNum) {
- return children[i];
- }
- currentChild++;
- }
-
- i++;
- }
- return null;
+ let currentChild = 0,
+ i = 0,
+ children = el.children;
+
+ while (i < children.length) {
+ if (
+ children[i].style.display !== "none" &&
+ //@ts-ignore
+ children[i] !== Sortable.ghost &&
+ //@ts-ignore
+ children[i] !== Sortable.dragged &&
+ closest(children[i], options.draggable, el, false)
+ ) {
+ if (currentChild === childNum) {
+ return children[i];
+ }
+ currentChild++;
+ }
+
+ i++;
+ }
+ return null;
}
/**
@@ -354,24 +364,21 @@ function getChild(el, childNum, options) {
* @return {HTMLElement} The last child, ignoring ghostEl
*/
function lastChild(el, selector) {
- let last = el.lastElementChild;
-
- while (
- last &&
- (
- //@ts-ignore
- last === Sortable.ghost ||
- //@ts-ignore
- css(last, 'display') === 'none' ||
- selector && !matches(last, selector)
- )
- ) {
- last = last.previousElementSibling;
- }
-
- return last || null;
-}
+ let last = el.lastElementChild;
+
+ while (
+ last &&
+ //@ts-ignore
+ (last === Sortable.ghost ||
+ //@ts-ignore
+ css(last, "display") === "none" ||
+ (selector && !matches(last, selector)))
+ ) {
+ last = last.previousElementSibling;
+ }
+ return last || null;
+}
/**
* Returns the index of an element within its parent for a selected set of
@@ -381,21 +388,25 @@ function lastChild(el, selector) {
* @return {number}
*/
function index(el, selector) {
- let index = 0;
+ let index = 0;
- if (!el || !el.parentNode) {
- return -1;
- }
+ if (!el || !el.parentNode) {
+ return -1;
+ }
- /* jshint boss:true */
- while (el = el.previousElementSibling) {
- //@ts-ignore
- if ((el.nodeName.toUpperCase() !== 'TEMPLATE') && el !== Sortable.clone && (!selector || matches(el, selector))) {
- index++;
- }
- }
+ /* jshint boss:true */
+ while ((el = el.previousElementSibling)) {
+ //@ts-ignore
+ if (
+ el.nodeName.toUpperCase() !== "TEMPLATE" &&
+ el !== Sortable.clone &&
+ (!selector || matches(el, selector))
+ ) {
+ index++;
+ }
+ }
- return index;
+ return index;
}
/**
@@ -405,23 +416,23 @@ function index(el, selector) {
* @return {Array} Offsets in the format of [left, top]
*/
function getRelativeScrollOffset(el) {
- let offsetLeft = 0,
- offsetTop = 0,
- winScroller = getWindowScrollingElement();
-
- if (el) {
- do {
- //@ts-ignore
- let elMatrix = matrix(el),
- scaleX = elMatrix.a,
- scaleY = elMatrix.d;
-
- offsetLeft += el.scrollLeft * scaleX;
- offsetTop += el.scrollTop * scaleY;
- } while (el !== winScroller && (el = el.parentNode));
- }
-
- return [offsetLeft, offsetTop];
+ let offsetLeft = 0,
+ offsetTop = 0,
+ winScroller = getWindowScrollingElement();
+
+ if (el) {
+ do {
+ //@ts-ignore
+ let elMatrix = matrix(el),
+ scaleX = elMatrix.a,
+ scaleY = elMatrix.d;
+
+ offsetLeft += el.scrollLeft * scaleX;
+ offsetTop += el.scrollTop * scaleY;
+ } while (el !== winScroller && (el = el.parentNode));
+ }
+
+ return [offsetLeft, offsetTop];
}
/**
@@ -431,446 +442,480 @@ function getRelativeScrollOffset(el) {
* @return {Number} The index of the object in the array, or -1
*/
function indexOfObject(arr, obj) {
- for (let i in arr) {
- if (!arr.hasOwnProperty(i)) continue;
- for (let key in obj) {
- if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);
- }
- }
- return -1;
+ for (let i in arr) {
+ if (!arr.hasOwnProperty(i)) continue;
+ for (let key in obj) {
+ if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);
+ }
+ }
+ return -1;
}
-
function getParentAutoScrollElement(el, includeSelf) {
- // skip to window
- if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();
-
- let elem = el;
- let gotSelf = false;
- do {
- // we don't need to get elem css if it isn't even overflowing in the first place (performance)
- if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {
- //@ts-ignore
- let elemCSS = css(elem);
- if (
- elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') ||
- elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')
- ) {
- if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();
-
- if (gotSelf || includeSelf) return elem;
- gotSelf = true;
- }
- }
- /* jshint boss:true */
- } while (elem = elem.parentNode);
-
- return getWindowScrollingElement();
+ // skip to window
+ if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();
+
+ let elem = el;
+ let gotSelf = false;
+ do {
+ // we don't need to get elem css if it isn't even overflowing in the first place (performance)
+ if (
+ elem.clientWidth < elem.scrollWidth ||
+ elem.clientHeight < elem.scrollHeight
+ ) {
+ //@ts-ignore
+ let elemCSS = css(elem);
+ if (
+ (elem.clientWidth < elem.scrollWidth &&
+ (elemCSS.overflowX == "auto" || elemCSS.overflowX == "scroll")) ||
+ (elem.clientHeight < elem.scrollHeight &&
+ (elemCSS.overflowY == "auto" || elemCSS.overflowY == "scroll"))
+ ) {
+ if (!elem.getBoundingClientRect || elem === document.body)
+ return getWindowScrollingElement();
+
+ if (gotSelf || includeSelf) return elem;
+ gotSelf = true;
+ }
+ }
+ /* jshint boss:true */
+ } while ((elem = elem.parentNode));
+
+ return getWindowScrollingElement();
}
function extend(dst, src) {
- if (dst && src) {
- for (let key in src) {
- if (src.hasOwnProperty(key)) {
- dst[key] = src[key];
- }
- }
- }
-
- return dst;
-}
+ if (dst && src) {
+ for (let key in src) {
+ if (src.hasOwnProperty(key)) {
+ dst[key] = src[key];
+ }
+ }
+ }
+ return dst;
+}
function isRectEqual(rect1, rect2) {
- return Math.round(rect1.top) === Math.round(rect2.top) &&
- Math.round(rect1.left) === Math.round(rect2.left) &&
- Math.round(rect1.height) === Math.round(rect2.height) &&
- Math.round(rect1.width) === Math.round(rect2.width);
+ return (
+ Math.round(rect1.top) === Math.round(rect2.top) &&
+ Math.round(rect1.left) === Math.round(rect2.left) &&
+ Math.round(rect1.height) === Math.round(rect2.height) &&
+ Math.round(rect1.width) === Math.round(rect2.width)
+ );
}
-
let _throttleTimeout;
function throttle(callback, ms) {
- return function () {
- if (!_throttleTimeout) {
- let args = arguments,
- _this = this;
-
- if (args.length === 1) {
- callback.call(_this, args[0]);
- } else {
- callback.apply(_this, args);
- }
-
- _throttleTimeout = setTimeout(function () {
- _throttleTimeout = void 0;
- }, ms);
- }
- };
-}
+ return function () {
+ if (!_throttleTimeout) {
+ let args = arguments,
+ _this = this;
+ if (args.length === 1) {
+ callback.call(_this, args[0]);
+ } else {
+ callback.apply(_this, args);
+ }
-function cancelThrottle() {
- clearTimeout(_throttleTimeout);
- _throttleTimeout = void 0;
+ _throttleTimeout = setTimeout(function () {
+ _throttleTimeout = void 0;
+ }, ms);
+ }
+ };
}
+function cancelThrottle() {
+ clearTimeout(_throttleTimeout);
+ _throttleTimeout = void 0;
+}
function scrollBy(el, x, y) {
- el.scrollLeft += x;
- el.scrollTop += y;
+ el.scrollLeft += x;
+ el.scrollTop += y;
}
-
function clone(el) {
- //@ts-ignore
- let Polymer = window.Polymer;
- //@ts-ignore
- let $ = window.jQuery || window.Zepto;
-
- if (Polymer && Polymer.dom) {
- return Polymer.dom(el).cloneNode(true);
- }
- else if ($) {
- return $(el).clone(true)[0];
- }
- else {
- return el.cloneNode(true);
- }
+ //@ts-ignore
+ let Polymer = window.Polymer;
+ //@ts-ignore
+ let $ = window.jQuery || window.Zepto;
+
+ if (Polymer && Polymer.dom) {
+ return Polymer.dom(el).cloneNode(true);
+ } else if ($) {
+ return $(el).clone(true)[0];
+ } else {
+ return el.cloneNode(true);
+ }
}
-
function setRect(el, rect) {
- css(el, 'position', 'absolute');
- css(el, 'top', rect.top);
- css(el, 'left', rect.left);
- css(el, 'width', rect.width);
- css(el, 'height', rect.height);
+ css(el, "position", "absolute");
+ css(el, "top", rect.top);
+ css(el, "left", rect.left);
+ css(el, "width", rect.width);
+ css(el, "height", rect.height);
}
function unsetRect(el) {
- css(el, 'position', '');
- css(el, 'top', '');
- css(el, 'left', '');
- css(el, 'width', '');
- css(el, 'height', '');
+ css(el, "position", "");
+ css(el, "top", "");
+ css(el, "left", "");
+ css(el, "width", "");
+ css(el, "height", "");
}
-
-const expando = 'Sortable' + (new Date).getTime();
+const expando = "Sortable" + new Date().getTime();
function AnimationStateManager() {
- let animationStates = [],
- animationCallbackId;
-
- return {
- captureAnimationState() {
- animationStates = [];
- if (!this.options.animation) return;
- let children = [].slice.call(this.el.children);
-
- children.forEach(child => {
- if (css(child, 'display') === 'none' || child === Sortable.ghost) return;
- animationStates.push({
- target: child,
- rect: getRect(child)
- });
- let fromRect = { ...animationStates[animationStates.length - 1].rect };
-
- // If animating: compensate for current animation
- if (child.thisAnimationDuration) {
- let childMatrix = matrix(child, true);
- if (childMatrix) {
- fromRect.top -= childMatrix.f;
- fromRect.left -= childMatrix.e;
- }
- }
-
- child.fromRect = fromRect;
- });
- },
-
- addAnimationState(state) {
- animationStates.push(state);
- },
-
- removeAnimationState(target) {
- animationStates.splice(indexOfObject(animationStates, { target }), 1);
- },
-
- animateAll(callback) {
- if (!this.options.animation) {
- clearTimeout(animationCallbackId);
- if (typeof(callback) === 'function') callback();
- return;
- }
-
- let animating = false,
- animationTime = 0;
-
- animationStates.forEach((state) => {
- let time = 0,
- target = state.target,
- fromRect = target.fromRect,
- toRect = getRect(target),
- prevFromRect = target.prevFromRect,
- prevToRect = target.prevToRect,
- animatingRect = state.rect,
- targetMatrix = matrix(target, true);
-
-
- if (targetMatrix) {
- // Compensate for current animation
- toRect.top -= targetMatrix.f;
- toRect.left -= targetMatrix.e;
- }
-
- target.toRect = toRect;
-
- if (target.thisAnimationDuration) {
- // Could also check if animatingRect is between fromRect and toRect
- if (
- isRectEqual(prevFromRect, toRect) &&
- !isRectEqual(fromRect, toRect) &&
- // Make sure animatingRect is on line between toRect & fromRect
- (animatingRect.top - toRect.top) /
- (animatingRect.left - toRect.left) ===
- (fromRect.top - toRect.top) /
- (fromRect.left - toRect.left)
- ) {
- // If returning to same place as started from animation and on same axis
- time = calculateRealTime(animatingRect, prevFromRect, prevToRect, this.options);
- }
- }
-
- // if fromRect != toRect: animate
- if (!isRectEqual(toRect, fromRect)) {
- target.prevFromRect = fromRect;
- target.prevToRect = toRect;
-
- if (!time) {
- time = this.options.animation;
- }
- this.animate(
- target,
- animatingRect,
- toRect,
- time
- );
- }
-
- if (time) {
- animating = true;
- animationTime = Math.max(animationTime, time);
- clearTimeout(target.animationResetTimer);
- target.animationResetTimer = setTimeout(function() {
- target.animationTime = 0;
- target.prevFromRect = null;
- target.fromRect = null;
- target.prevToRect = null;
- target.thisAnimationDuration = null;
- }, time);
- target.thisAnimationDuration = time;
- }
- });
-
-
- clearTimeout(animationCallbackId);
- if (!animating) {
- if (typeof(callback) === 'function') callback();
- } else {
- animationCallbackId = setTimeout(function() {
- if (typeof(callback) === 'function') callback();
- }, animationTime);
- }
- animationStates = [];
- },
-
- animate(target, currentRect, toRect, duration) {
- if (duration) {
- css(target, 'transition', '');
- css(target, 'transform', '');
- let elMatrix = matrix(this.el),
- scaleX = elMatrix && elMatrix.a,
- scaleY = elMatrix && elMatrix.d,
- translateX = (currentRect.left - toRect.left) / (scaleX || 1),
- translateY = (currentRect.top - toRect.top) / (scaleY || 1);
-
- target.animatingX = !!translateX;
- target.animatingY = !!translateY;
-
- css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');
-
- this.forRepaintDummy = repaint(target); // repaint
-
- css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));
- css(target, 'transform', 'translate3d(0,0,0)');
- (typeof target.animated === 'number') && clearTimeout(target.animated);
- target.animated = setTimeout(function () {
- css(target, 'transition', '');
- css(target, 'transform', '');
- target.animated = false;
-
- target.animatingX = false;
- target.animatingY = false;
- }, duration);
- }
- }
- };
+ let animationStates = [],
+ animationCallbackId;
+
+ return {
+ captureAnimationState() {
+ animationStates = [];
+ if (!this.options.animation) return;
+ let children = [].slice.call(this.el.children);
+
+ children.forEach((child) => {
+ if (css(child, "display") === "none" || child === Sortable.ghost)
+ return;
+ animationStates.push({
+ target: child,
+ rect: getRect(child),
+ });
+ let fromRect = { ...animationStates[animationStates.length - 1].rect };
+
+ // If animating: compensate for current animation
+ if (child.thisAnimationDuration) {
+ let childMatrix = matrix(child, true);
+ if (childMatrix) {
+ fromRect.top -= childMatrix.f;
+ fromRect.left -= childMatrix.e;
+ }
+ }
+
+ child.fromRect = fromRect;
+ });
+ },
+
+ addAnimationState(state) {
+ animationStates.push(state);
+ },
+
+ removeAnimationState(target) {
+ animationStates.splice(indexOfObject(animationStates, { target }), 1);
+ },
+
+ animateAll(callback) {
+ if (!this.options.animation) {
+ clearTimeout(animationCallbackId);
+ if (typeof callback === "function") callback();
+ return;
+ }
+
+ let animating = false,
+ animationTime = 0;
+
+ animationStates.forEach((state) => {
+ let time = 0,
+ target = state.target,
+ fromRect = target.fromRect,
+ toRect = getRect(target),
+ prevFromRect = target.prevFromRect,
+ prevToRect = target.prevToRect,
+ animatingRect = state.rect,
+ targetMatrix = matrix(target, true);
+
+ if (targetMatrix) {
+ // Compensate for current animation
+ toRect.top -= targetMatrix.f;
+ toRect.left -= targetMatrix.e;
+ }
+
+ target.toRect = toRect;
+
+ if (target.thisAnimationDuration) {
+ // Could also check if animatingRect is between fromRect and toRect
+ if (
+ isRectEqual(prevFromRect, toRect) &&
+ !isRectEqual(fromRect, toRect) &&
+ // Make sure animatingRect is on line between toRect & fromRect
+ (animatingRect.top - toRect.top) /
+ (animatingRect.left - toRect.left) ===
+ (fromRect.top - toRect.top) / (fromRect.left - toRect.left)
+ ) {
+ // If returning to same place as started from animation and on same axis
+ time = calculateRealTime(
+ animatingRect,
+ prevFromRect,
+ prevToRect,
+ this.options
+ );
+ }
+ }
+
+ // if fromRect != toRect: animate
+ if (!isRectEqual(toRect, fromRect)) {
+ target.prevFromRect = fromRect;
+ target.prevToRect = toRect;
+
+ if (!time) {
+ time = this.options.animation;
+ }
+ this.animate(target, animatingRect, toRect, time);
+ }
+
+ if (time) {
+ animating = true;
+ animationTime = Math.max(animationTime, time);
+ clearTimeout(target.animationResetTimer);
+ target.animationResetTimer = setTimeout(function () {
+ target.animationTime = 0;
+ target.prevFromRect = null;
+ target.fromRect = null;
+ target.prevToRect = null;
+ target.thisAnimationDuration = null;
+ }, time);
+ target.thisAnimationDuration = time;
+ }
+ });
+
+ clearTimeout(animationCallbackId);
+ if (!animating) {
+ if (typeof callback === "function") callback();
+ } else {
+ animationCallbackId = setTimeout(function () {
+ if (typeof callback === "function") callback();
+ }, animationTime);
+ }
+ animationStates = [];
+ },
+
+ animate(target, currentRect, toRect, duration) {
+ if (duration) {
+ css(target, "transition", "");
+ css(target, "transform", "");
+ let elMatrix = matrix(this.el),
+ scaleX = elMatrix && elMatrix.a,
+ scaleY = elMatrix && elMatrix.d,
+ translateX = (currentRect.left - toRect.left) / (scaleX || 1),
+ translateY = (currentRect.top - toRect.top) / (scaleY || 1);
+
+ target.animatingX = !!translateX;
+ target.animatingY = !!translateY;
+
+ css(
+ target,
+ "transform",
+ "translate3d(" + translateX + "px," + translateY + "px,0)"
+ );
+
+ this.forRepaintDummy = repaint(target); // repaint
+
+ css(
+ target,
+ "transition",
+ "transform " +
+ duration +
+ "ms" +
+ (this.options.easing ? " " + this.options.easing : "")
+ );
+ css(target, "transform", "translate3d(0,0,0)");
+ typeof target.animated === "number" && clearTimeout(target.animated);
+ target.animated = setTimeout(function () {
+ css(target, "transition", "");
+ css(target, "transform", "");
+ target.animated = false;
+
+ target.animatingX = false;
+ target.animatingY = false;
+ }, duration);
+ }
+ },
+ };
}
function repaint(target) {
- return target.offsetWidth;
+ return target.offsetWidth;
}
-
function calculateRealTime(animatingRect, fromRect, toRect, options) {
- return (
- Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) /
- Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2))
- ) * options.animation;
+ return (
+ (Math.sqrt(
+ Math.pow(fromRect.top - animatingRect.top, 2) +
+ Math.pow(fromRect.left - animatingRect.left, 2)
+ ) /
+ Math.sqrt(
+ Math.pow(fromRect.top - toRect.top, 2) +
+ Math.pow(fromRect.left - toRect.left, 2)
+ )) *
+ options.animation
+ );
}
let plugins = [];
const defaults = {
- initializeByDefault: true
+ initializeByDefault: true,
};
var PluginManager = {
- mount(plugin) {
- // Set default static properties
- for (let option in defaults) {
- if (defaults.hasOwnProperty(option) && !(option in plugin)) {
- plugin[option] = defaults[option];
- }
- }
- plugins.push(plugin);
- },
- pluginEvent(eventName, sortable, evt) {
- this.eventCanceled = false;
- evt.cancel = () => {
- this.eventCanceled = true;
- };
- const eventNameGlobal = eventName + 'Global';
- plugins.forEach(plugin => {
- if (!sortable[plugin.pluginName]) return;
- // Fire global events if it exists in this sortable
- if (
- sortable[plugin.pluginName][eventNameGlobal]
- ) {
- sortable[plugin.pluginName][eventNameGlobal]({ sortable, ...evt });
- }
-
- // Only fire plugin event if plugin is enabled in this sortable,
- // and plugin has event defined
- if (
- sortable.options[plugin.pluginName] &&
- sortable[plugin.pluginName][eventName]
- ) {
- sortable[plugin.pluginName][eventName]({ sortable, ...evt });
- }
- });
- },
- initializePlugins(sortable, el, defaults, options) {
- plugins.forEach(plugin => {
- const pluginName = plugin.pluginName;
- if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;
-
- let initialized = new plugin(sortable, el, sortable.options);
- initialized.sortable = sortable;
- initialized.options = sortable.options;
- sortable[pluginName] = initialized;
-
- // Add default options from plugin
- Object.assign(defaults, initialized.defaults);
- });
-
- for (let option in sortable.options) {
- if (!sortable.options.hasOwnProperty(option)) continue;
- let modified = this.modifyOption(sortable, option, sortable.options[option]);
- if (typeof(modified) !== 'undefined') {
- sortable.options[option] = modified;
- }
- }
- },
- getEventProperties(name, sortable) {
- let eventProperties = {};
- plugins.forEach(plugin => {
- if (typeof(plugin.eventProperties) !== 'function') return;
- Object.assign(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));
- });
-
- return eventProperties;
- },
- modifyOption(sortable, name, value) {
- let modifiedValue;
- plugins.forEach(plugin => {
- // Plugin must exist on the Sortable
- if (!sortable[plugin.pluginName]) return;
-
- // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin
- if (plugin.optionListeners && typeof(plugin.optionListeners[name]) === 'function') {
- modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);
- }
- });
-
- return modifiedValue;
- }
+ mount(plugin) {
+ // Set default static properties
+ for (let option in defaults) {
+ if (defaults.hasOwnProperty(option) && !(option in plugin)) {
+ plugin[option] = defaults[option];
+ }
+ }
+ plugins.push(plugin);
+ },
+ pluginEvent(eventName, sortable, evt) {
+ this.eventCanceled = false;
+ evt.cancel = () => {
+ this.eventCanceled = true;
+ };
+ const eventNameGlobal = eventName + "Global";
+ plugins.forEach((plugin) => {
+ if (!sortable[plugin.pluginName]) return;
+ // Fire global events if it exists in this sortable
+ if (sortable[plugin.pluginName][eventNameGlobal]) {
+ sortable[plugin.pluginName][eventNameGlobal]({ sortable, ...evt });
+ }
+
+ // Only fire plugin event if plugin is enabled in this sortable,
+ // and plugin has event defined
+ if (
+ sortable.options[plugin.pluginName] &&
+ sortable[plugin.pluginName][eventName]
+ ) {
+ sortable[plugin.pluginName][eventName]({ sortable, ...evt });
+ }
+ });
+ },
+ initializePlugins(sortable, el, defaults, options) {
+ plugins.forEach((plugin) => {
+ const pluginName = plugin.pluginName;
+ if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;
+
+ let initialized = new plugin(sortable, el, sortable.options);
+ initialized.sortable = sortable;
+ initialized.options = sortable.options;
+ sortable[pluginName] = initialized;
+
+ // Add default options from plugin
+ Object.assign(defaults, initialized.defaults);
+ });
+
+ for (let option in sortable.options) {
+ if (!sortable.options.hasOwnProperty(option)) continue;
+ let modified = this.modifyOption(
+ sortable,
+ option,
+ sortable.options[option]
+ );
+ if (typeof modified !== "undefined") {
+ sortable.options[option] = modified;
+ }
+ }
+ },
+ getEventProperties(name, sortable) {
+ let eventProperties = {};
+ plugins.forEach((plugin) => {
+ if (typeof plugin.eventProperties !== "function") return;
+ Object.assign(
+ eventProperties,
+ plugin.eventProperties.call(sortable[plugin.pluginName], name)
+ );
+ });
+
+ return eventProperties;
+ },
+ modifyOption(sortable, name, value) {
+ let modifiedValue;
+ plugins.forEach((plugin) => {
+ // Plugin must exist on the Sortable
+ if (!sortable[plugin.pluginName]) return;
+
+ // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin
+ if (
+ plugin.optionListeners &&
+ typeof plugin.optionListeners[name] === "function"
+ ) {
+ modifiedValue = plugin.optionListeners[name].call(
+ sortable[plugin.pluginName],
+ value
+ );
+ }
+ });
+
+ return modifiedValue;
+ },
};
-function dispatchEvent(
- {
- sortable, rootEl, name,
- targetEl, cloneEl, toEl, fromEl,
- oldIndex, newIndex,
- oldDraggableIndex, newDraggableIndex,
- originalEvent, putSortable, extraEventProperties
- }
-) {
- sortable = (sortable || (rootEl && rootEl[expando]));
- if (!sortable) return;
-
- let evt,
- options = sortable.options,
- onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);
- // Support for new CustomEvent feature
- if (window.CustomEvent && !IE11OrLess && !Edge) {
- evt = new CustomEvent(name, {
- bubbles: true,
- cancelable: true
- });
- } else {
- evt = document.createEvent('Event');
- evt.initEvent(name, true, true);
- }
-
- evt.to = toEl || rootEl;
- evt.from = fromEl || rootEl;
- evt.item = targetEl || rootEl;
- evt.clone = cloneEl;
-
- evt.oldIndex = oldIndex;
- evt.newIndex = newIndex;
-
- evt.oldDraggableIndex = oldDraggableIndex;
- evt.newDraggableIndex = newDraggableIndex;
-
- evt.originalEvent = originalEvent;
- evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
-
- let allEventProperties = { ...extraEventProperties, ...PluginManager.getEventProperties(name, sortable) };
- for (let option in allEventProperties) {
- evt[option] = allEventProperties[option];
- }
-
- if (rootEl) {
- rootEl.dispatchEvent(evt);
- }
-
- if (options[onName]) {
- options[onName].call(sortable, evt);
- }
+function dispatchEvent({
+ sortable,
+ rootEl,
+ name,
+ targetEl,
+ cloneEl,
+ toEl,
+ fromEl,
+ oldIndex,
+ newIndex,
+ oldDraggableIndex,
+ newDraggableIndex,
+ originalEvent,
+ putSortable,
+ extraEventProperties,
+}) {
+ sortable = sortable || (rootEl && rootEl[expando]);
+ if (!sortable) return;
+
+ let evt,
+ options = sortable.options,
+ onName = "on" + name.charAt(0).toUpperCase() + name.substr(1);
+ // Support for new CustomEvent feature
+ if (window.CustomEvent && !IE11OrLess && !Edge) {
+ evt = new CustomEvent(name, {
+ bubbles: true,
+ cancelable: true,
+ });
+ } else {
+ evt = document.createEvent("Event");
+ evt.initEvent(name, true, true);
+ }
+
+ evt.to = toEl || rootEl;
+ evt.from = fromEl || rootEl;
+ evt.item = targetEl || rootEl;
+ evt.clone = cloneEl;
+
+ evt.oldIndex = oldIndex;
+ evt.newIndex = newIndex;
+
+ evt.oldDraggableIndex = oldDraggableIndex;
+ evt.newDraggableIndex = newDraggableIndex;
+
+ evt.originalEvent = originalEvent;
+ evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
+
+ let allEventProperties = {
+ ...extraEventProperties,
+ ...PluginManager.getEventProperties(name, sortable),
+ };
+ for (let option in allEventProperties) {
+ evt[option] = allEventProperties[option];
+ }
+
+ if (rootEl) {
+ rootEl.dispatchEvent(evt);
+ }
+
+ if (options[onName]) {
+ options[onName].call(sortable, evt);
+ }
}
/**!
@@ -1204,6 +1249,14 @@ function Sortable(el, options) {
)}`;
}
+ const __warn =
+ "" +
+ "Importing Sortable directly from GitHub is deprecated.\n" +
+ "This file will not receive any more updates.\n" +
+ "Please follow the usage instructions to continue getting support: https://github.com/SortableJS/Sortable";
+
+ console.warn(__warn);
+
this.el = el; // root element
this.options = options = Object.assign({}, options);
@@ -2924,984 +2977,1090 @@ Sortable.create = function (el, options) {
Sortable.version = version;
let autoScrolls = [],
- scrollEl,
- scrollRootEl,
- scrolling = false,
- lastAutoScrollX,
- lastAutoScrollY,
- touchEvt$1,
- pointerElemChangedInterval;
+ scrollEl,
+ scrollRootEl,
+ scrolling = false,
+ lastAutoScrollX,
+ lastAutoScrollY,
+ touchEvt$1,
+ pointerElemChangedInterval;
function AutoScrollPlugin() {
+ function AutoScroll() {
+ this.defaults = {
+ scroll: true,
+ scrollSensitivity: 30,
+ scrollSpeed: 10,
+ bubbleScroll: true,
+ };
+
+ // Bind all private methods
+ for (let fn in this) {
+ if (fn.charAt(0) === "_" && typeof this[fn] === "function") {
+ this[fn] = this[fn].bind(this);
+ }
+ }
+ }
- function AutoScroll() {
- this.defaults = {
- scroll: true,
- scrollSensitivity: 30,
- scrollSpeed: 10,
- bubbleScroll: true
- };
-
- // Bind all private methods
- for (let fn in this) {
- if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
- this[fn] = this[fn].bind(this);
- }
- }
- }
-
- AutoScroll.prototype = {
- dragStarted({ originalEvent }) {
- if (this.sortable.nativeDraggable) {
- on(document, 'dragover', this._handleAutoScroll);
- } else {
- if (this.options.supportPointer) {
- on(document, 'pointermove', this._handleFallbackAutoScroll);
- } else if (originalEvent.touches) {
- on(document, 'touchmove', this._handleFallbackAutoScroll);
- } else {
- on(document, 'mousemove', this._handleFallbackAutoScroll);
- }
- }
- },
-
- dragOverCompleted({ originalEvent }) {
- // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)
- if (!this.options.dragOverBubble && !originalEvent.rootEl) {
- this._handleAutoScroll(originalEvent);
- }
- },
-
- drop() {
- if (this.sortable.nativeDraggable) {
- off(document, 'dragover', this._handleAutoScroll);
- } else {
- off(document, 'pointermove', this._handleFallbackAutoScroll);
- off(document, 'touchmove', this._handleFallbackAutoScroll);
- off(document, 'mousemove', this._handleFallbackAutoScroll);
- }
-
- clearPointerElemChangedInterval();
- clearAutoScrolls();
- cancelThrottle();
- },
-
- nulling() {
- touchEvt$1 =
- scrollRootEl =
- scrollEl =
- scrolling =
- pointerElemChangedInterval =
- lastAutoScrollX =
- lastAutoScrollY = null;
-
- autoScrolls.length = 0;
- },
-
- _handleFallbackAutoScroll(evt) {
- this._handleAutoScroll(evt, true);
- },
-
- _handleAutoScroll(evt, fallback) {
- const x = (evt.touches ? evt.touches[0] : evt).clientX,
- y = (evt.touches ? evt.touches[0] : evt).clientY,
-
- elem = document.elementFromPoint(x, y);
-
- touchEvt$1 = evt;
-
- // IE does not seem to have native autoscroll,
- // Edge's autoscroll seems too conditional,
- // MACOS Safari does not have autoscroll,
- // Firefox and Chrome are good
- if (fallback || Edge || IE11OrLess || Safari) {
- autoScroll(evt, this.options, elem, fallback);
-
- // Listener for pointer element change
- let ogElemScroller = getParentAutoScrollElement(elem, true);
- if (
- scrolling &&
- (
- !pointerElemChangedInterval ||
- x !== lastAutoScrollX ||
- y !== lastAutoScrollY
- )
- ) {
- pointerElemChangedInterval && clearPointerElemChangedInterval();
- // Detect for pointer elem change, emulating native DnD behaviour
- pointerElemChangedInterval = setInterval(() => {
- let newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);
- if (newElem !== ogElemScroller) {
- ogElemScroller = newElem;
- clearAutoScrolls();
- }
- autoScroll(evt, this.options, newElem, fallback);
- }, 10);
- lastAutoScrollX = x;
- lastAutoScrollY = y;
- }
- } else {
- // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll
- if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {
- clearAutoScrolls();
- return;
- }
- autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);
- }
- }
- };
-
- return Object.assign(AutoScroll, {
- pluginName: 'scroll',
- initializeByDefault: true
- });
-}
+ AutoScroll.prototype = {
+ dragStarted({ originalEvent }) {
+ if (this.sortable.nativeDraggable) {
+ on(document, "dragover", this._handleAutoScroll);
+ } else {
+ if (this.options.supportPointer) {
+ on(document, "pointermove", this._handleFallbackAutoScroll);
+ } else if (originalEvent.touches) {
+ on(document, "touchmove", this._handleFallbackAutoScroll);
+ } else {
+ on(document, "mousemove", this._handleFallbackAutoScroll);
+ }
+ }
+ },
-function clearAutoScrolls() {
- autoScrolls.forEach(function(autoScroll) {
- clearInterval(autoScroll.pid);
- });
- autoScrolls = [];
-}
+ dragOverCompleted({ originalEvent }) {
+ // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)
+ if (!this.options.dragOverBubble && !originalEvent.rootEl) {
+ this._handleAutoScroll(originalEvent);
+ }
+ },
-function clearPointerElemChangedInterval() {
- clearInterval(pointerElemChangedInterval);
-}
+ drop() {
+ if (this.sortable.nativeDraggable) {
+ off(document, "dragover", this._handleAutoScroll);
+ } else {
+ off(document, "pointermove", this._handleFallbackAutoScroll);
+ off(document, "touchmove", this._handleFallbackAutoScroll);
+ off(document, "mousemove", this._handleFallbackAutoScroll);
+ }
+ clearPointerElemChangedInterval();
+ clearAutoScrolls();
+ cancelThrottle();
+ },
-const autoScroll = throttle(function(evt, options, rootEl, isFallback) {
- // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
- if (!options.scroll) return;
- const x = (evt.touches ? evt.touches[0] : evt).clientX,
- y = (evt.touches ? evt.touches[0] : evt).clientY,
- sens = options.scrollSensitivity,
- speed = options.scrollSpeed,
- winScroller = getWindowScrollingElement();
-
- let scrollThisInstance = false,
- scrollCustomFn;
-
- // New scroll root, set scrollEl
- if (scrollRootEl !== rootEl) {
- scrollRootEl = rootEl;
-
- clearAutoScrolls();
-
- scrollEl = options.scroll;
- scrollCustomFn = options.scrollFn;
-
- if (scrollEl === true) {
- scrollEl = getParentAutoScrollElement(rootEl, true);
- }
- }
-
-
- let layersOut = 0;
- let currentParent = scrollEl;
- do {
- let el = currentParent,
- rect = getRect(el),
-
- top = rect.top,
- bottom = rect.bottom,
- left = rect.left,
- right = rect.right,
-
- width = rect.width,
- height = rect.height,
-
- canScrollX,
- canScrollY,
-
- scrollWidth = el.scrollWidth,
- scrollHeight = el.scrollHeight,
-
- elCSS = css(el),
-
- scrollPosX = el.scrollLeft,
- scrollPosY = el.scrollTop;
-
-
- if (el === winScroller) {
- canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');
- canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');
- } else {
- canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');
- canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');
- }
-
- let vx = canScrollX && (Math.abs(right - x) <= sens && (scrollPosX + width) < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);
- let vy = canScrollY && (Math.abs(bottom - y) <= sens && (scrollPosY + height) < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);
-
-
- if (!autoScrolls[layersOut]) {
- for (let i = 0; i <= layersOut; i++) {
- if (!autoScrolls[i]) {
- autoScrolls[i] = {};
- }
- }
- }
-
- if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {
- autoScrolls[layersOut].el = el;
- autoScrolls[layersOut].vx = vx;
- autoScrolls[layersOut].vy = vy;
-
- clearInterval(autoScrolls[layersOut].pid);
-
- if (vx != 0 || vy != 0) {
- scrollThisInstance = true;
- /* jshint loopfunc:true */
- autoScrolls[layersOut].pid = setInterval((function () {
- // emulate drag over during autoscroll (fallback), emulating native DnD behaviour
- if (isFallback && this.layer === 0) {
- Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely
- }
- let scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;
- let scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;
-
- if (typeof(scrollCustomFn) === 'function') {
- if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {
- return;
- }
- }
-
- scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);
- }).bind({layer: layersOut}), 24);
- }
- }
- layersOut++;
- } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));
- scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not
-}, 30);
+ nulling() {
+ touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;
-const drop = function({
- originalEvent,
- putSortable,
- dragEl,
- activeSortable,
- dispatchSortableEvent,
- hideGhostForTarget,
- unhideGhostForTarget
-}) {
- if (!originalEvent) return;
- let toSortable = putSortable || activeSortable;
- hideGhostForTarget();
- let touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;
- let target = document.elementFromPoint(touch.clientX, touch.clientY);
- unhideGhostForTarget();
- if (toSortable && !toSortable.el.contains(target)) {
- dispatchSortableEvent('spill');
- this.onSpill({ dragEl, putSortable });
- }
-};
+ autoScrolls.length = 0;
+ },
-function Revert() {}
+ _handleFallbackAutoScroll(evt) {
+ this._handleAutoScroll(evt, true);
+ },
+
+ _handleAutoScroll(evt, fallback) {
+ const x = (evt.touches ? evt.touches[0] : evt).clientX,
+ y = (evt.touches ? evt.touches[0] : evt).clientY,
+ elem = document.elementFromPoint(x, y);
+
+ touchEvt$1 = evt;
+
+ // IE does not seem to have native autoscroll,
+ // Edge's autoscroll seems too conditional,
+ // MACOS Safari does not have autoscroll,
+ // Firefox and Chrome are good
+ if (fallback || Edge || IE11OrLess || Safari) {
+ autoScroll(evt, this.options, elem, fallback);
+
+ // Listener for pointer element change
+ let ogElemScroller = getParentAutoScrollElement(elem, true);
+ if (
+ scrolling &&
+ (!pointerElemChangedInterval ||
+ x !== lastAutoScrollX ||
+ y !== lastAutoScrollY)
+ ) {
+ pointerElemChangedInterval && clearPointerElemChangedInterval();
+ // Detect for pointer elem change, emulating native DnD behaviour
+ pointerElemChangedInterval = setInterval(() => {
+ let newElem = getParentAutoScrollElement(
+ document.elementFromPoint(x, y),
+ true
+ );
+ if (newElem !== ogElemScroller) {
+ ogElemScroller = newElem;
+ clearAutoScrolls();
+ }
+ autoScroll(evt, this.options, newElem, fallback);
+ }, 10);
+ lastAutoScrollX = x;
+ lastAutoScrollY = y;
+ }
+ } else {
+ // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll
+ if (
+ !this.options.bubbleScroll ||
+ getParentAutoScrollElement(elem, true) === getWindowScrollingElement()
+ ) {
+ clearAutoScrolls();
+ return;
+ }
+ autoScroll(
+ evt,
+ this.options,
+ getParentAutoScrollElement(elem, false),
+ false
+ );
+ }
+ },
+ };
+
+ return Object.assign(AutoScroll, {
+ pluginName: "scroll",
+ initializeByDefault: true,
+ });
+}
+
+function clearAutoScrolls() {
+ autoScrolls.forEach(function (autoScroll) {
+ clearInterval(autoScroll.pid);
+ });
+ autoScrolls = [];
+}
+
+function clearPointerElemChangedInterval() {
+ clearInterval(pointerElemChangedInterval);
+}
+
+const autoScroll = throttle(function (evt, options, rootEl, isFallback) {
+ // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
+ if (!options.scroll) return;
+ const x = (evt.touches ? evt.touches[0] : evt).clientX,
+ y = (evt.touches ? evt.touches[0] : evt).clientY,
+ sens = options.scrollSensitivity,
+ speed = options.scrollSpeed,
+ winScroller = getWindowScrollingElement();
+
+ let scrollThisInstance = false,
+ scrollCustomFn;
+
+ // New scroll root, set scrollEl
+ if (scrollRootEl !== rootEl) {
+ scrollRootEl = rootEl;
+
+ clearAutoScrolls();
+
+ scrollEl = options.scroll;
+ scrollCustomFn = options.scrollFn;
+
+ if (scrollEl === true) {
+ scrollEl = getParentAutoScrollElement(rootEl, true);
+ }
+ }
+
+ let layersOut = 0;
+ let currentParent = scrollEl;
+ do {
+ let el = currentParent,
+ rect = getRect(el),
+ top = rect.top,
+ bottom = rect.bottom,
+ left = rect.left,
+ right = rect.right,
+ width = rect.width,
+ height = rect.height,
+ canScrollX,
+ canScrollY,
+ scrollWidth = el.scrollWidth,
+ scrollHeight = el.scrollHeight,
+ elCSS = css(el),
+ scrollPosX = el.scrollLeft,
+ scrollPosY = el.scrollTop;
+
+ if (el === winScroller) {
+ canScrollX =
+ width < scrollWidth &&
+ (elCSS.overflowX === "auto" ||
+ elCSS.overflowX === "scroll" ||
+ elCSS.overflowX === "visible");
+ canScrollY =
+ height < scrollHeight &&
+ (elCSS.overflowY === "auto" ||
+ elCSS.overflowY === "scroll" ||
+ elCSS.overflowY === "visible");
+ } else {
+ canScrollX =
+ width < scrollWidth &&
+ (elCSS.overflowX === "auto" || elCSS.overflowX === "scroll");
+ canScrollY =
+ height < scrollHeight &&
+ (elCSS.overflowY === "auto" || elCSS.overflowY === "scroll");
+ }
+
+ let vx =
+ canScrollX &&
+ (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) -
+ (Math.abs(left - x) <= sens && !!scrollPosX);
+ let vy =
+ canScrollY &&
+ (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) -
+ (Math.abs(top - y) <= sens && !!scrollPosY);
+
+ if (!autoScrolls[layersOut]) {
+ for (let i = 0; i <= layersOut; i++) {
+ if (!autoScrolls[i]) {
+ autoScrolls[i] = {};
+ }
+ }
+ }
+
+ if (
+ autoScrolls[layersOut].vx != vx ||
+ autoScrolls[layersOut].vy != vy ||
+ autoScrolls[layersOut].el !== el
+ ) {
+ autoScrolls[layersOut].el = el;
+ autoScrolls[layersOut].vx = vx;
+ autoScrolls[layersOut].vy = vy;
+
+ clearInterval(autoScrolls[layersOut].pid);
+
+ if (vx != 0 || vy != 0) {
+ scrollThisInstance = true;
+ /* jshint loopfunc:true */
+ autoScrolls[layersOut].pid = setInterval(
+ function () {
+ // emulate drag over during autoscroll (fallback), emulating native DnD behaviour
+ if (isFallback && this.layer === 0) {
+ Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely
+ }
+ let scrollOffsetY = autoScrolls[this.layer].vy
+ ? autoScrolls[this.layer].vy * speed
+ : 0;
+ let scrollOffsetX = autoScrolls[this.layer].vx
+ ? autoScrolls[this.layer].vx * speed
+ : 0;
+
+ if (typeof scrollCustomFn === "function") {
+ if (
+ scrollCustomFn.call(
+ Sortable.dragged.parentNode[expando],
+ scrollOffsetX,
+ scrollOffsetY,
+ evt,
+ touchEvt$1,
+ autoScrolls[this.layer].el
+ ) !== "continue"
+ ) {
+ return;
+ }
+ }
+
+ scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);
+ }.bind({ layer: layersOut }),
+ 24
+ );
+ }
+ }
+ layersOut++;
+ } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));
+ scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not
+}, 30);
+
+const drop = function ({
+ originalEvent,
+ putSortable,
+ dragEl,
+ activeSortable,
+ dispatchSortableEvent,
+ hideGhostForTarget,
+ unhideGhostForTarget,
+}) {
+ if (!originalEvent) return;
+ let toSortable = putSortable || activeSortable;
+ hideGhostForTarget();
+ let touch =
+ originalEvent.changedTouches && originalEvent.changedTouches.length
+ ? originalEvent.changedTouches[0]
+ : originalEvent;
+ let target = document.elementFromPoint(touch.clientX, touch.clientY);
+ unhideGhostForTarget();
+ if (toSortable && !toSortable.el.contains(target)) {
+ dispatchSortableEvent("spill");
+ this.onSpill({ dragEl, putSortable });
+ }
+};
+
+function Revert() {}
Revert.prototype = {
- startIndex: null,
- dragStart({ oldDraggableIndex }) {
- this.startIndex = oldDraggableIndex;
- },
- onSpill({ dragEl, putSortable }) {
- this.sortable.captureAnimationState();
- if (putSortable) {
- putSortable.captureAnimationState();
- }
- let nextSibling = getChild(this.sortable.el, this.startIndex, this.options);
-
- if (nextSibling) {
- this.sortable.el.insertBefore(dragEl, nextSibling);
- } else {
- this.sortable.el.appendChild(dragEl);
- }
- this.sortable.animateAll();
- if (putSortable) {
- putSortable.animateAll();
- }
- },
- drop
+ startIndex: null,
+ dragStart({ oldDraggableIndex }) {
+ this.startIndex = oldDraggableIndex;
+ },
+ onSpill({ dragEl, putSortable }) {
+ this.sortable.captureAnimationState();
+ if (putSortable) {
+ putSortable.captureAnimationState();
+ }
+ let nextSibling = getChild(this.sortable.el, this.startIndex, this.options);
+
+ if (nextSibling) {
+ this.sortable.el.insertBefore(dragEl, nextSibling);
+ } else {
+ this.sortable.el.appendChild(dragEl);
+ }
+ this.sortable.animateAll();
+ if (putSortable) {
+ putSortable.animateAll();
+ }
+ },
+ drop,
};
Object.assign(Revert, {
- pluginName: 'revertOnSpill'
+ pluginName: "revertOnSpill",
});
-
function Remove() {}
Remove.prototype = {
- onSpill({ dragEl, putSortable }) {
- const parentSortable = putSortable || this.sortable;
- parentSortable.captureAnimationState();
- dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);
- parentSortable.animateAll();
- },
- drop
+ onSpill({ dragEl, putSortable }) {
+ const parentSortable = putSortable || this.sortable;
+ parentSortable.captureAnimationState();
+ dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);
+ parentSortable.animateAll();
+ },
+ drop,
};
Object.assign(Remove, {
- pluginName: 'removeOnSpill'
+ pluginName: "removeOnSpill",
});
let lastSwapEl;
-
function SwapPlugin() {
- function Swap() {
- this.defaults = {
- swapClass: 'sortable-swap-highlight'
- };
- }
-
- Swap.prototype = {
- dragStart({ dragEl }) {
- lastSwapEl = dragEl;
- },
- dragOverValid({ completed, target, onMove, activeSortable, changed, cancel }) {
- if (!activeSortable.options.swap) return;
- let el = this.sortable.el,
- options = this.options;
- if (target && target !== el) {
- let prevSwapEl = lastSwapEl;
- if (onMove(target) !== false) {
- toggleClass(target, options.swapClass, true);
- lastSwapEl = target;
- } else {
- lastSwapEl = null;
- }
-
- if (prevSwapEl && prevSwapEl !== lastSwapEl) {
- toggleClass(prevSwapEl, options.swapClass, false);
- }
- }
- changed();
-
- completed(true);
- cancel();
- },
- drop({ activeSortable, putSortable, dragEl }) {
- let toSortable = (putSortable || this.sortable);
- let options = this.options;
- lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);
- if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {
- if (dragEl !== lastSwapEl) {
- toSortable.captureAnimationState();
- if (toSortable !== activeSortable) activeSortable.captureAnimationState();
- swapNodes(dragEl, lastSwapEl);
-
- toSortable.animateAll();
- if (toSortable !== activeSortable) activeSortable.animateAll();
- }
- }
- },
- nulling() {
- lastSwapEl = null;
- }
- };
-
- return Object.assign(Swap, {
- pluginName: 'swap',
- eventProperties() {
- return {
- swapItem: lastSwapEl
- };
- }
- });
-}
+ function Swap() {
+ this.defaults = {
+ swapClass: "sortable-swap-highlight",
+ };
+ }
+
+ Swap.prototype = {
+ dragStart({ dragEl }) {
+ lastSwapEl = dragEl;
+ },
+ dragOverValid({
+ completed,
+ target,
+ onMove,
+ activeSortable,
+ changed,
+ cancel,
+ }) {
+ if (!activeSortable.options.swap) return;
+ let el = this.sortable.el,
+ options = this.options;
+ if (target && target !== el) {
+ let prevSwapEl = lastSwapEl;
+ if (onMove(target) !== false) {
+ toggleClass(target, options.swapClass, true);
+ lastSwapEl = target;
+ } else {
+ lastSwapEl = null;
+ }
+
+ if (prevSwapEl && prevSwapEl !== lastSwapEl) {
+ toggleClass(prevSwapEl, options.swapClass, false);
+ }
+ }
+ changed();
+ completed(true);
+ cancel();
+ },
+ drop({ activeSortable, putSortable, dragEl }) {
+ let toSortable = putSortable || this.sortable;
+ let options = this.options;
+ lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);
+ if (
+ lastSwapEl &&
+ (options.swap || (putSortable && putSortable.options.swap))
+ ) {
+ if (dragEl !== lastSwapEl) {
+ toSortable.captureAnimationState();
+ if (toSortable !== activeSortable)
+ activeSortable.captureAnimationState();
+ swapNodes(dragEl, lastSwapEl);
+
+ toSortable.animateAll();
+ if (toSortable !== activeSortable) activeSortable.animateAll();
+ }
+ }
+ },
+ nulling() {
+ lastSwapEl = null;
+ },
+ };
+
+ return Object.assign(Swap, {
+ pluginName: "swap",
+ eventProperties() {
+ return {
+ swapItem: lastSwapEl,
+ };
+ },
+ });
+}
function swapNodes(n1, n2) {
- let p1 = n1.parentNode,
- p2 = n2.parentNode,
- i1, i2;
+ let p1 = n1.parentNode,
+ p2 = n2.parentNode,
+ i1,
+ i2;
- if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;
+ if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;
- i1 = index(n1);
- i2 = index(n2);
+ i1 = index(n1);
+ i2 = index(n2);
- if (p1.isEqualNode(p2) && i1 < i2) {
- i2++;
- }
- p1.insertBefore(n2, p1.children[i1]);
- p2.insertBefore(n1, p2.children[i2]);
+ if (p1.isEqualNode(p2) && i1 < i2) {
+ i2++;
+ }
+ p1.insertBefore(n2, p1.children[i1]);
+ p2.insertBefore(n1, p2.children[i2]);
}
let multiDragElements = [],
- multiDragClones = [],
- lastMultiDragSelect, // for selection with modifier key down (SHIFT)
- multiDragSortable,
- initialFolding = false, // Initial multi-drag fold when drag started
- folding = false, // Folding any other time
- dragStarted = false,
- dragEl$1,
- clonesFromRect,
- clonesHidden;
+ multiDragClones = [],
+ lastMultiDragSelect, // for selection with modifier key down (SHIFT)
+ multiDragSortable,
+ initialFolding = false, // Initial multi-drag fold when drag started
+ folding = false, // Folding any other time
+ dragStarted = false,
+ dragEl$1,
+ clonesFromRect,
+ clonesHidden;
function MultiDragPlugin() {
- function MultiDrag(sortable) {
- // Bind all private methods
- for (let fn in this) {
- if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
- this[fn] = this[fn].bind(this);
- }
- }
-
- if (sortable.options.supportPointer) {
- on(document, 'pointerup', this._deselectMultiDrag);
- } else {
- on(document, 'mouseup', this._deselectMultiDrag);
- on(document, 'touchend', this._deselectMultiDrag);
- }
-
- on(document, 'keydown', this._checkKeyDown);
- on(document, 'keyup', this._checkKeyUp);
-
- this.defaults = {
- selectedClass: 'sortable-selected',
- multiDragKey: null,
- setData(dataTransfer, dragEl) {
- let data = '';
- if (multiDragElements.length && multiDragSortable === sortable) {
- multiDragElements.forEach((multiDragElement, i) => {
- data += (!i ? '' : ', ') + multiDragElement.textContent;
- });
- } else {
- data = dragEl.textContent;
- }
- dataTransfer.setData('Text', data);
- }
- };
- }
-
- MultiDrag.prototype = {
- multiDragKeyDown: false,
- isMultiDrag: false,
-
-
- delayStartGlobal({ dragEl: dragged }) {
- dragEl$1 = dragged;
- },
-
- delayEnded() {
- this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);
- },
-
- setupClone({ sortable, cancel }) {
- if (!this.isMultiDrag) return;
- for (let i = 0; i < multiDragElements.length; i++) {
- multiDragClones.push(clone(multiDragElements[i]));
-
- multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;
-
- multiDragClones[i].draggable = false;
- multiDragClones[i].style['will-change'] = '';
-
- toggleClass(multiDragClones[i], this.options.selectedClass, false);
- multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);
- }
-
- sortable._hideClone();
- cancel();
- },
-
- clone({ sortable, rootEl, dispatchSortableEvent, cancel }) {
- if (!this.isMultiDrag) return;
- if (!this.options.removeCloneOnHide) {
- if (multiDragElements.length && multiDragSortable === sortable) {
- insertMultiDragClones(true, rootEl);
- dispatchSortableEvent('clone');
-
- cancel();
- }
- }
- },
-
- showClone({ cloneNowShown, rootEl, cancel }) {
- if (!this.isMultiDrag) return;
- insertMultiDragClones(false, rootEl);
- multiDragClones.forEach(clone => {
- css(clone, 'display', '');
- });
-
- cloneNowShown();
- clonesHidden = false;
- cancel();
- },
-
- hideClone({ sortable, cloneNowHidden, cancel }) {
- if (!this.isMultiDrag) return;
- multiDragClones.forEach(clone => {
- css(clone, 'display', 'none');
- if (this.options.removeCloneOnHide && clone.parentNode) {
- clone.parentNode.removeChild(clone);
- }
- });
-
- cloneNowHidden();
- clonesHidden = true;
- cancel();
- },
-
- dragStartGlobal({ sortable }) {
- if (!this.isMultiDrag && multiDragSortable) {
- multiDragSortable.multiDrag._deselectMultiDrag();
- }
-
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.sortableIndex = index(multiDragElement);
- });
-
- // Sort multi-drag elements
- multiDragElements = multiDragElements.sort(function(a, b) {
- return a.sortableIndex - b.sortableIndex;
- });
- dragStarted = true;
- },
-
- dragStarted({ sortable }) {
- if (!this.isMultiDrag) return;
- if (this.options.sort) {
- // Capture rects,
- // hide multi drag elements (by positioning them absolute),
- // set multi drag elements rects to dragRect,
- // show multi drag elements,
- // animate to rects,
- // unset rects & remove from DOM
-
- sortable.captureAnimationState();
-
- if (this.options.animation) {
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- css(multiDragElement, 'position', 'absolute');
- });
-
- let dragRect = getRect(dragEl$1, false, true, true);
-
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- setRect(multiDragElement, dragRect);
- });
-
- folding = true;
- initialFolding = true;
- }
- }
-
- sortable.animateAll(() => {
- folding = false;
- initialFolding = false;
-
- if (this.options.animation) {
- multiDragElements.forEach(multiDragElement => {
- unsetRect(multiDragElement);
- });
- }
-
- // Remove all auxiliary multidrag items from el, if sorting enabled
- if (this.options.sort) {
- removeMultiDragElements();
- }
- });
- },
-
- dragOver({ target, completed, cancel }) {
- if (folding && ~multiDragElements.indexOf(target)) {
- completed(false);
- cancel();
- }
- },
-
- revert({ fromSortable, rootEl, sortable, dragRect }) {
- if (multiDragElements.length > 1) {
- // Setup unfold animation
- multiDragElements.forEach(multiDragElement => {
- sortable.addAnimationState({
- target: multiDragElement,
- rect: folding ? getRect(multiDragElement) : dragRect
- });
-
- unsetRect(multiDragElement);
-
- multiDragElement.fromRect = dragRect;
-
- fromSortable.removeAnimationState(multiDragElement);
- });
- folding = false;
- insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);
- }
- },
-
- dragOverCompleted({ sortable, isOwner, insertion, activeSortable, parentEl, putSortable }) {
- let options = this.options;
- if (insertion) {
- // Clones must be hidden before folding animation to capture dragRectAbsolute properly
- if (isOwner) {
- activeSortable._hideClone();
- }
-
- initialFolding = false;
- // If leaving sort:false root, or already folding - Fold to new location
- if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {
- // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible
- let dragRectAbsolute = getRect(dragEl$1, false, true, true);
-
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- setRect(multiDragElement, dragRectAbsolute);
-
- // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted
- // while folding, and so that we can capture them again because old sortable will no longer be fromSortable
- parentEl.appendChild(multiDragElement);
- });
-
- folding = true;
- }
-
- // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out
- if (!isOwner) {
- // Only remove if not folding (folding will remove them anyways)
- if (!folding) {
- removeMultiDragElements();
- }
-
- if (multiDragElements.length > 1) {
- let clonesHiddenBefore = clonesHidden;
- activeSortable._showClone(sortable);
-
- // Unfold animation for clones if showing from hidden
- if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {
- multiDragClones.forEach(clone => {
- activeSortable.addAnimationState({
- target: clone,
- rect: clonesFromRect
- });
-
- clone.fromRect = clonesFromRect;
- clone.thisAnimationDuration = null;
- });
- }
- } else {
- activeSortable._showClone(sortable);
- }
- }
- }
- },
-
- dragOverAnimationCapture({ dragRect, isOwner, activeSortable }) {
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.thisAnimationDuration = null;
- });
-
- if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {
- clonesFromRect = Object.assign({}, dragRect);
- let dragMatrix = matrix(dragEl$1, true);
- clonesFromRect.top -= dragMatrix.f;
- clonesFromRect.left -= dragMatrix.e;
- }
- },
-
- dragOverAnimationComplete() {
- if (folding) {
- folding = false;
- removeMultiDragElements();
- }
- },
-
- drop({ originalEvent: evt, rootEl, parentEl, sortable, dispatchSortableEvent, oldIndex, putSortable }) {
- let toSortable = (putSortable || this.sortable);
-
- if (!evt) return;
-
- let options = this.options,
- children = parentEl.children;
-
- // Multi-drag selection
- if (!dragStarted) {
- if (options.multiDragKey && !this.multiDragKeyDown) {
- this._deselectMultiDrag();
- }
- toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));
-
- if (!~multiDragElements.indexOf(dragEl$1)) {
- multiDragElements.push(dragEl$1);
- dispatchEvent({
- sortable,
- rootEl,
- name: 'select',
- targetEl: dragEl$1,
- originalEvt: evt
- });
-
- // Modifier activated, select from last to dragEl
- if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {
- let lastIndex = index(lastMultiDragSelect),
- currentIndex = index(dragEl$1);
-
- if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {
- // Must include lastMultiDragSelect (select it), in case modified selection from no selection
- // (but previous selection existed)
- let n, i;
- if (currentIndex > lastIndex) {
- i = lastIndex;
- n = currentIndex;
- } else {
- i = currentIndex;
- n = lastIndex + 1;
- }
-
- for (; i < n; i++) {
- if (~multiDragElements.indexOf(children[i])) continue;
- toggleClass(children[i], options.selectedClass, true);
- multiDragElements.push(children[i]);
-
- dispatchEvent({
- sortable,
- rootEl,
- name: 'select',
- targetEl: children[i],
- originalEvt: evt
- });
- }
- }
- } else {
- lastMultiDragSelect = dragEl$1;
- }
-
- multiDragSortable = toSortable;
- } else {
- multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);
- lastMultiDragSelect = null;
- dispatchEvent({
- sortable,
- rootEl,
- name: 'deselect',
- targetEl: dragEl$1,
- originalEvt: evt
- });
- }
- }
-
- // Multi-drag drop
- if (dragStarted && this.isMultiDrag) {
- // Do not "unfold" after around dragEl if reverted
- if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {
- let dragRect = getRect(dragEl$1),
- multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');
-
- if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;
-
- toSortable.captureAnimationState();
-
- if (!initialFolding) {
- if (options.animation) {
- dragEl$1.fromRect = dragRect;
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.thisAnimationDuration = null;
- if (multiDragElement !== dragEl$1) {
- let rect = folding ? getRect(multiDragElement) : dragRect;
- multiDragElement.fromRect = rect;
-
- // Prepare unfold animation
- toSortable.addAnimationState({
- target: multiDragElement,
- rect: rect
- });
- }
- });
- }
-
- // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert
- // properly they must all be removed
- removeMultiDragElements();
-
- multiDragElements.forEach(multiDragElement => {
- if (children[multiDragIndex]) {
- parentEl.insertBefore(multiDragElement, children[multiDragIndex]);
- } else {
- parentEl.appendChild(multiDragElement);
- }
- multiDragIndex++;
- });
-
- // If initial folding is done, the elements may have changed position because they are now
- // unfolding around dragEl, even though dragEl may not have his index changed, so update event
- // must be fired here as Sortable will not.
- if (oldIndex === index(dragEl$1)) {
- let update = false;
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement.sortableIndex !== index(multiDragElement)) {
- update = true;
- return;
- }
- });
-
- if (update) {
- dispatchSortableEvent('update');
- }
- }
- }
-
- // Must be done after capturing individual rects (scroll bar)
- multiDragElements.forEach(multiDragElement => {
- unsetRect(multiDragElement);
- });
-
- toSortable.animateAll();
- }
-
- multiDragSortable = toSortable;
- }
-
- // Remove clones if necessary
- if (rootEl === parentEl || (putSortable && putSortable.lastPutMode !== 'clone')) {
- multiDragClones.forEach(clone => {
- clone.parentNode && clone.parentNode.removeChild(clone);
- });
- }
- },
-
- nullingGlobal() {
- this.isMultiDrag =
- dragStarted = false;
- multiDragClones.length = 0;
- },
-
- destroyGlobal() {
- this._deselectMultiDrag();
- off(document, 'pointerup', this._deselectMultiDrag);
- off(document, 'mouseup', this._deselectMultiDrag);
- off(document, 'touchend', this._deselectMultiDrag);
-
- off(document, 'keydown', this._checkKeyDown);
- off(document, 'keyup', this._checkKeyUp);
- },
-
- _deselectMultiDrag(evt) {
- if (typeof dragStarted !== "undefined" && dragStarted) return;
-
- // Only deselect if selection is in this sortable
- if (multiDragSortable !== this.sortable) return;
-
- // Only deselect if target is not item in this sortable
- if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;
-
- // Only deselect if left click
- if (evt && evt.button !== 0) return;
-
- while (multiDragElements.length) {
- let el = multiDragElements[0];
- toggleClass(el, this.options.selectedClass, false);
- multiDragElements.shift();
- dispatchEvent({
- sortable: this.sortable,
- rootEl: this.sortable.el,
- name: 'deselect',
- targetEl: el,
- originalEvt: evt
- });
- }
- },
-
- _checkKeyDown(evt) {
- if (evt.key === this.options.multiDragKey) {
- this.multiDragKeyDown = true;
- }
- },
-
- _checkKeyUp(evt) {
- if (evt.key === this.options.multiDragKey) {
- this.multiDragKeyDown = false;
- }
- }
- };
-
- return Object.assign(MultiDrag, {
- // Static methods & properties
- pluginName: 'multiDrag',
- utils: {
- /**
- * Selects the provided multi-drag item
- * @param {HTMLElement} el The element to be selected
- */
- select(el) {
- let sortable = el.parentNode[expando];
- if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;
- if (multiDragSortable && multiDragSortable !== sortable) {
- multiDragSortable.multiDrag._deselectMultiDrag();
- multiDragSortable = sortable;
- }
- toggleClass(el, sortable.options.selectedClass, true);
- multiDragElements.push(el);
- },
- /**
- * Deselects the provided multi-drag item
- * @param {HTMLElement} el The element to be deselected
- */
- deselect(el) {
- let sortable = el.parentNode[expando],
- index = multiDragElements.indexOf(el);
- if (!sortable || !sortable.options.multiDrag || !~index) return;
- toggleClass(el, sortable.options.selectedClass, false);
- multiDragElements.splice(index, 1);
- }
- },
- eventProperties() {
- const oldIndicies = [],
- newIndicies = [];
-
- multiDragElements.forEach(multiDragElement => {
- oldIndicies.push({
- multiDragElement,
- index: multiDragElement.sortableIndex
- });
-
- // multiDragElements will already be sorted if folding
- let newIndex;
- if (folding && multiDragElement !== dragEl$1) {
- newIndex = -1;
- } else if (folding) {
- newIndex = index(multiDragElement, ':not(.' + this.options.selectedClass + ')');
- } else {
- newIndex = index(multiDragElement);
- }
- newIndicies.push({
- multiDragElement,
- index: newIndex
- });
- });
- return {
- items: [...multiDragElements],
- clones: [...multiDragClones],
- oldIndicies,
- newIndicies
- };
- },
- optionListeners: {
- multiDragKey(key) {
- key = key.toLowerCase();
- if (key === 'ctrl') {
- key = 'Control';
- } else if (key.length > 1) {
- key = key.charAt(0).toUpperCase() + key.substr(1);
- }
- return key;
- }
- }
- });
+ function MultiDrag(sortable) {
+ // Bind all private methods
+ for (let fn in this) {
+ if (fn.charAt(0) === "_" && typeof this[fn] === "function") {
+ this[fn] = this[fn].bind(this);
+ }
+ }
+
+ if (sortable.options.supportPointer) {
+ on(document, "pointerup", this._deselectMultiDrag);
+ } else {
+ on(document, "mouseup", this._deselectMultiDrag);
+ on(document, "touchend", this._deselectMultiDrag);
+ }
+
+ on(document, "keydown", this._checkKeyDown);
+ on(document, "keyup", this._checkKeyUp);
+
+ this.defaults = {
+ selectedClass: "sortable-selected",
+ multiDragKey: null,
+ setData(dataTransfer, dragEl) {
+ let data = "";
+ if (multiDragElements.length && multiDragSortable === sortable) {
+ multiDragElements.forEach((multiDragElement, i) => {
+ data += (!i ? "" : ", ") + multiDragElement.textContent;
+ });
+ } else {
+ data = dragEl.textContent;
+ }
+ dataTransfer.setData("Text", data);
+ },
+ };
+ }
+
+ MultiDrag.prototype = {
+ multiDragKeyDown: false,
+ isMultiDrag: false,
+
+ delayStartGlobal({ dragEl: dragged }) {
+ dragEl$1 = dragged;
+ },
+
+ delayEnded() {
+ this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);
+ },
+
+ setupClone({ sortable, cancel }) {
+ if (!this.isMultiDrag) return;
+ for (let i = 0; i < multiDragElements.length; i++) {
+ multiDragClones.push(clone(multiDragElements[i]));
+
+ multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;
+
+ multiDragClones[i].draggable = false;
+ multiDragClones[i].style["will-change"] = "";
+
+ toggleClass(multiDragClones[i], this.options.selectedClass, false);
+ multiDragElements[i] === dragEl$1 &&
+ toggleClass(multiDragClones[i], this.options.chosenClass, false);
+ }
+
+ sortable._hideClone();
+ cancel();
+ },
+
+ clone({ sortable, rootEl, dispatchSortableEvent, cancel }) {
+ if (!this.isMultiDrag) return;
+ if (!this.options.removeCloneOnHide) {
+ if (multiDragElements.length && multiDragSortable === sortable) {
+ insertMultiDragClones(true, rootEl);
+ dispatchSortableEvent("clone");
+
+ cancel();
+ }
+ }
+ },
+
+ showClone({ cloneNowShown, rootEl, cancel }) {
+ if (!this.isMultiDrag) return;
+ insertMultiDragClones(false, rootEl);
+ multiDragClones.forEach((clone) => {
+ css(clone, "display", "");
+ });
+
+ cloneNowShown();
+ clonesHidden = false;
+ cancel();
+ },
+
+ hideClone({ sortable, cloneNowHidden, cancel }) {
+ if (!this.isMultiDrag) return;
+ multiDragClones.forEach((clone) => {
+ css(clone, "display", "none");
+ if (this.options.removeCloneOnHide && clone.parentNode) {
+ clone.parentNode.removeChild(clone);
+ }
+ });
+
+ cloneNowHidden();
+ clonesHidden = true;
+ cancel();
+ },
+
+ dragStartGlobal({ sortable }) {
+ if (!this.isMultiDrag && multiDragSortable) {
+ multiDragSortable.multiDrag._deselectMultiDrag();
+ }
+
+ multiDragElements.forEach((multiDragElement) => {
+ multiDragElement.sortableIndex = index(multiDragElement);
+ });
+
+ // Sort multi-drag elements
+ multiDragElements = multiDragElements.sort(function (a, b) {
+ return a.sortableIndex - b.sortableIndex;
+ });
+ dragStarted = true;
+ },
+
+ dragStarted({ sortable }) {
+ if (!this.isMultiDrag) return;
+ if (this.options.sort) {
+ // Capture rects,
+ // hide multi drag elements (by positioning them absolute),
+ // set multi drag elements rects to dragRect,
+ // show multi drag elements,
+ // animate to rects,
+ // unset rects & remove from DOM
+
+ sortable.captureAnimationState();
+
+ if (this.options.animation) {
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ css(multiDragElement, "position", "absolute");
+ });
+
+ let dragRect = getRect(dragEl$1, false, true, true);
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ setRect(multiDragElement, dragRect);
+ });
+
+ folding = true;
+ initialFolding = true;
+ }
+ }
+
+ sortable.animateAll(() => {
+ folding = false;
+ initialFolding = false;
+
+ if (this.options.animation) {
+ multiDragElements.forEach((multiDragElement) => {
+ unsetRect(multiDragElement);
+ });
+ }
+
+ // Remove all auxiliary multidrag items from el, if sorting enabled
+ if (this.options.sort) {
+ removeMultiDragElements();
+ }
+ });
+ },
+
+ dragOver({ target, completed, cancel }) {
+ if (folding && ~multiDragElements.indexOf(target)) {
+ completed(false);
+ cancel();
+ }
+ },
+
+ revert({ fromSortable, rootEl, sortable, dragRect }) {
+ if (multiDragElements.length > 1) {
+ // Setup unfold animation
+ multiDragElements.forEach((multiDragElement) => {
+ sortable.addAnimationState({
+ target: multiDragElement,
+ rect: folding ? getRect(multiDragElement) : dragRect,
+ });
+
+ unsetRect(multiDragElement);
+
+ multiDragElement.fromRect = dragRect;
+
+ fromSortable.removeAnimationState(multiDragElement);
+ });
+ folding = false;
+ insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);
+ }
+ },
+
+ dragOverCompleted({
+ sortable,
+ isOwner,
+ insertion,
+ activeSortable,
+ parentEl,
+ putSortable,
+ }) {
+ let options = this.options;
+ if (insertion) {
+ // Clones must be hidden before folding animation to capture dragRectAbsolute properly
+ if (isOwner) {
+ activeSortable._hideClone();
+ }
+
+ initialFolding = false;
+ // If leaving sort:false root, or already folding - Fold to new location
+ if (
+ options.animation &&
+ multiDragElements.length > 1 &&
+ (folding ||
+ (!isOwner && !activeSortable.options.sort && !putSortable))
+ ) {
+ // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible
+ let dragRectAbsolute = getRect(dragEl$1, false, true, true);
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ setRect(multiDragElement, dragRectAbsolute);
+
+ // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted
+ // while folding, and so that we can capture them again because old sortable will no longer be fromSortable
+ parentEl.appendChild(multiDragElement);
+ });
+
+ folding = true;
+ }
+
+ // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out
+ if (!isOwner) {
+ // Only remove if not folding (folding will remove them anyways)
+ if (!folding) {
+ removeMultiDragElements();
+ }
+
+ if (multiDragElements.length > 1) {
+ let clonesHiddenBefore = clonesHidden;
+ activeSortable._showClone(sortable);
+
+ // Unfold animation for clones if showing from hidden
+ if (
+ activeSortable.options.animation &&
+ !clonesHidden &&
+ clonesHiddenBefore
+ ) {
+ multiDragClones.forEach((clone) => {
+ activeSortable.addAnimationState({
+ target: clone,
+ rect: clonesFromRect,
+ });
+
+ clone.fromRect = clonesFromRect;
+ clone.thisAnimationDuration = null;
+ });
+ }
+ } else {
+ activeSortable._showClone(sortable);
+ }
+ }
+ }
+ },
+
+ dragOverAnimationCapture({ dragRect, isOwner, activeSortable }) {
+ multiDragElements.forEach((multiDragElement) => {
+ multiDragElement.thisAnimationDuration = null;
+ });
+
+ if (
+ activeSortable.options.animation &&
+ !isOwner &&
+ activeSortable.multiDrag.isMultiDrag
+ ) {
+ clonesFromRect = Object.assign({}, dragRect);
+ let dragMatrix = matrix(dragEl$1, true);
+ clonesFromRect.top -= dragMatrix.f;
+ clonesFromRect.left -= dragMatrix.e;
+ }
+ },
+
+ dragOverAnimationComplete() {
+ if (folding) {
+ folding = false;
+ removeMultiDragElements();
+ }
+ },
+
+ drop({
+ originalEvent: evt,
+ rootEl,
+ parentEl,
+ sortable,
+ dispatchSortableEvent,
+ oldIndex,
+ putSortable,
+ }) {
+ let toSortable = putSortable || this.sortable;
+
+ if (!evt) return;
+
+ let options = this.options,
+ children = parentEl.children;
+
+ // Multi-drag selection
+ if (!dragStarted) {
+ if (options.multiDragKey && !this.multiDragKeyDown) {
+ this._deselectMultiDrag();
+ }
+ toggleClass(
+ dragEl$1,
+ options.selectedClass,
+ !~multiDragElements.indexOf(dragEl$1)
+ );
+
+ if (!~multiDragElements.indexOf(dragEl$1)) {
+ multiDragElements.push(dragEl$1);
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "select",
+ targetEl: dragEl$1,
+ originalEvt: evt,
+ });
+
+ // Modifier activated, select from last to dragEl
+ if (
+ evt.shiftKey &&
+ lastMultiDragSelect &&
+ sortable.el.contains(lastMultiDragSelect)
+ ) {
+ let lastIndex = index(lastMultiDragSelect),
+ currentIndex = index(dragEl$1);
+
+ if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {
+ // Must include lastMultiDragSelect (select it), in case modified selection from no selection
+ // (but previous selection existed)
+ let n, i;
+ if (currentIndex > lastIndex) {
+ i = lastIndex;
+ n = currentIndex;
+ } else {
+ i = currentIndex;
+ n = lastIndex + 1;
+ }
+
+ for (; i < n; i++) {
+ if (~multiDragElements.indexOf(children[i])) continue;
+ toggleClass(children[i], options.selectedClass, true);
+ multiDragElements.push(children[i]);
+
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "select",
+ targetEl: children[i],
+ originalEvt: evt,
+ });
+ }
+ }
+ } else {
+ lastMultiDragSelect = dragEl$1;
+ }
+
+ multiDragSortable = toSortable;
+ } else {
+ multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);
+ lastMultiDragSelect = null;
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "deselect",
+ targetEl: dragEl$1,
+ originalEvt: evt,
+ });
+ }
+ }
+
+ // Multi-drag drop
+ if (dragStarted && this.isMultiDrag) {
+ // Do not "unfold" after around dragEl if reverted
+ if (
+ (parentEl[expando].options.sort || parentEl !== rootEl) &&
+ multiDragElements.length > 1
+ ) {
+ let dragRect = getRect(dragEl$1),
+ multiDragIndex = index(
+ dragEl$1,
+ ":not(." + this.options.selectedClass + ")"
+ );
+
+ if (!initialFolding && options.animation)
+ dragEl$1.thisAnimationDuration = null;
+
+ toSortable.captureAnimationState();
+
+ if (!initialFolding) {
+ if (options.animation) {
+ dragEl$1.fromRect = dragRect;
+ multiDragElements.forEach((multiDragElement) => {
+ multiDragElement.thisAnimationDuration = null;
+ if (multiDragElement !== dragEl$1) {
+ let rect = folding ? getRect(multiDragElement) : dragRect;
+ multiDragElement.fromRect = rect;
+
+ // Prepare unfold animation
+ toSortable.addAnimationState({
+ target: multiDragElement,
+ rect: rect,
+ });
+ }
+ });
+ }
+
+ // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert
+ // properly they must all be removed
+ removeMultiDragElements();
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (children[multiDragIndex]) {
+ parentEl.insertBefore(
+ multiDragElement,
+ children[multiDragIndex]
+ );
+ } else {
+ parentEl.appendChild(multiDragElement);
+ }
+ multiDragIndex++;
+ });
+
+ // If initial folding is done, the elements may have changed position because they are now
+ // unfolding around dragEl, even though dragEl may not have his index changed, so update event
+ // must be fired here as Sortable will not.
+ if (oldIndex === index(dragEl$1)) {
+ let update = false;
+ multiDragElements.forEach((multiDragElement) => {
+ if (
+ multiDragElement.sortableIndex !== index(multiDragElement)
+ ) {
+ update = true;
+ return;
+ }
+ });
+
+ if (update) {
+ dispatchSortableEvent("update");
+ }
+ }
+ }
+
+ // Must be done after capturing individual rects (scroll bar)
+ multiDragElements.forEach((multiDragElement) => {
+ unsetRect(multiDragElement);
+ });
+
+ toSortable.animateAll();
+ }
+
+ multiDragSortable = toSortable;
+ }
+
+ // Remove clones if necessary
+ if (
+ rootEl === parentEl ||
+ (putSortable && putSortable.lastPutMode !== "clone")
+ ) {
+ multiDragClones.forEach((clone) => {
+ clone.parentNode && clone.parentNode.removeChild(clone);
+ });
+ }
+ },
+
+ nullingGlobal() {
+ this.isMultiDrag = dragStarted = false;
+ multiDragClones.length = 0;
+ },
+
+ destroyGlobal() {
+ this._deselectMultiDrag();
+ off(document, "pointerup", this._deselectMultiDrag);
+ off(document, "mouseup", this._deselectMultiDrag);
+ off(document, "touchend", this._deselectMultiDrag);
+
+ off(document, "keydown", this._checkKeyDown);
+ off(document, "keyup", this._checkKeyUp);
+ },
+
+ _deselectMultiDrag(evt) {
+ if (typeof dragStarted !== "undefined" && dragStarted) return;
+
+ // Only deselect if selection is in this sortable
+ if (multiDragSortable !== this.sortable) return;
+
+ // Only deselect if target is not item in this sortable
+ if (
+ evt &&
+ closest(evt.target, this.options.draggable, this.sortable.el, false)
+ )
+ return;
+
+ // Only deselect if left click
+ if (evt && evt.button !== 0) return;
+
+ while (multiDragElements.length) {
+ let el = multiDragElements[0];
+ toggleClass(el, this.options.selectedClass, false);
+ multiDragElements.shift();
+ dispatchEvent({
+ sortable: this.sortable,
+ rootEl: this.sortable.el,
+ name: "deselect",
+ targetEl: el,
+ originalEvt: evt,
+ });
+ }
+ },
+
+ _checkKeyDown(evt) {
+ if (evt.key === this.options.multiDragKey) {
+ this.multiDragKeyDown = true;
+ }
+ },
+
+ _checkKeyUp(evt) {
+ if (evt.key === this.options.multiDragKey) {
+ this.multiDragKeyDown = false;
+ }
+ },
+ };
+
+ return Object.assign(MultiDrag, {
+ // Static methods & properties
+ pluginName: "multiDrag",
+ utils: {
+ /**
+ * Selects the provided multi-drag item
+ * @param {HTMLElement} el The element to be selected
+ */
+ select(el) {
+ let sortable = el.parentNode[expando];
+ if (
+ !sortable ||
+ !sortable.options.multiDrag ||
+ ~multiDragElements.indexOf(el)
+ )
+ return;
+ if (multiDragSortable && multiDragSortable !== sortable) {
+ multiDragSortable.multiDrag._deselectMultiDrag();
+ multiDragSortable = sortable;
+ }
+ toggleClass(el, sortable.options.selectedClass, true);
+ multiDragElements.push(el);
+ },
+ /**
+ * Deselects the provided multi-drag item
+ * @param {HTMLElement} el The element to be deselected
+ */
+ deselect(el) {
+ let sortable = el.parentNode[expando],
+ index = multiDragElements.indexOf(el);
+ if (!sortable || !sortable.options.multiDrag || !~index) return;
+ toggleClass(el, sortable.options.selectedClass, false);
+ multiDragElements.splice(index, 1);
+ },
+ },
+ eventProperties() {
+ const oldIndicies = [],
+ newIndicies = [];
+
+ multiDragElements.forEach((multiDragElement) => {
+ oldIndicies.push({
+ multiDragElement,
+ index: multiDragElement.sortableIndex,
+ });
+
+ // multiDragElements will already be sorted if folding
+ let newIndex;
+ if (folding && multiDragElement !== dragEl$1) {
+ newIndex = -1;
+ } else if (folding) {
+ newIndex = index(
+ multiDragElement,
+ ":not(." + this.options.selectedClass + ")"
+ );
+ } else {
+ newIndex = index(multiDragElement);
+ }
+ newIndicies.push({
+ multiDragElement,
+ index: newIndex,
+ });
+ });
+ return {
+ items: [...multiDragElements],
+ clones: [...multiDragClones],
+ oldIndicies,
+ newIndicies,
+ };
+ },
+ optionListeners: {
+ multiDragKey(key) {
+ key = key.toLowerCase();
+ if (key === "ctrl") {
+ key = "Control";
+ } else if (key.length > 1) {
+ key = key.charAt(0).toUpperCase() + key.substr(1);
+ }
+ return key;
+ },
+ },
+ });
}
function insertMultiDragElements(clonesInserted, rootEl) {
- multiDragElements.forEach((multiDragElement, i) => {
- let target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];
- if (target) {
- rootEl.insertBefore(multiDragElement, target);
- } else {
- rootEl.appendChild(multiDragElement);
- }
- });
+ multiDragElements.forEach((multiDragElement, i) => {
+ let target =
+ rootEl.children[
+ multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)
+ ];
+ if (target) {
+ rootEl.insertBefore(multiDragElement, target);
+ } else {
+ rootEl.appendChild(multiDragElement);
+ }
+ });
}
/**
@@ -3910,21 +4069,23 @@ function insertMultiDragElements(clonesInserted, rootEl) {
* @param {HTMLElement} rootEl
*/
function insertMultiDragClones(elementsInserted, rootEl) {
- multiDragClones.forEach((clone, i) => {
- let target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];
- if (target) {
- rootEl.insertBefore(clone, target);
- } else {
- rootEl.appendChild(clone);
- }
- });
+ multiDragClones.forEach((clone, i) => {
+ let target =
+ rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];
+ if (target) {
+ rootEl.insertBefore(clone, target);
+ } else {
+ rootEl.appendChild(clone);
+ }
+ });
}
function removeMultiDragElements() {
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl$1) return;
- multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);
- });
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl$1) return;
+ multiDragElement.parentNode &&
+ multiDragElement.parentNode.removeChild(multiDragElement);
+ });
}
Sortable.mount(new AutoScrollPlugin());
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 956f0e673..000000000
--- a/package-lock.json
+++ /dev/null
@@ -1,5915 +0,0 @@
-{
- "name": "sortablejs",
- "version": "1.11.0",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
- "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.0.0"
- }
- },
- "@babel/core": {
- "version": "7.4.5",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz",
- "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/generator": "^7.4.4",
- "@babel/helpers": "^7.4.4",
- "@babel/parser": "^7.4.5",
- "@babel/template": "^7.4.4",
- "@babel/traverse": "^7.4.5",
- "@babel/types": "^7.4.4",
- "convert-source-map": "^1.1.0",
- "debug": "^4.1.0",
- "json5": "^2.1.0",
- "lodash": "^4.17.11",
- "resolve": "^1.3.2",
- "semver": "^5.4.1",
- "source-map": "^0.5.0"
- }
- },
- "@babel/generator": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz",
- "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.4.4",
- "jsesc": "^2.5.1",
- "lodash": "^4.17.11",
- "source-map": "^0.5.0",
- "trim-right": "^1.0.1"
- }
- },
- "@babel/helper-annotate-as-pure": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz",
- "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz",
- "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==",
- "dev": true,
- "requires": {
- "@babel/helper-explode-assignable-expression": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-call-delegate": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz",
- "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==",
- "dev": true,
- "requires": {
- "@babel/helper-hoist-variables": "^7.4.4",
- "@babel/traverse": "^7.4.4",
- "@babel/types": "^7.4.4"
- }
- },
- "@babel/helper-define-map": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz",
- "integrity": "sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==",
- "dev": true,
- "requires": {
- "@babel/helper-function-name": "^7.1.0",
- "@babel/types": "^7.4.4",
- "lodash": "^4.17.11"
- }
- },
- "@babel/helper-explode-assignable-expression": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz",
- "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==",
- "dev": true,
- "requires": {
- "@babel/traverse": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-function-name": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
- "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
- "dev": true,
- "requires": {
- "@babel/helper-get-function-arity": "^7.0.0",
- "@babel/template": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-get-function-arity": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
- "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-hoist-variables": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz",
- "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.4.4"
- }
- },
- "@babel/helper-member-expression-to-functions": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz",
- "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-module-imports": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz",
- "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-module-transforms": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz",
- "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==",
- "dev": true,
- "requires": {
- "@babel/helper-module-imports": "^7.0.0",
- "@babel/helper-simple-access": "^7.1.0",
- "@babel/helper-split-export-declaration": "^7.4.4",
- "@babel/template": "^7.4.4",
- "@babel/types": "^7.4.4",
- "lodash": "^4.17.11"
- }
- },
- "@babel/helper-optimise-call-expression": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz",
- "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-plugin-utils": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz",
- "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==",
- "dev": true
- },
- "@babel/helper-regex": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz",
- "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.11"
- }
- },
- "@babel/helper-remap-async-to-generator": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz",
- "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.0.0",
- "@babel/helper-wrap-function": "^7.1.0",
- "@babel/template": "^7.1.0",
- "@babel/traverse": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-replace-supers": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz",
- "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==",
- "dev": true,
- "requires": {
- "@babel/helper-member-expression-to-functions": "^7.0.0",
- "@babel/helper-optimise-call-expression": "^7.0.0",
- "@babel/traverse": "^7.4.4",
- "@babel/types": "^7.4.4"
- }
- },
- "@babel/helper-simple-access": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz",
- "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==",
- "dev": true,
- "requires": {
- "@babel/template": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-split-export-declaration": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
- "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.4.4"
- }
- },
- "@babel/helper-validator-identifier": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
- "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
- "dev": true
- },
- "@babel/helper-wrap-function": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz",
- "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==",
- "dev": true,
- "requires": {
- "@babel/helper-function-name": "^7.1.0",
- "@babel/template": "^7.1.0",
- "@babel/traverse": "^7.1.0",
- "@babel/types": "^7.2.0"
- }
- },
- "@babel/helpers": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz",
- "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==",
- "dev": true,
- "requires": {
- "@babel/template": "^7.4.4",
- "@babel/traverse": "^7.4.4",
- "@babel/types": "^7.4.4"
- }
- },
- "@babel/highlight": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
- "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.0",
- "esutils": "^2.0.2",
- "js-tokens": "^4.0.0"
- }
- },
- "@babel/parser": {
- "version": "7.4.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz",
- "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==",
- "dev": true
- },
- "@babel/plugin-proposal-async-generator-functions": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz",
- "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-remap-async-to-generator": "^7.1.0",
- "@babel/plugin-syntax-async-generators": "^7.2.0"
- }
- },
- "@babel/plugin-proposal-json-strings": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
- "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-json-strings": "^7.2.0"
- }
- },
- "@babel/plugin-proposal-object-rest-spread": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz",
- "integrity": "sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
- }
- },
- "@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz",
- "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-optional-catch-binding": "^7.2.0"
- }
- },
- "@babel/plugin-proposal-unicode-property-regex": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz",
- "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-regex": "^7.4.4",
- "regexpu-core": "^4.5.4"
- }
- },
- "@babel/plugin-syntax-async-generators": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz",
- "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-syntax-json-strings": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz",
- "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-syntax-object-rest-spread": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz",
- "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz",
- "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-arrow-functions": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz",
- "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-async-to-generator": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz",
- "integrity": "sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA==",
- "dev": true,
- "requires": {
- "@babel/helper-module-imports": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-remap-async-to-generator": "^7.1.0"
- }
- },
- "@babel/plugin-transform-block-scoped-functions": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz",
- "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-block-scoping": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz",
- "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "lodash": "^4.17.11"
- }
- },
- "@babel/plugin-transform-classes": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz",
- "integrity": "sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.0.0",
- "@babel/helper-define-map": "^7.4.4",
- "@babel/helper-function-name": "^7.1.0",
- "@babel/helper-optimise-call-expression": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-replace-supers": "^7.4.4",
- "@babel/helper-split-export-declaration": "^7.4.4",
- "globals": "^11.1.0"
- }
- },
- "@babel/plugin-transform-computed-properties": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz",
- "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-destructuring": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz",
- "integrity": "sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-dotall-regex": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz",
- "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-regex": "^7.4.4",
- "regexpu-core": "^4.5.4"
- }
- },
- "@babel/plugin-transform-duplicate-keys": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz",
- "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-exponentiation-operator": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz",
- "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==",
- "dev": true,
- "requires": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-for-of": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz",
- "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-function-name": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz",
- "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==",
- "dev": true,
- "requires": {
- "@babel/helper-function-name": "^7.1.0",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-literals": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz",
- "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-member-expression-literals": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz",
- "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-modules-amd": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz",
- "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==",
- "dev": true,
- "requires": {
- "@babel/helper-module-transforms": "^7.1.0",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-modules-commonjs": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz",
- "integrity": "sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw==",
- "dev": true,
- "requires": {
- "@babel/helper-module-transforms": "^7.4.4",
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-simple-access": "^7.1.0"
- }
- },
- "@babel/plugin-transform-modules-systemjs": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz",
- "integrity": "sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ==",
- "dev": true,
- "requires": {
- "@babel/helper-hoist-variables": "^7.4.4",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-modules-umd": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz",
- "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==",
- "dev": true,
- "requires": {
- "@babel/helper-module-transforms": "^7.1.0",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.4.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz",
- "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==",
- "dev": true,
- "requires": {
- "regexp-tree": "^0.1.6"
- }
- },
- "@babel/plugin-transform-new-target": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz",
- "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-object-assign": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.2.0.tgz",
- "integrity": "sha512-nmE55cZBPFgUktbF2OuoZgPRadfxosLOpSgzEPYotKSls9J4pEPcembi8r78RU37Rph6UApCpNmsQA4QMWK9Ng==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-object-super": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz",
- "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-replace-supers": "^7.1.0"
- }
- },
- "@babel/plugin-transform-parameters": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz",
- "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==",
- "dev": true,
- "requires": {
- "@babel/helper-call-delegate": "^7.4.4",
- "@babel/helper-get-function-arity": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-property-literals": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz",
- "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-regenerator": {
- "version": "7.4.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz",
- "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==",
- "dev": true,
- "requires": {
- "regenerator-transform": "^0.14.0"
- }
- },
- "@babel/plugin-transform-reserved-words": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz",
- "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-shorthand-properties": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz",
- "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-spread": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz",
- "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-sticky-regex": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz",
- "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-regex": "^7.0.0"
- }
- },
- "@babel/plugin-transform-template-literals": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz",
- "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-typeof-symbol": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz",
- "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-unicode-regex": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz",
- "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-regex": "^7.4.4",
- "regexpu-core": "^4.5.4"
- }
- },
- "@babel/preset-env": {
- "version": "7.4.5",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.5.tgz",
- "integrity": "sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w==",
- "dev": true,
- "requires": {
- "@babel/helper-module-imports": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
- "@babel/plugin-proposal-json-strings": "^7.2.0",
- "@babel/plugin-proposal-object-rest-spread": "^7.4.4",
- "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
- "@babel/plugin-syntax-async-generators": "^7.2.0",
- "@babel/plugin-syntax-json-strings": "^7.2.0",
- "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
- "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
- "@babel/plugin-transform-arrow-functions": "^7.2.0",
- "@babel/plugin-transform-async-to-generator": "^7.4.4",
- "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
- "@babel/plugin-transform-block-scoping": "^7.4.4",
- "@babel/plugin-transform-classes": "^7.4.4",
- "@babel/plugin-transform-computed-properties": "^7.2.0",
- "@babel/plugin-transform-destructuring": "^7.4.4",
- "@babel/plugin-transform-dotall-regex": "^7.4.4",
- "@babel/plugin-transform-duplicate-keys": "^7.2.0",
- "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
- "@babel/plugin-transform-for-of": "^7.4.4",
- "@babel/plugin-transform-function-name": "^7.4.4",
- "@babel/plugin-transform-literals": "^7.2.0",
- "@babel/plugin-transform-member-expression-literals": "^7.2.0",
- "@babel/plugin-transform-modules-amd": "^7.2.0",
- "@babel/plugin-transform-modules-commonjs": "^7.4.4",
- "@babel/plugin-transform-modules-systemjs": "^7.4.4",
- "@babel/plugin-transform-modules-umd": "^7.2.0",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5",
- "@babel/plugin-transform-new-target": "^7.4.4",
- "@babel/plugin-transform-object-super": "^7.2.0",
- "@babel/plugin-transform-parameters": "^7.4.4",
- "@babel/plugin-transform-property-literals": "^7.2.0",
- "@babel/plugin-transform-regenerator": "^7.4.5",
- "@babel/plugin-transform-reserved-words": "^7.2.0",
- "@babel/plugin-transform-shorthand-properties": "^7.2.0",
- "@babel/plugin-transform-spread": "^7.2.0",
- "@babel/plugin-transform-sticky-regex": "^7.2.0",
- "@babel/plugin-transform-template-literals": "^7.4.4",
- "@babel/plugin-transform-typeof-symbol": "^7.2.0",
- "@babel/plugin-transform-unicode-regex": "^7.4.4",
- "@babel/types": "^7.4.4",
- "browserslist": "^4.6.0",
- "core-js-compat": "^3.1.1",
- "invariant": "^2.2.2",
- "js-levenshtein": "^1.1.3",
- "semver": "^5.5.0"
- }
- },
- "@babel/template": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz",
- "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/parser": "^7.4.4",
- "@babel/types": "^7.4.4"
- }
- },
- "@babel/traverse": {
- "version": "7.4.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz",
- "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/generator": "^7.4.4",
- "@babel/helper-function-name": "^7.1.0",
- "@babel/helper-split-export-declaration": "^7.4.4",
- "@babel/parser": "^7.4.5",
- "@babel/types": "^7.4.4",
- "debug": "^4.1.0",
- "globals": "^11.1.0",
- "lodash": "^4.17.11"
- }
- },
- "@babel/types": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz",
- "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2",
- "lodash": "^4.17.11",
- "to-fast-properties": "^2.0.0"
- }
- },
- "@mrmlnc/readdir-enhanced": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
- "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
- "dev": true,
- "requires": {
- "call-me-maybe": "^1.0.1",
- "glob-to-regexp": "^0.3.0"
- }
- },
- "@nodelib/fs.stat": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
- "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
- "dev": true
- },
- "@rollup/plugin-babel": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.2.0.tgz",
- "integrity": "sha512-CPABsajaKjINgBQ3it+yMnfVO3ibsrMBxRzbUOUw2cL1hsZJ7aogU8mgglQm3S2hHJgjnAmxPz0Rq7DVdmHsTw==",
- "dev": true,
- "requires": {
- "@babel/helper-module-imports": "^7.10.4",
- "@rollup/pluginutils": "^3.1.0"
- },
- "dependencies": {
- "@babel/helper-module-imports": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
- "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.10.4"
- }
- },
- "@babel/types": {
- "version": "7.11.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz",
- "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.10.4",
- "lodash": "^4.17.19",
- "to-fast-properties": "^2.0.0"
- }
- },
- "lodash": {
- "version": "4.17.20",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
- "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
- "dev": true
- }
- }
- },
- "@rollup/plugin-json": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz",
- "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^3.0.8"
- }
- },
- "@rollup/plugin-node-resolve": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz",
- "integrity": "sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^3.1.0",
- "@types/resolve": "1.17.1",
- "builtin-modules": "^3.1.0",
- "deepmerge": "^4.2.2",
- "is-module": "^1.0.0",
- "resolve": "^1.17.0"
- },
- "dependencies": {
- "@types/resolve": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
- "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "resolve": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
- "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
- "dev": true,
- "requires": {
- "path-parse": "^1.0.6"
- }
- }
- }
- },
- "@rollup/plugin-typescript": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-5.0.2.tgz",
- "integrity": "sha512-CkS028Itwjqm1uLbFVfpJgtVtnNvZ+og/m6UlNRR5wOOnNTWPcVQzOu5xGdEX+WWJxdvWIqUq2uR/RBt2ZipWg==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^3.0.1",
- "resolve": "^1.14.1"
- },
- "dependencies": {
- "resolve": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
- "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
- "dev": true,
- "requires": {
- "path-parse": "^1.0.6"
- }
- }
- }
- },
- "@rollup/pluginutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
- "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
- "dev": true,
- "requires": {
- "@types/estree": "0.0.39",
- "estree-walker": "^1.0.1",
- "picomatch": "^2.2.2"
- },
- "dependencies": {
- "estree-walker": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
- "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
- "dev": true
- }
- }
- },
- "@types/error-stack-parser": {
- "version": "1.3.18",
- "resolved": "https://registry.npmjs.org/@types/error-stack-parser/-/error-stack-parser-1.3.18.tgz",
- "integrity": "sha1-4ByfjIXKg7YQMgxiJYsMkCat4Pc=",
- "dev": true
- },
- "@types/estree": {
- "version": "0.0.39",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
- "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
- "dev": true
- },
- "@types/events": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
- "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
- "dev": true
- },
- "@types/glob": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
- "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
- "dev": true,
- "requires": {
- "@types/events": "*",
- "@types/minimatch": "*",
- "@types/node": "*"
- }
- },
- "@types/lodash": {
- "version": "4.14.135",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.135.tgz",
- "integrity": "sha512-Ed+tSZ9qM1oYpi5kzdsBuOzcAIn1wDW+e8TFJ50IMJMlSopGdJgKAbhHzN6h1E1OfjlGOr2JepzEWtg9NIfoNg==",
- "dev": true
- },
- "@types/minimatch": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
- "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
- "dev": true
- },
- "@types/node": {
- "version": "14.0.27",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
- "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==",
- "dev": true
- },
- "@types/resolve": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz",
- "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "acorn-hammerhead": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/acorn-hammerhead/-/acorn-hammerhead-0.2.0.tgz",
- "integrity": "sha512-kbX1s/0ZikW0WEBY6IrooFgX3AP2D9ycTg0OhxRYLF0Tew/bDK2+8lTxFR4cDdoCZm6Ax8eVf8EV6gbTtr8EYQ==",
- "dev": true,
- "requires": {
- "@types/estree": "^0.0.39"
- }
- },
- "adm-zip": {
- "version": "0.4.13",
- "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz",
- "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==",
- "dev": true
- },
- "agent-base": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
- "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
- "dev": true,
- "requires": {
- "es6-promisify": "^5.0.0"
- }
- },
- "ajv": {
- "version": "6.10.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
- "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^2.0.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
- "dev": true
- },
- "ansi-escapes": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz",
- "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=",
- "dev": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "archiver": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz",
- "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=",
- "dev": true,
- "requires": {
- "archiver-utils": "^1.3.0",
- "async": "^2.0.0",
- "buffer-crc32": "^0.2.1",
- "glob": "^7.0.0",
- "lodash": "^4.8.0",
- "readable-stream": "^2.0.0",
- "tar-stream": "^1.5.0",
- "zip-stream": "^1.2.0"
- },
- "dependencies": {
- "async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
- "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.11"
- }
- }
- }
- },
- "archiver-utils": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz",
- "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=",
- "dev": true,
- "requires": {
- "glob": "^7.0.0",
- "graceful-fs": "^4.1.0",
- "lazystream": "^1.0.0",
- "lodash": "^4.8.0",
- "normalize-path": "^2.0.0",
- "readable-stream": "^2.0.0"
- }
- },
- "arg": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
- "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
- "dev": true
- },
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true
- },
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
- "dev": true
- },
- "arr-union": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
- "dev": true
- },
- "array-find": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz",
- "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=",
- "dev": true
- },
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
- "dev": true,
- "requires": {
- "array-uniq": "^1.0.1"
- }
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
- "dev": true
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true
- },
- "asn1": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
- "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
- "dev": true,
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- },
- "assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
- "dev": true
- },
- "assign-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
- "dev": true
- },
- "async": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/async/-/async-0.2.6.tgz",
- "integrity": "sha1-rT83PZJJrjJIgVZVgryQ4VKrvWg=",
- "dev": true
- },
- "async-exit-hook": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-1.1.2.tgz",
- "integrity": "sha1-gJXXXkiMKazuBVH+hyUhadeJz7o=",
- "dev": true
- },
- "async-limiter": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
- "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
- "dev": true
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "dev": true
- },
- "atob": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
- "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
- "dev": true
- },
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
- "dev": true
- },
- "aws4": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
- "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
- "dev": true
- },
- "babel-code-frame": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
- "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
- "dev": true,
- "requires": {
- "chalk": "^1.1.3",
- "esutils": "^2.0.2",
- "js-tokens": "^3.0.2"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
- "dev": true
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
- }
- },
- "babel-core": {
- "version": "6.26.3",
- "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
- "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
- "dev": true,
- "requires": {
- "babel-code-frame": "^6.26.0",
- "babel-generator": "^6.26.0",
- "babel-helpers": "^6.24.1",
- "babel-messages": "^6.23.0",
- "babel-register": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "babel-template": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "convert-source-map": "^1.5.1",
- "debug": "^2.6.9",
- "json5": "^0.5.1",
- "lodash": "^4.17.4",
- "minimatch": "^3.0.4",
- "path-is-absolute": "^1.0.1",
- "private": "^0.1.8",
- "slash": "^1.0.0",
- "source-map": "^0.5.7"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "json5": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
- "dev": true
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "babel-generator": {
- "version": "6.26.1",
- "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
- "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
- "dev": true,
- "requires": {
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "detect-indent": "^4.0.0",
- "jsesc": "^1.3.0",
- "lodash": "^4.17.4",
- "source-map": "^0.5.7",
- "trim-right": "^1.0.1"
- },
- "dependencies": {
- "jsesc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
- "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
- "dev": true
- }
- }
- },
- "babel-helper-bindify-decorators": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz",
- "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-builder-binary-assignment-operator-visitor": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
- "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
- "dev": true,
- "requires": {
- "babel-helper-explode-assignable-expression": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-call-delegate": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
- "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
- "dev": true,
- "requires": {
- "babel-helper-hoist-variables": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-define-map": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
- "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
- "dev": true,
- "requires": {
- "babel-helper-function-name": "^6.24.1",
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "lodash": "^4.17.4"
- }
- },
- "babel-helper-explode-assignable-expression": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
- "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-explode-class": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz",
- "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
- "dev": true,
- "requires": {
- "babel-helper-bindify-decorators": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-function-name": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
- "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
- "dev": true,
- "requires": {
- "babel-helper-get-function-arity": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-get-function-arity": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
- "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-hoist-variables": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
- "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-optimise-call-expression": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
- "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-regex": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
- "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "lodash": "^4.17.4"
- }
- },
- "babel-helper-remap-async-to-generator": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
- "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
- "dev": true,
- "requires": {
- "babel-helper-function-name": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-replace-supers": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
- "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
- "dev": true,
- "requires": {
- "babel-helper-optimise-call-expression": "^6.24.1",
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helpers": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
- "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
- "babel-messages": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
- "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-check-es2015-constants": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
- "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-syntax-async-functions": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
- "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
- "dev": true
- },
- "babel-plugin-syntax-async-generators": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
- "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
- "dev": true
- },
- "babel-plugin-syntax-class-properties": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
- "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=",
- "dev": true
- },
- "babel-plugin-syntax-decorators": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
- "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
- "dev": true
- },
- "babel-plugin-syntax-dynamic-import": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
- "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=",
- "dev": true
- },
- "babel-plugin-syntax-exponentiation-operator": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
- "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
- "dev": true
- },
- "babel-plugin-syntax-flow": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz",
- "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=",
- "dev": true
- },
- "babel-plugin-syntax-object-rest-spread": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
- "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
- "dev": true
- },
- "babel-plugin-syntax-trailing-function-commas": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
- "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
- "dev": true
- },
- "babel-plugin-transform-async-generator-functions": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
- "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
- "dev": true,
- "requires": {
- "babel-helper-remap-async-to-generator": "^6.24.1",
- "babel-plugin-syntax-async-generators": "^6.5.0",
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-transform-async-to-generator": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
- "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
- "dev": true,
- "requires": {
- "babel-helper-remap-async-to-generator": "^6.24.1",
- "babel-plugin-syntax-async-functions": "^6.8.0",
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-transform-class-properties": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
- "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
- "dev": true,
- "requires": {
- "babel-helper-function-name": "^6.24.1",
- "babel-plugin-syntax-class-properties": "^6.8.0",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
- "babel-plugin-transform-decorators": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
- "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
- "dev": true,
- "requires": {
- "babel-helper-explode-class": "^6.24.1",
- "babel-plugin-syntax-decorators": "^6.13.0",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "babel-plugin-transform-es2015-arrow-functions": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
- "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-transform-es2015-block-scoped-functions": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
- "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-transform-es2015-block-scoping": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
- "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.26.0",
- "babel-template": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "lodash": "^4.17.4"
- }
- },
- "babel-plugin-transform-es2015-classes": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
- "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
- "dev": true,
- "requires": {
- "babel-helper-define-map": "^6.24.1",
- "babel-helper-function-name": "^6.24.1",
- "babel-helper-optimise-call-expression": "^6.24.1",
- "babel-helper-replace-supers": "^6.24.1",
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "babel-plugin-transform-es2015-computed-properties": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
- "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
- "babel-plugin-transform-es2015-destructuring": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
- "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-transform-es2015-duplicate-keys": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
- "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "babel-plugin-transform-es2015-for-of": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
- "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-transform-es2015-function-name": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
- "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
- "dev": true,
- "requires": {
- "babel-helper-function-name": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "babel-plugin-transform-es2015-literals": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
- "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-transform-es2015-modules-amd": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
- "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
- "dev": true,
- "requires": {
- "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
- "babel-plugin-transform-es2015-modules-commonjs": {
- "version": "6.26.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
- "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
- "dev": true,
- "requires": {
- "babel-plugin-transform-strict-mode": "^6.24.1",
- "babel-runtime": "^6.26.0",
- "babel-template": "^6.26.0",
- "babel-types": "^6.26.0"
- }
- },
- "babel-plugin-transform-es2015-modules-systemjs": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
- "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
- "dev": true,
- "requires": {
- "babel-helper-hoist-variables": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
- "babel-plugin-transform-es2015-modules-umd": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
- "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
- "dev": true,
- "requires": {
- "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
- "babel-plugin-transform-es2015-object-super": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
- "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
- "dev": true,
- "requires": {
- "babel-helper-replace-supers": "^6.24.1",
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-transform-es2015-parameters": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
- "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
- "dev": true,
- "requires": {
- "babel-helper-call-delegate": "^6.24.1",
- "babel-helper-get-function-arity": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "babel-plugin-transform-es2015-shorthand-properties": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
- "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "babel-plugin-transform-es2015-spread": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
- "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-transform-es2015-sticky-regex": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
- "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
- "dev": true,
- "requires": {
- "babel-helper-regex": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "babel-plugin-transform-es2015-template-literals": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
- "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-transform-es2015-typeof-symbol": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
- "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-transform-es2015-unicode-regex": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
- "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
- "dev": true,
- "requires": {
- "babel-helper-regex": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "regexpu-core": "^2.0.0"
- },
- "dependencies": {
- "jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
- "dev": true
- },
- "regexpu-core": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
- "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
- "dev": true,
- "requires": {
- "regenerate": "^1.2.1",
- "regjsgen": "^0.2.0",
- "regjsparser": "^0.1.4"
- }
- },
- "regjsgen": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
- "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
- "dev": true
- },
- "regjsparser": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
- "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
- "dev": true,
- "requires": {
- "jsesc": "~0.5.0"
- }
- }
- }
- },
- "babel-plugin-transform-exponentiation-operator": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
- "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
- "dev": true,
- "requires": {
- "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
- "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-transform-flow-strip-types": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz",
- "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=",
- "dev": true,
- "requires": {
- "babel-plugin-syntax-flow": "^6.18.0",
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-transform-for-of-as-array": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-for-of-as-array/-/babel-plugin-transform-for-of-as-array-1.1.1.tgz",
- "integrity": "sha512-eE4hZJhOUKpX0q/X3adR8B4hLox+t8oe4ZqmhANUmv4cds07AbWt6O0rtFXK7PKFPPnW4nz/5mpbkPMkflyGeg==",
- "dev": true
- },
- "babel-plugin-transform-object-rest-spread": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
- "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
- "dev": true,
- "requires": {
- "babel-plugin-syntax-object-rest-spread": "^6.8.0",
- "babel-runtime": "^6.26.0"
- }
- },
- "babel-plugin-transform-regenerator": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
- "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
- "dev": true,
- "requires": {
- "regenerator-transform": "^0.10.0"
- },
- "dependencies": {
- "regenerator-transform": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
- "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.18.0",
- "babel-types": "^6.19.0",
- "private": "^0.1.6"
- }
- }
- }
- },
- "babel-plugin-transform-runtime": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz",
- "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-transform-strict-mode": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
- "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "babel-preset-env": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
- "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
- "dev": true,
- "requires": {
- "babel-plugin-check-es2015-constants": "^6.22.0",
- "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
- "babel-plugin-transform-async-to-generator": "^6.22.0",
- "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
- "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
- "babel-plugin-transform-es2015-block-scoping": "^6.23.0",
- "babel-plugin-transform-es2015-classes": "^6.23.0",
- "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
- "babel-plugin-transform-es2015-destructuring": "^6.23.0",
- "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
- "babel-plugin-transform-es2015-for-of": "^6.23.0",
- "babel-plugin-transform-es2015-function-name": "^6.22.0",
- "babel-plugin-transform-es2015-literals": "^6.22.0",
- "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
- "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
- "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
- "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
- "babel-plugin-transform-es2015-object-super": "^6.22.0",
- "babel-plugin-transform-es2015-parameters": "^6.23.0",
- "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
- "babel-plugin-transform-es2015-spread": "^6.22.0",
- "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
- "babel-plugin-transform-es2015-template-literals": "^6.22.0",
- "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
- "babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
- "babel-plugin-transform-exponentiation-operator": "^6.22.0",
- "babel-plugin-transform-regenerator": "^6.22.0",
- "browserslist": "^3.2.6",
- "invariant": "^2.2.2",
- "semver": "^5.3.0"
- },
- "dependencies": {
- "browserslist": {
- "version": "3.2.8",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
- "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
- "dev": true,
- "requires": {
- "caniuse-lite": "^1.0.30000844",
- "electron-to-chromium": "^1.3.47"
- }
- }
- }
- },
- "babel-preset-flow": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz",
- "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=",
- "dev": true,
- "requires": {
- "babel-plugin-transform-flow-strip-types": "^6.22.0"
- }
- },
- "babel-preset-stage-2": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
- "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
- "dev": true,
- "requires": {
- "babel-plugin-syntax-dynamic-import": "^6.18.0",
- "babel-plugin-transform-class-properties": "^6.24.1",
- "babel-plugin-transform-decorators": "^6.24.1",
- "babel-preset-stage-3": "^6.24.1"
- }
- },
- "babel-preset-stage-3": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz",
- "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
- "dev": true,
- "requires": {
- "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
- "babel-plugin-transform-async-generator-functions": "^6.24.1",
- "babel-plugin-transform-async-to-generator": "^6.24.1",
- "babel-plugin-transform-exponentiation-operator": "^6.24.1",
- "babel-plugin-transform-object-rest-spread": "^6.22.0"
- }
- },
- "babel-register": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
- "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
- "dev": true,
- "requires": {
- "babel-core": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "core-js": "^2.5.0",
- "home-or-tmp": "^2.0.0",
- "lodash": "^4.17.4",
- "mkdirp": "^0.5.1",
- "source-map-support": "^0.4.15"
- },
- "dependencies": {
- "source-map-support": {
- "version": "0.4.18",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
- "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
- "dev": true,
- "requires": {
- "source-map": "^0.5.6"
- }
- }
- }
- },
- "babel-runtime": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
- "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
- "dev": true,
- "requires": {
- "core-js": "^2.4.0",
- "regenerator-runtime": "^0.11.0"
- }
- },
- "babel-template": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
- "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "lodash": "^4.17.4"
- }
- },
- "babel-traverse": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
- "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
- "dev": true,
- "requires": {
- "babel-code-frame": "^6.26.0",
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "debug": "^2.6.8",
- "globals": "^9.18.0",
- "invariant": "^2.2.2",
- "lodash": "^4.17.4"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "globals": {
- "version": "9.18.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
- "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
- "dev": true
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "babel-types": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
- "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.26.0",
- "esutils": "^2.0.2",
- "lodash": "^4.17.4",
- "to-fast-properties": "^1.0.3"
- },
- "dependencies": {
- "to-fast-properties": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
- "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
- "dev": true
- }
- }
- },
- "babylon": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
- "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
- "dev": true
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "dev": true
- },
- "base": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
- "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
- "dev": true,
- "requires": {
- "cache-base": "^1.0.1",
- "class-utils": "^0.3.5",
- "component-emitter": "^1.2.1",
- "define-property": "^1.0.0",
- "isobject": "^3.0.1",
- "mixin-deep": "^1.2.0",
- "pascalcase": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "base64-js": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
- "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
- "dev": true
- },
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "dev": true,
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
- "bin-v8-flags-filter": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/bin-v8-flags-filter/-/bin-v8-flags-filter-1.2.0.tgz",
- "integrity": "sha512-g8aeYkY7GhyyKRvQMBsJQZjhm2iCX3dKYvfrMpwVR8IxmUGrkpCBFoKbB9Rh0o3sTLCjU/1tFpZ4C7j3f+D+3g==",
- "dev": true
- },
- "bl": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
- "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
- "dev": true,
- "requires": {
- "readable-stream": "^2.3.5",
- "safe-buffer": "^5.1.1"
- }
- },
- "bowser": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.6.0.tgz",
- "integrity": "sha1-N/w4e2Fstq7zcNq01r1AK3TFxU0=",
- "dev": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "brotli": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz",
- "integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=",
- "dev": true,
- "requires": {
- "base64-js": "^1.1.2"
- }
- },
- "browserslist": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.0.tgz",
- "integrity": "sha512-Jk0YFwXBuMOOol8n6FhgkDzn3mY9PYLYGk29zybF05SbRTsMgPqmTNeQQhOghCxq5oFqAXE3u4sYddr4C0uRhg==",
- "dev": true,
- "requires": {
- "caniuse-lite": "^1.0.30000967",
- "electron-to-chromium": "^1.3.133",
- "node-releases": "^1.1.19"
- }
- },
- "buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
- "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
- "dev": true,
- "requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4"
- }
- },
- "buffer-alloc": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
- "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
- "dev": true,
- "requires": {
- "buffer-alloc-unsafe": "^1.1.0",
- "buffer-fill": "^1.0.0"
- }
- },
- "buffer-alloc-unsafe": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
- "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
- "dev": true
- },
- "buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
- "dev": true
- },
- "buffer-fill": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
- "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
- "dev": true
- },
- "buffer-from": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
- "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
- "dev": true
- },
- "builtin-modules": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz",
- "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==",
- "dev": true
- },
- "cache-base": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
- "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
- "dev": true,
- "requires": {
- "collection-visit": "^1.0.0",
- "component-emitter": "^1.2.1",
- "get-value": "^2.0.6",
- "has-value": "^1.0.0",
- "isobject": "^3.0.1",
- "set-value": "^2.0.0",
- "to-object-path": "^0.3.0",
- "union-value": "^1.0.0",
- "unset-value": "^1.0.0"
- }
- },
- "call-me-maybe": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
- "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
- "dev": true
- },
- "callsite": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
- "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
- "dev": true
- },
- "callsite-record": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/callsite-record/-/callsite-record-4.1.3.tgz",
- "integrity": "sha512-otAcPmu8TiHZ38cIL3NjQa1nGoSQRRe8WDDUgj5ZUwJWn1wzOYBwVSJbpVyzZ0sesQeKlYsPu9DG70fhh6AK9g==",
- "dev": true,
- "requires": {
- "@types/error-stack-parser": "^1.3.18",
- "@types/lodash": "^4.14.72",
- "callsite": "^1.0.0",
- "chalk": "^2.4.0",
- "error-stack-parser": "^1.3.3",
- "highlight-es": "^1.0.0",
- "lodash": "4.6.1 || ^4.16.1",
- "pinkie-promise": "^2.0.0"
- }
- },
- "caniuse-lite": {
- "version": "1.0.30000971",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000971.tgz",
- "integrity": "sha512-TQFYFhRS0O5rdsmSbF1Wn+16latXYsQJat66f7S7lizXW1PVpWJeZw9wqqVLIjuxDRz7s7xRUj13QCfd8hKn6g==",
- "dev": true
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
- "dev": true
- },
- "chai": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
- "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
- "dev": true,
- "requires": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.2",
- "deep-eql": "^3.0.1",
- "get-func-name": "^2.0.0",
- "pathval": "^1.1.0",
- "type-detect": "^4.0.5"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "check-error": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
- "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
- "dev": true
- },
- "chrome-emulated-devices-list": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/chrome-emulated-devices-list/-/chrome-emulated-devices-list-0.1.1.tgz",
- "integrity": "sha512-wQu6YKNTNGaUXovpkvXLnfeumVK47r2TKpOuCTwOKv/5SmRzfHual+E+oDIwS3KFWAcJPAhoNRAOLvXwzC6/pw==",
- "dev": true
- },
- "chrome-remote-interface": {
- "version": "0.25.7",
- "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.25.7.tgz",
- "integrity": "sha512-6zI6LbR2IiGmduFZededaerEr9hHXabxT/L+fRrdq65a0CfyLMzpq0BKuZiqN0Upqcacsb6q2POj7fmobwBsEA==",
- "dev": true,
- "requires": {
- "commander": "2.11.x",
- "ws": "3.3.x"
- },
- "dependencies": {
- "commander": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
- "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
- "dev": true
- }
- }
- },
- "ci-info": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
- "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==",
- "dev": true
- },
- "class-utils": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
- "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
- "dev": true,
- "requires": {
- "arr-union": "^3.1.0",
- "define-property": "^0.2.5",
- "isobject": "^3.0.0",
- "static-extend": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
- "dev": true
- },
- "coffeescript": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.4.1.tgz",
- "integrity": "sha512-34GV1aHrsMpTaO3KfMJL40ZNuvKDR/g98THHnE9bQj8HjMaZvSrLik99WWqyMhRtbe8V5hpx5iLgdcSvM/S2wg==",
- "dev": true
- },
- "collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
- "dev": true,
- "requires": {
- "map-visit": "^1.0.0",
- "object-visit": "^1.0.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- },
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "commander": {
- "version": "2.20.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
- "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
- "dev": true
- },
- "component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
- "dev": true
- },
- "compress-commons": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz",
- "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
- "dev": true,
- "requires": {
- "buffer-crc32": "^0.2.1",
- "crc32-stream": "^2.0.0",
- "normalize-path": "^2.0.0",
- "readable-stream": "^2.0.0"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "convert-source-map": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
- "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.1"
- }
- },
- "copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
- "dev": true
- },
- "core-js": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz",
- "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==",
- "dev": true
- },
- "core-js-compat": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.2.tgz",
- "integrity": "sha512-X0Ch5f6itrHxhg5HSJucX6nNLNAGr+jq+biBh6nPGc3YAWz2a8p/ZIZY8cUkDzSRNG54omAuu3hoEF8qZbu/6Q==",
- "dev": true,
- "requires": {
- "browserslist": "^4.6.0",
- "core-js-pure": "3.1.2",
- "semver": "^6.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.0.tgz",
- "integrity": "sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ==",
- "dev": true
- }
- }
- },
- "core-js-pure": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.2.tgz",
- "integrity": "sha512-5ckIdBF26B3ldK9PM177y2ZcATP2oweam9RskHSoqfZCrJ2As6wVg8zJ1zTriFsZf6clj/N1ThDFRGaomMsh9w==",
- "dev": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
- "dev": true
- },
- "crc": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
- "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
- "dev": true,
- "requires": {
- "buffer": "^5.1.0"
- }
- },
- "crc32-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
- "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
- "dev": true,
- "requires": {
- "crc": "^3.4.4",
- "readable-stream": "^2.0.0"
- }
- },
- "crypto-md5": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/crypto-md5/-/crypto-md5-1.0.0.tgz",
- "integrity": "sha1-zMjadQx1PH7curxUKWdHKjhOhrs=",
- "dev": true
- },
- "css": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz",
- "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "source-map": "^0.1.38",
- "source-map-resolve": "^0.5.1",
- "urix": "^0.1.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.1.43",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
- "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
- "dev": true,
- "requires": {
- "amdefine": ">=0.0.4"
- }
- }
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
- "dev": true
- },
- "dedent": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.4.0.tgz",
- "integrity": "sha1-h979BAvUwVldljKC7FfzwqhSVkI=",
- "dev": true
- },
- "deep-eql": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
- "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
- "dev": true,
- "requires": {
- "type-detect": "^4.0.0"
- }
- },
- "deepmerge": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
- "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
- "dev": true
- },
- "define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
- "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "dependencies": {
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "del": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
- "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
- "dev": true,
- "requires": {
- "globby": "^6.1.0",
- "is-path-cwd": "^1.0.0",
- "is-path-in-cwd": "^1.0.0",
- "p-map": "^1.1.1",
- "pify": "^3.0.0",
- "rimraf": "^2.2.8"
- },
- "dependencies": {
- "globby": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
- "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
- "dev": true,
- "requires": {
- "array-union": "^1.0.1",
- "glob": "^7.0.3",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
- }
- }
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true
- }
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
- },
- "desired-capabilities": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/desired-capabilities/-/desired-capabilities-0.1.0.tgz",
- "integrity": "sha1-84YNEu3g2sgZpHzJWaaMULqbqD4=",
- "dev": true,
- "requires": {
- "extend": "^3.0.0"
- }
- },
- "detect-indent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
- "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
- "dev": true,
- "requires": {
- "repeating": "^2.0.0"
- }
- },
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "dir-glob": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz",
- "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==",
- "dev": true,
- "requires": {
- "path-type": "^3.0.0"
- }
- },
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
- "dev": true,
- "requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "electron-to-chromium": {
- "version": "1.3.137",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.137.tgz",
- "integrity": "sha512-kGi32g42a8vS/WnYE7ELJyejRT7hbr3UeOOu0WeuYuQ29gCpg9Lrf6RdcTQVXSt/v0bjCfnlb/EWOOsiKpTmkw==",
- "dev": true
- },
- "elegant-spinner": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz",
- "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=",
- "dev": true
- },
- "emittery": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.4.1.tgz",
- "integrity": "sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ==",
- "dev": true
- },
- "end-of-stream": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
- "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
- "dev": true,
- "requires": {
- "once": "^1.4.0"
- }
- },
- "endpoint-utils": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/endpoint-utils/-/endpoint-utils-1.0.2.tgz",
- "integrity": "sha1-CAjDNppyfNeWejn/NOvJJriBRqg=",
- "dev": true,
- "requires": {
- "ip": "^1.1.3",
- "pinkie-promise": "^1.0.0"
- },
- "dependencies": {
- "pinkie": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz",
- "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=",
- "dev": true
- },
- "pinkie-promise": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz",
- "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=",
- "dev": true,
- "requires": {
- "pinkie": "^1.0.0"
- }
- }
- }
- },
- "error-stack-parser": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.6.tgz",
- "integrity": "sha1-4Oc7k+QXE40c18C3RrGkoUhUwpI=",
- "dev": true,
- "requires": {
- "stackframe": "^0.3.1"
- }
- },
- "es6-promise": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
- "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
- "dev": true
- },
- "es6-promisify": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
- "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
- "dev": true,
- "requires": {
- "es6-promise": "^4.0.3"
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
- },
- "esotope-hammerhead": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/esotope-hammerhead/-/esotope-hammerhead-0.2.1.tgz",
- "integrity": "sha512-IicdvCt1BIFTIM4nbjxGp98whIakOYZ4lA0UaDXnXpJpB11jYBX11Uv3x2f5ncSlFmxyZRdrN5skH5wK4TCWFQ==",
- "dev": true,
- "requires": {
- "@types/estree": "^0.0.39"
- }
- },
- "estree-walker": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.0.tgz",
- "integrity": "sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw==",
- "dev": true
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
- "dev": true
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dev": true,
- "requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
- "extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "dev": true,
- "requires": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dev": true,
- "requires": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "dev": true
- },
- "fast-deep-equal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
- "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
- "dev": true
- },
- "fast-glob": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
- "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
- "dev": true,
- "requires": {
- "@mrmlnc/readdir-enhanced": "^2.2.1",
- "@nodelib/fs.stat": "^1.1.2",
- "glob-parent": "^3.1.0",
- "is-glob": "^4.0.0",
- "merge2": "^1.2.3",
- "micromatch": "^3.1.10"
- },
- "dependencies": {
- "is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- }
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
- "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
- "dev": true
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true
- },
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "fp-ts": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.8.1.tgz",
- "integrity": "sha512-HuA/6roEliHoBgEOLCKmGRcM90e2trW/ITZZ9d9P/ra7PreqQagC3Jg6OzqWkai13KUbG90b8QO9rHPBGK/ckw==",
- "dev": true
- },
- "fragment-cache": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
- "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
- "dev": true,
- "requires": {
- "map-cache": "^0.2.2"
- }
- },
- "fs-constants": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
- "dev": true
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "fsevents": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
- "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
- "dev": true,
- "optional": true
- },
- "get-func-name": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
- "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
- "dev": true
- },
- "get-stdin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
- "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
- "dev": true
- },
- "get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
- "dev": true
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "glob": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
- "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
- "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
- "dev": true,
- "requires": {
- "is-glob": "^3.1.0",
- "path-dirname": "^1.0.0"
- },
- "dependencies": {
- "is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
- "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.0"
- }
- }
- }
- },
- "glob-to-regexp": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
- "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
- "dev": true
- },
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true
- },
- "globby": {
- "version": "9.2.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz",
- "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==",
- "dev": true,
- "requires": {
- "@types/glob": "^7.1.1",
- "array-union": "^1.0.2",
- "dir-glob": "^2.2.2",
- "fast-glob": "^2.2.6",
- "glob": "^7.1.3",
- "ignore": "^4.0.3",
- "pify": "^4.0.1",
- "slash": "^2.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
- "dev": true
- },
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
- "dev": true
- }
- }
- },
- "graceful-fs": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
- "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==",
- "dev": true
- },
- "graphlib": {
- "version": "2.1.7",
- "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.7.tgz",
- "integrity": "sha512-TyI9jIy2J4j0qgPmOOrHTCtpPqJGN/aurBwc6ZT+bRii+di1I+Wv3obRhVrmBEXet+qkMaEX67dXrwsd3QQM6w==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.5"
- }
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
- "dev": true
- },
- "har-validator": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
- "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
- "dev": true,
- "requires": {
- "ajv": "^6.5.5",
- "har-schema": "^2.0.0"
- }
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "dev": true,
- "requires": {
- "get-value": "^2.0.6",
- "has-values": "^1.0.0",
- "isobject": "^3.0.0"
- }
- },
- "has-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "highlight-es": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/highlight-es/-/highlight-es-1.0.3.tgz",
- "integrity": "sha512-s/SIX6yp/5S1p8aC/NRDC1fwEb+myGIfp8/TzZz0rtAv8fzsdX7vGl3Q1TrXCsczFq8DI3CBFBCySPClfBSdbg==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.0",
- "is-es2016-keyword": "^1.0.0",
- "js-tokens": "^3.0.0"
- },
- "dependencies": {
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
- "dev": true
- }
- }
- },
- "home-or-tmp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
- "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
- "dev": true,
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.1"
- }
- },
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
- "https-proxy-agent": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
- "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
- "dev": true,
- "requires": {
- "agent-base": "^4.1.0",
- "debug": "^3.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "iconv-lite": {
- "version": "0.4.11",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.11.tgz",
- "integrity": "sha1-LstC/SlHRJIiCaLnxATayHk9it4=",
- "dev": true
- },
- "ieee754": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
- "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
- "dev": true
- },
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true
- },
- "import-lazy": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz",
- "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==",
- "dev": true
- },
- "indent-string": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-1.2.2.tgz",
- "integrity": "sha1-25m8xYPrarux5I3LsZmamGBBy2s=",
- "dev": true,
- "requires": {
- "get-stdin": "^4.0.1",
- "minimist": "^1.1.0",
- "repeating": "^1.1.0"
- },
- "dependencies": {
- "repeating": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz",
- "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=",
- "dev": true,
- "requires": {
- "is-finite": "^1.0.0"
- }
- }
- }
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "dev": true,
- "requires": {
- "loose-envify": "^1.0.0"
- }
- },
- "ip": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
- "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
- "dev": true
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-ci": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz",
- "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==",
- "dev": true,
- "requires": {
- "ci-info": "^1.5.0"
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
- }
- }
- },
- "is-docker": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-1.1.0.tgz",
- "integrity": "sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE=",
- "dev": true
- },
- "is-es2016-keyword": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-es2016-keyword/-/is-es2016-keyword-1.0.0.tgz",
- "integrity": "sha1-9uVOEQxeT40mXmnS7Q6vjPX0dxg=",
- "dev": true
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
- "dev": true
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
- },
- "is-finite": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
- "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "dev": true,
- "requires": {
- "is-extglob": "^1.0.0"
- },
- "dependencies": {
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
- }
- }
- },
- "is-jquery-obj": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-jquery-obj/-/is-jquery-obj-0.1.1.tgz",
- "integrity": "sha512-18toSebUVF7y717dgw/Dzn6djOCqrkiDp3MhB8P6TdKyCVkbD1ZwE7Uz8Hwx6hUPTvKjbyYH9ncXT4ts4qLaSA==",
- "dev": true
- },
- "is-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
- "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
- "dev": true
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-path-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
- "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
- "dev": true
- },
- "is-path-in-cwd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
- "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
- "dev": true,
- "requires": {
- "is-path-inside": "^1.0.0"
- }
- },
- "is-path-inside": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
- "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
- "dev": true,
- "requires": {
- "path-is-inside": "^1.0.1"
- }
- },
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
- "dev": true
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
- "dev": true
- },
- "is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "dev": true
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
- "dev": true
- },
- "js-levenshtein": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
- "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
- "dev": true
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "dev": true
- },
- "jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "dev": true
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
- "dev": true
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
- "dev": true
- },
- "json5": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
- "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.0"
- }
- },
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
- }
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
- },
- "lazystream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
- "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
- "dev": true,
- "requires": {
- "readable-stream": "^2.0.5"
- }
- },
- "linux-platform-info": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/linux-platform-info/-/linux-platform-info-0.0.3.tgz",
- "integrity": "sha1-La4yQ4Xmbj11W+yD+Gx77qYc64M=",
- "dev": true,
- "requires": {
- "os-family": "^1.0.0"
- }
- },
- "lodash": {
- "version": "4.17.11",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
- "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
- "dev": true
- },
- "log-update-async-hook": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/log-update-async-hook/-/log-update-async-hook-2.0.2.tgz",
- "integrity": "sha512-HQwkKFTZeUOrDi1Duf2CSUa/pSpcaCHKLdx3D/Z16DsipzByOBffcg5y0JZA1q0n80dYgLXe2hFM9JGNgBsTDw==",
- "dev": true,
- "requires": {
- "ansi-escapes": "^2.0.0",
- "async-exit-hook": "^1.1.2",
- "onetime": "^2.0.1",
- "wrap-ansi": "^2.1.0"
- }
- },
- "logging-ts": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/logging-ts/-/logging-ts-0.3.3.tgz",
- "integrity": "sha512-tdwtfZxrHFrnlP3QcZOYz2ilr2yXwcyRgUtUSOXiWXJQajx2jCzy7l98wUVBdev25WIkeXYH86lmidoCKGwoaw==",
- "dev": true
- },
- "loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "dev": true,
- "requires": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- }
- },
- "lru-cache": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.3.tgz",
- "integrity": "sha1-UczQtPwMhDWH16VwnOTTt2Kb7cU=",
- "dev": true
- },
- "make-dir": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
- "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
- "dev": true,
- "requires": {
- "pify": "^3.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true
- }
- }
- },
- "make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true
- },
- "map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
- "dev": true
- },
- "map-reverse": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-reverse/-/map-reverse-1.0.1.tgz",
- "integrity": "sha1-J06fUAphEVMYO1uNhJCpwcI+4xA=",
- "dev": true
- },
- "map-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
- "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
- "dev": true,
- "requires": {
- "object-visit": "^1.0.0"
- }
- },
- "match-url-wildcard": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/match-url-wildcard/-/match-url-wildcard-0.0.4.tgz",
- "integrity": "sha512-R1XhQaamUZPWLOPtp4ig5j+3jctN+skhgRmEQTUamMzmNtRG69QEirQs0NZKLtHMR7tzWpmtnS4Eqv65DcgXUA==",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^1.0.5"
- }
- },
- "merge-stream": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
- "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
- "dev": true,
- "requires": {
- "readable-stream": "^2.0.1"
- }
- },
- "merge2": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz",
- "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==",
- "dev": true
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "mime": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
- "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
- "dev": true
- },
- "mime-db": {
- "version": "1.40.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
- "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
- "dev": true
- },
- "mime-types": {
- "version": "2.1.24",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
- "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
- "dev": true,
- "requires": {
- "mime-db": "1.40.0"
- }
- },
- "mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
- "dev": true
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
- "dev": true
- },
- "mixin-deep": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
- "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
- "dev": true,
- "requires": {
- "for-in": "^1.0.2",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "dev": true,
- "requires": {
- "minimist": "0.0.8"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
- "dev": true
- }
- }
- },
- "moment": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
- "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==",
- "dev": true
- },
- "moment-duration-format-commonjs": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/moment-duration-format-commonjs/-/moment-duration-format-commonjs-1.0.0.tgz",
- "integrity": "sha512-MVFR4hIh4jfuwSCPBEE5CCwn3refvTsxK/Yv/DpKJ6YcNnCimlVJ6DQeTJG1KVQPw1o8m3tkbHE9gVjivyv9iA==",
- "dev": true
- },
- "ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
- "dev": true
- },
- "mustache": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz",
- "integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==",
- "dev": true
- },
- "nanoid": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-1.3.4.tgz",
- "integrity": "sha512-4ug4BsuHxiVHoRUe1ud6rUFT3WUMmjXt1W0quL0CviZQANdan7D8kqN5/maw53hmAApY/jfzMRkC57BNNs60ZQ==",
- "dev": true
- },
- "nanomatch": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
- "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "fragment-cache": "^0.2.1",
- "is-windows": "^1.0.2",
- "kind-of": "^6.0.2",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- }
- },
- "node-releases": {
- "version": "1.1.21",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.21.tgz",
- "integrity": "sha512-TwnURTCjc8a+ElJUjmDqU6+12jhli1Q61xOQmdZ7ECZVBZuQpN/1UnembiIHDM1wCcfLvh5wrWXUF5H6ufX64Q==",
- "dev": true,
- "requires": {
- "semver": "^5.3.0"
- }
- },
- "node-version": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz",
- "integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==",
- "dev": true
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true,
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "dev": true
- },
- "oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
- "dev": true
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "dev": true
- },
- "object-copy": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
- "dev": true,
- "requires": {
- "copy-descriptor": "^0.1.0",
- "define-property": "^0.2.5",
- "kind-of": "^3.0.3"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "object-visit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
- "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
- "dev": true,
- "requires": {
- "isobject": "^3.0.0"
- }
- },
- "object.pick": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
- "dev": true,
- "requires": {
- "mimic-fn": "^1.0.0"
- }
- },
- "os-family": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/os-family/-/os-family-1.1.0.tgz",
- "integrity": "sha512-E3Orl5pvDJXnVmpaAA2TeNNpNhTMl4o5HghuWhOivBjEiTnJSrMYSa5uZMek1lBEvu8kKEsa2YgVcGFVDqX/9w==",
- "dev": true
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
- "dev": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
- "dev": true
- },
- "p-map": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
- "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
- "dev": true
- },
- "parse5": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
- "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=",
- "dev": true
- },
- "pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
- "dev": true
- },
- "path-dirname": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
- "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
- "dev": true
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
- },
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
- "dev": true
- },
- "path-type": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
- "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
- "dev": true,
- "requires": {
- "pify": "^3.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true
- }
- }
- },
- "pathval": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
- "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
- "dev": true
- },
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
- "dev": true
- },
- "picomatch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
- "dev": true
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
- "dev": true
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "dev": true,
- "requires": {
- "pinkie": "^2.0.0"
- }
- },
- "pngjs": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
- "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
- "dev": true
- },
- "posix-character-classes": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
- "dev": true
- },
- "private": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
- "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
- "dev": true
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "promisify-event": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/promisify-event/-/promisify-event-1.0.0.tgz",
- "integrity": "sha1-vXUj6ga3AWLzcJeQFrU6aGxg6Q8=",
- "dev": true,
- "requires": {
- "pinkie-promise": "^2.0.0"
- }
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
- "dev": true
- },
- "psl": {
- "version": "1.1.33",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.33.tgz",
- "integrity": "sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==",
- "dev": true
- },
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
- "dev": true
- },
- "q": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
- "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
- "dev": true
- },
- "qrcode-terminal": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.10.0.tgz",
- "integrity": "sha1-p2pI4mEKGPl/o6K9UytoKs/4bFM=",
- "dev": true
- },
- "qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
- "dev": true
- },
- "read-file-relative": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/read-file-relative/-/read-file-relative-1.2.0.tgz",
- "integrity": "sha1-mPfZbqoh0rTHov69Y9L8jPNen5s=",
- "dev": true,
- "requires": {
- "callsite": "^1.0.0"
- }
- },
- "readable-stream": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "regenerate": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
- "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
- "dev": true
- },
- "regenerate-unicode-properties": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz",
- "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==",
- "dev": true,
- "requires": {
- "regenerate": "^1.4.0"
- }
- },
- "regenerator-runtime": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
- "dev": true
- },
- "regenerator-transform": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.0.tgz",
- "integrity": "sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w==",
- "dev": true,
- "requires": {
- "private": "^0.1.6"
- }
- },
- "regex-not": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
- "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
- "dev": true,
- "requires": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "regexp-tree": {
- "version": "0.1.10",
- "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.10.tgz",
- "integrity": "sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ==",
- "dev": true
- },
- "regexpu-core": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz",
- "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==",
- "dev": true,
- "requires": {
- "regenerate": "^1.4.0",
- "regenerate-unicode-properties": "^8.0.2",
- "regjsgen": "^0.5.0",
- "regjsparser": "^0.6.0",
- "unicode-match-property-ecmascript": "^1.0.4",
- "unicode-match-property-value-ecmascript": "^1.1.0"
- }
- },
- "regjsgen": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
- "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==",
- "dev": true
- },
- "regjsparser": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
- "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
- "dev": true,
- "requires": {
- "jsesc": "~0.5.0"
- },
- "dependencies": {
- "jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
- "dev": true
- }
- }
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
- "dev": true
- },
- "repeat-element": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
- "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
- "dev": true
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
- "dev": true
- },
- "repeating": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
- "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
- "dev": true,
- "requires": {
- "is-finite": "^1.0.0"
- }
- },
- "replicator": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/replicator/-/replicator-1.0.3.tgz",
- "integrity": "sha512-WsKsraaM0x0QHy5CtzdgFXUxyowoBhyNkmPqmZShW6h+rOWnyT6Od3zRdTX9r616rAA6kDC9MKQGnSM/CJKfVQ==",
- "dev": true
- },
- "request": {
- "version": "2.88.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
- "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
- "dev": true,
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.0",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.4.3",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "dependencies": {
- "tough-cookie": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
- "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
- "dev": true,
- "requires": {
- "psl": "^1.1.24",
- "punycode": "^1.4.1"
- }
- }
- }
- },
- "resolve": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz",
- "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==",
- "dev": true,
- "requires": {
- "path-parse": "^1.0.6"
- }
- },
- "resolve-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-1.0.0.tgz",
- "integrity": "sha1-Tq7qQe0EDRcCRX32SkKysH0kb58=",
- "dev": true,
- "requires": {
- "resolve-from": "^2.0.0"
- },
- "dependencies": {
- "resolve-from": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
- "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=",
- "dev": true
- }
- }
- },
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true
- },
- "resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
- "dev": true
- },
- "ret": {
- "version": "0.1.15",
- "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
- "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
- "dev": true
- },
- "rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "rollup": {
- "version": "2.26.3",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.26.3.tgz",
- "integrity": "sha512-Mlt39/kL2rA9egcbQbaZV1SNVplGqYYhDDMcGgHPPE0tvM3R4GrB+IEdYy2QtTrdzMQx57ZcqDFf/KWWm8F+uw==",
- "dev": true,
- "requires": {
- "fsevents": "~2.1.2"
- }
- },
- "rollup-plugin-babel": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.3.2.tgz",
- "integrity": "sha512-KfnizE258L/4enADKX61ozfwGHoqYauvoofghFJBhFnpH9Sb9dNPpWg8QHOaAfVASUYV8w0mCx430i9z0LJoJg==",
- "dev": true,
- "requires": {
- "@babel/helper-module-imports": "^7.0.0",
- "rollup-pluginutils": "^2.3.0"
- }
- },
- "rollup-plugin-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-4.0.0.tgz",
- "integrity": "sha512-hgb8N7Cgfw5SZAkb3jf0QXii6QX/FOkiIq2M7BAQIEydjHvTyxXHQiIzZaTFgx1GK0cRCHOCBHIyEkkLdWKxow==",
- "dev": true,
- "requires": {
- "rollup-pluginutils": "^2.5.0"
- }
- },
- "rollup-plugin-node-resolve": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.0.0.tgz",
- "integrity": "sha512-JUFr7DkFps3div9DYwpSg0O+s8zuSSRASUZUVNx6h6zhw2m8vcpToeS68JDPsFbmisMVSMYK0IxftngCRv7M9Q==",
- "dev": true,
- "requires": {
- "@types/resolve": "0.0.8",
- "builtin-modules": "^3.1.0",
- "is-module": "^1.0.0",
- "resolve": "^1.10.1",
- "rollup-pluginutils": "^2.7.0"
- }
- },
- "rollup-pluginutils": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.7.1.tgz",
- "integrity": "sha512-3nRf3buQGR9qz/IsSzhZAJyoK663kzseps8itkYHr+Z7ESuaffEPfgRinxbCRA0pf0gzLqkNKkSb8aNVTq75NA==",
- "dev": true,
- "requires": {
- "estree-walker": "^0.6.0",
- "micromatch": "^3.1.10"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "dev": true,
- "requires": {
- "ret": "~0.1.10"
- }
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
- },
- "sanitize-filename": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.1.tgz",
- "integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=",
- "dev": true,
- "requires": {
- "truncate-utf8-bytes": "^1.0.0"
- }
- },
- "sauce-connect-launcher": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.7.tgz",
- "integrity": "sha512-v07+QhFrxgz3seMFuRSonu3gW1s6DbcLQlFhjsRrmKUauzPbbudHdnn91WYgEwhoZVdPNzeZpAEJwcQyd9xnTA==",
- "dev": true,
- "requires": {
- "adm-zip": "~0.4.3",
- "async": "^2.1.2",
- "https-proxy-agent": "^2.2.1",
- "lodash": "^4.16.6",
- "rimraf": "^2.5.4"
- },
- "dependencies": {
- "async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
- "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.11"
- }
- }
- }
- },
- "saucelabs-connector": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/saucelabs-connector/-/saucelabs-connector-0.3.0.tgz",
- "integrity": "sha512-r0PWFUZeWMoWaKWhvnaHpro5VfpLbg+avKdjb0bs+xSTNh4S6sgjVJMhM8vSjOXog2DjZVe1Agv4Ta5GCMLMog==",
- "dev": true,
- "requires": {
- "babel-runtime": "^5.8.20",
- "lodash": "^4.13.1",
- "os-family": "^1.0.0",
- "pify": "^2.3.0",
- "pinkie": "^2.0.4",
- "read-file-relative": "^1.2.0",
- "request": "^2.67.0",
- "sauce-connect-launcher": "^1.2.5",
- "wd": "^1.2.0"
- },
- "dependencies": {
- "babel-runtime": {
- "version": "5.8.38",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz",
- "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=",
- "dev": true,
- "requires": {
- "core-js": "^1.0.0"
- }
- },
- "core-js": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
- "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=",
- "dev": true
- }
- }
- },
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
- "dev": true
- },
- "set-value": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
- "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.3",
- "split-string": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
- "dev": true
- },
- "snapdragon": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
- "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
- "dev": true,
- "requires": {
- "base": "^0.11.1",
- "debug": "^2.2.0",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "map-cache": "^0.2.2",
- "source-map": "^0.5.6",
- "source-map-resolve": "^0.5.0",
- "use": "^3.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "snapdragon-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
- "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
- "dev": true,
- "requires": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "snapdragon-util": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
- "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
- "dev": true,
- "requires": {
- "kind-of": "^3.2.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- },
- "source-map-resolve": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
- "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
- "dev": true,
- "requires": {
- "atob": "^2.1.1",
- "decode-uri-component": "^0.2.0",
- "resolve-url": "^0.2.1",
- "source-map-url": "^0.4.0",
- "urix": "^0.1.0"
- }
- },
- "source-map-support": {
- "version": "0.5.12",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
- "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "source-map-url": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
- "dev": true
- },
- "split-string": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
- "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
- "dev": true,
- "requires": {
- "extend-shallow": "^3.0.0"
- }
- },
- "sshpk": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
- "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
- "dev": true,
- "requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- }
- },
- "stackframe": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz",
- "integrity": "sha1-M6qE8Rd6VUjIk1Uzy/6zQgl19aQ=",
- "dev": true
- },
- "static-extend": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
- "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
- "dev": true,
- "requires": {
- "define-property": "^0.2.5",
- "object-copy": "^0.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "dev": true,
- "requires": {
- "is-utf8": "^0.2.0"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "tar-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
- "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
- "dev": true,
- "requires": {
- "bl": "^1.0.0",
- "buffer-alloc": "^1.2.0",
- "end-of-stream": "^1.0.0",
- "fs-constants": "^1.0.0",
- "readable-stream": "^2.3.0",
- "to-buffer": "^1.1.1",
- "xtend": "^4.0.0"
- }
- },
- "testcafe": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/testcafe/-/testcafe-1.3.1.tgz",
- "integrity": "sha512-5IkyFxKBdrUut9JEmGR8lU4qbxL9N9F/3yNJqfLF29bpRfrmJY2FZdAYQ1iHEayfCcSTxQxcqRCEkVsmRTaI4g==",
- "dev": true,
- "requires": {
- "@types/node": "^10.12.19",
- "async-exit-hook": "^1.1.2",
- "babel-core": "^6.22.1",
- "babel-plugin-transform-class-properties": "^6.24.1",
- "babel-plugin-transform-for-of-as-array": "^1.1.1",
- "babel-plugin-transform-runtime": "^6.22.0",
- "babel-preset-env": "^1.1.8",
- "babel-preset-flow": "^6.23.0",
- "babel-preset-stage-2": "^6.22.0",
- "babel-runtime": "^6.22.0",
- "bin-v8-flags-filter": "^1.1.2",
- "callsite": "^1.0.0",
- "callsite-record": "^4.0.0",
- "chai": "^4.1.2",
- "chalk": "^1.1.0",
- "chrome-emulated-devices-list": "^0.1.0",
- "chrome-remote-interface": "^0.25.3",
- "coffeescript": "^2.3.1",
- "commander": "^2.8.1",
- "debug": "^2.2.0",
- "dedent": "^0.4.0",
- "del": "^3.0.0",
- "elegant-spinner": "^1.0.1",
- "emittery": "^0.4.1",
- "endpoint-utils": "^1.0.2",
- "error-stack-parser": "^1.3.6",
- "globby": "^9.2.0",
- "graceful-fs": "^4.1.11",
- "graphlib": "^2.1.5",
- "import-lazy": "^3.1.0",
- "indent-string": "^1.2.2",
- "is-ci": "^1.0.10",
- "is-docker": "^1.1.0",
- "is-glob": "^2.0.1",
- "is-stream": "^1.1.0",
- "json5": "^2.1.0",
- "lodash": "^4.17.11",
- "log-update-async-hook": "^2.0.2",
- "make-dir": "^1.3.0",
- "map-reverse": "^1.0.1",
- "moment": "^2.10.3",
- "moment-duration-format-commonjs": "^1.0.0",
- "mustache": "^2.1.2",
- "nanoid": "^1.0.1",
- "node-version": "^1.0.0",
- "os-family": "^1.0.0",
- "parse5": "^1.5.0",
- "pify": "^2.3.0",
- "pinkie": "^2.0.4",
- "pngjs": "^3.3.1",
- "promisify-event": "^1.0.0",
- "qrcode-terminal": "^0.10.0",
- "read-file-relative": "^1.2.0",
- "replicator": "^1.0.3",
- "resolve-cwd": "^1.0.0",
- "resolve-from": "^4.0.0",
- "sanitize-filename": "^1.6.0",
- "source-map-support": "^0.5.5",
- "strip-bom": "^2.0.0",
- "testcafe-browser-tools": "1.6.8",
- "testcafe-hammerhead": "14.6.10",
- "testcafe-legacy-api": "3.1.11",
- "testcafe-reporter-json": "^2.1.0",
- "testcafe-reporter-list": "^2.1.0",
- "testcafe-reporter-minimal": "^2.1.0",
- "testcafe-reporter-spec": "^2.1.1",
- "testcafe-reporter-xunit": "^2.1.0",
- "time-limit-promise": "^1.0.2",
- "tmp": "0.0.28",
- "tree-kill": "^1.1.0",
- "typescript": "^3.3.3",
- "useragent": "^2.1.7"
- },
- "dependencies": {
- "@types/node": {
- "version": "10.14.12",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.12.tgz",
- "integrity": "sha512-QcAKpaO6nhHLlxWBvpc4WeLrTvPqlHOvaj0s5GriKkA1zq+bsFBPpfYCvQhLqLgYlIko8A9YrPdaMHCo5mBcpg==",
- "dev": true
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
- }
- },
- "testcafe-browser-provider-saucelabs": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/testcafe-browser-provider-saucelabs/-/testcafe-browser-provider-saucelabs-1.7.0.tgz",
- "integrity": "sha512-M7sRL2MgWuFmnIUJi/sB7w39WP4zSHUl2pDLhTy0mSUwBahM65Berj5t+K5UkAbQFilfLgP4hnkt75c/9RaJ1g==",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.11.6",
- "desired-capabilities": "^0.1.0",
- "lodash": "^4.14.2",
- "pify": "^2.3.0",
- "pinkie": "^2.0.4",
- "request": "^2.74.0",
- "saucelabs-connector": "^0.3.0"
- }
- },
- "testcafe-browser-tools": {
- "version": "1.6.8",
- "resolved": "https://registry.npmjs.org/testcafe-browser-tools/-/testcafe-browser-tools-1.6.8.tgz",
- "integrity": "sha512-xFgwmcAOutSJR6goqO8uUFGF5IF2xRC/Ssh4pB5QZ+bTjYsN5amnjgM+813bDBLelC+HmXKqylviz7Dzxbtbcw==",
- "dev": true,
- "requires": {
- "array-find": "^1.0.0",
- "babel-runtime": "^5.6.15",
- "graceful-fs": "^4.1.11",
- "linux-platform-info": "^0.0.3",
- "mkdirp": "^0.5.1",
- "mustache": "^2.1.2",
- "os-family": "^1.0.0",
- "pify": "^2.3.0",
- "pinkie": "^2.0.1",
- "read-file-relative": "^1.2.0",
- "which-promise": "^1.0.0"
- },
- "dependencies": {
- "babel-runtime": {
- "version": "5.8.38",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz",
- "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=",
- "dev": true,
- "requires": {
- "core-js": "^1.0.0"
- }
- },
- "core-js": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
- "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=",
- "dev": true
- }
- }
- },
- "testcafe-hammerhead": {
- "version": "14.6.10",
- "resolved": "https://registry.npmjs.org/testcafe-hammerhead/-/testcafe-hammerhead-14.6.10.tgz",
- "integrity": "sha512-fG/YTz7wKs6Fd0Fl9WlzO4j/ovDSAGxDLvLAz4ydzIKAdnZMZ22QbjYpfahCVpe9nzq/UHCQpSFdThQTmlFEmA==",
- "dev": true,
- "requires": {
- "acorn-hammerhead": "^0.2.0",
- "bowser": "1.6.0",
- "brotli": "^1.3.1",
- "crypto-md5": "^1.0.0",
- "css": "2.2.3",
- "esotope-hammerhead": "^0.2.1",
- "iconv-lite": "0.4.11",
- "lodash": "4.17.11",
- "lru-cache": "2.6.3",
- "match-url-wildcard": "0.0.4",
- "merge-stream": "^1.0.1",
- "mime": "~1.4.1",
- "mustache": "^2.1.1",
- "nanoid": "^0.2.2",
- "os-family": "^1.0.0",
- "parse5": "2.2.3",
- "pify": "^2.3.0",
- "pinkie": "1.0.0",
- "read-file-relative": "^1.2.0",
- "semver": "5.5.0",
- "tough-cookie": "2.3.3",
- "tunnel-agent": "0.6.0",
- "webauth": "^1.1.0"
- },
- "dependencies": {
- "nanoid": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-0.2.2.tgz",
- "integrity": "sha512-GHoRrvNEKiwdkwQ/enKL8AhQkkrBC/2KxMZkDvQzp8OtkpX8ZAmoYJWFVl7l8F2+HcEJUfdg21Ab2wXXfrvACQ==",
- "dev": true
- },
- "parse5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
- "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
- "dev": true
- },
- "pinkie": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz",
- "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=",
- "dev": true
- },
- "semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
- "dev": true
- }
- }
- },
- "testcafe-legacy-api": {
- "version": "3.1.11",
- "resolved": "https://registry.npmjs.org/testcafe-legacy-api/-/testcafe-legacy-api-3.1.11.tgz",
- "integrity": "sha512-JWv8Exc9FAEBbKw+IP97Ebd+0FzA3nzgRv9iQCNh/+JlZyUox7NWiojs9BAXqgxIltl54rdo7TxPkNslxb+Ltw==",
- "dev": true,
- "requires": {
- "async": "0.2.6",
- "babel-runtime": "^5.8.34",
- "dedent": "^0.6.0",
- "highlight-es": "^1.0.0",
- "is-jquery-obj": "^0.1.0",
- "lodash": "^4.14.0",
- "moment": "^2.14.1",
- "mustache": "^2.2.1",
- "os-family": "^1.0.0",
- "parse5": "^2.1.5",
- "pify": "^2.3.0",
- "pinkie": "^2.0.1",
- "strip-bom": "^2.0.0"
- },
- "dependencies": {
- "babel-runtime": {
- "version": "5.8.38",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz",
- "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=",
- "dev": true,
- "requires": {
- "core-js": "^1.0.0"
- }
- },
- "core-js": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
- "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=",
- "dev": true
- },
- "dedent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.6.0.tgz",
- "integrity": "sha1-Dm2o8M5Sg471zsXI+TlrDBtko8s=",
- "dev": true
- },
- "parse5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
- "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
- "dev": true
- }
- }
- },
- "testcafe-reporter-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/testcafe-reporter-json/-/testcafe-reporter-json-2.2.0.tgz",
- "integrity": "sha512-wfpNaZgGP2WoqdmnIXOyxcpwSzdH1HvzXSN397lJkXOrQrwhuGUThPDvyzPnZqxZSzXdDUvIPJm55tCMWbfymQ==",
- "dev": true
- },
- "testcafe-reporter-list": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/testcafe-reporter-list/-/testcafe-reporter-list-2.1.0.tgz",
- "integrity": "sha1-n6ifcbl9Pf5ktDAtXiJ97mmuxrk=",
- "dev": true
- },
- "testcafe-reporter-minimal": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/testcafe-reporter-minimal/-/testcafe-reporter-minimal-2.1.0.tgz",
- "integrity": "sha1-Z28DVHY0FDxurzq1KGgnOkvr9CE=",
- "dev": true
- },
- "testcafe-reporter-spec": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/testcafe-reporter-spec/-/testcafe-reporter-spec-2.1.1.tgz",
- "integrity": "sha1-gVb87Q9RMkhlWa1WC8gGdkaSdew=",
- "dev": true
- },
- "testcafe-reporter-xunit": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/testcafe-reporter-xunit/-/testcafe-reporter-xunit-2.1.0.tgz",
- "integrity": "sha1-5tZsVyzhWvJmcGrw/WELKoQd1EM=",
- "dev": true
- },
- "time-limit-promise": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/time-limit-promise/-/time-limit-promise-1.0.4.tgz",
- "integrity": "sha512-FLHDDsIDducw7MBcRWlFtW2Tm50DoKOSFf0Nzx17qwXj8REXCte0eUkHrJl9QU3Bl9arG3XNYX0PcHpZ9xyuLw==",
- "dev": true
- },
- "tmp": {
- "version": "0.0.28",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz",
- "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=",
- "dev": true,
- "requires": {
- "os-tmpdir": "~1.0.1"
- }
- },
- "to-buffer": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
- "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
- "dev": true
- },
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
- "dev": true
- },
- "to-object-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "to-regex": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
- "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
- "dev": true,
- "requires": {
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "regex-not": "^1.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- },
- "tough-cookie": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
- "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
- "dev": true,
- "requires": {
- "punycode": "^1.4.1"
- }
- },
- "tree-kill": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz",
- "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==",
- "dev": true
- },
- "trim-right": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
- "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
- "dev": true
- },
- "truncate-utf8-bytes": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
- "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=",
- "dev": true,
- "requires": {
- "utf8-byte-length": "^1.0.1"
- }
- },
- "ts-node": {
- "version": "8.10.2",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz",
- "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==",
- "dev": true,
- "requires": {
- "arg": "^4.1.0",
- "diff": "^4.0.1",
- "make-error": "^1.1.1",
- "source-map-support": "^0.5.17",
- "yn": "3.1.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "source-map-support": {
- "version": "0.5.19",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
- "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- }
- }
- },
- "tslib": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
- "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==",
- "dev": true
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
- "dev": true
- },
- "type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true
- },
- "typescript": {
- "version": "3.9.7",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz",
- "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==",
- "dev": true
- },
- "uglify-js": {
- "version": "3.5.15",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.15.tgz",
- "integrity": "sha512-fe7aYFotptIddkwcm6YuA0HmknBZ52ZzOsUxZEdhhkSsz7RfjHDX2QDxwKTiv4JQ5t5NhfmpgAK+J7LiDhKSqg==",
- "dev": true,
- "requires": {
- "commander": "~2.20.0",
- "source-map": "~0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "ultron": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
- "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
- "dev": true
- },
- "unicode-canonical-property-names-ecmascript": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
- "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
- "dev": true
- },
- "unicode-match-property-ecmascript": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
- "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
- "dev": true,
- "requires": {
- "unicode-canonical-property-names-ecmascript": "^1.0.4",
- "unicode-property-aliases-ecmascript": "^1.0.4"
- }
- },
- "unicode-match-property-value-ecmascript": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz",
- "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==",
- "dev": true
- },
- "unicode-property-aliases-ecmascript": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz",
- "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==",
- "dev": true
- },
- "union-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
- "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
- "dev": true,
- "requires": {
- "arr-union": "^3.1.0",
- "get-value": "^2.0.6",
- "is-extendable": "^0.1.1",
- "set-value": "^0.4.3"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "set-value": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
- "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.1",
- "to-object-path": "^0.3.0"
- }
- }
- }
- },
- "unset-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
- "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
- "dev": true,
- "requires": {
- "has-value": "^0.3.1",
- "isobject": "^3.0.0"
- },
- "dependencies": {
- "has-value": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
- "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
- "dev": true,
- "requires": {
- "get-value": "^2.0.3",
- "has-values": "^0.1.4",
- "isobject": "^2.0.0"
- },
- "dependencies": {
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
- "requires": {
- "isarray": "1.0.0"
- }
- }
- }
- },
- "has-values": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
- "dev": true
- }
- }
- },
- "uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
- "dev": true,
- "requires": {
- "punycode": "^2.1.0"
- },
- "dependencies": {
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true
- }
- }
- },
- "urix": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
- "dev": true
- },
- "use": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
- "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
- "dev": true
- },
- "useragent": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz",
- "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==",
- "dev": true,
- "requires": {
- "lru-cache": "4.1.x",
- "tmp": "0.0.x"
- },
- "dependencies": {
- "lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
- "dev": true,
- "requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- }
- }
- },
- "utf8-byte-length": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",
- "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=",
- "dev": true
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
- },
- "uuid": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
- "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
- "dev": true
- },
- "vargs": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz",
- "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=",
- "dev": true
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "wd": {
- "version": "1.11.2",
- "resolved": "https://registry.npmjs.org/wd/-/wd-1.11.2.tgz",
- "integrity": "sha512-zXJY9ARjQQYN2LatLTRcW39EYzIVqKNhGpp4XWJmRgHBioG4FoenIOsoVbaO8lnFGgv31V99kAy5hB4eWGIwzA==",
- "dev": true,
- "requires": {
- "archiver": "2.1.1",
- "async": "2.0.1",
- "lodash": "4.17.11",
- "mkdirp": "^0.5.1",
- "q": "1.4.1",
- "request": "2.88.0",
- "vargs": "0.1.0"
- },
- "dependencies": {
- "async": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz",
- "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=",
- "dev": true,
- "requires": {
- "lodash": "^4.8.0"
- }
- }
- }
- },
- "webauth": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/webauth/-/webauth-1.1.0.tgz",
- "integrity": "sha1-ZHBPa4AmmGYFvDymKZUubib90QA=",
- "dev": true
- },
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "which-promise": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/which-promise/-/which-promise-1.0.0.tgz",
- "integrity": "sha1-ILch3wWzW3Bhdv+hCwkJq6RgMDU=",
- "dev": true,
- "requires": {
- "pify": "^2.2.0",
- "pinkie-promise": "^1.0.0",
- "which": "^1.1.2"
- },
- "dependencies": {
- "pinkie": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz",
- "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=",
- "dev": true
- },
- "pinkie-promise": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz",
- "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=",
- "dev": true,
- "requires": {
- "pinkie": "^1.0.0"
- }
- }
- }
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "dev": true,
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- },
- "ws": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
- "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
- "dev": true,
- "requires": {
- "async-limiter": "~1.0.0",
- "safe-buffer": "~5.1.0",
- "ultron": "~1.1.0"
- }
- },
- "xtend": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
- "dev": true
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
- "dev": true
- },
- "yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "dev": true
- },
- "zip-stream": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz",
- "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=",
- "dev": true,
- "requires": {
- "archiver-utils": "^1.3.0",
- "compress-commons": "^1.2.0",
- "lodash": "^4.8.0",
- "readable-stream": "^2.0.0"
- }
- }
- }
-}
diff --git a/package.json b/package.json
index cb8a088cf..918db6e7d 100644
--- a/package.json
+++ b/package.json
@@ -1,66 +1,21 @@
{
- "name": "sortablejs",
- "exportName": "Sortable",
- "version": "1.11.0",
+ "name": "@sortable/monorepo",
+ "private": true,
"scripts": {
- "build:umd": "NODE_ENV=umd rollup -c ./scripts/umd-build.js",
- "build:umd:watch": "set NODE_ENV=umd&& rollup -w -c ./scripts/umd-build.js",
- "build:es": "set NODE_ENV=es&& rollup -c ./scripts/esm-build.js",
- "build:es:watch": "set NODE_ENV=es&& rollup -w -c ./scripts/esm-build.js",
- "minify": "node ./scripts/minify.js",
- "build": "npm run build:es && npm run build:umd && npm run minify",
- "test:compat": "ts-node ./scripts/test-compat.ts",
- "test": "ts-node ./scripts/test.ts"
+ "test:compat": "ts-node scripts/test-compat.ts",
+ "test": "ts-node scripts/test.ts",
+ "build:umd": "cd packages/sortablejs && npm run build:umd"
},
"devDependencies": {
- "@babel/core": "^7.4.4",
- "@babel/plugin-transform-object-assign": "^7.2.0",
- "@babel/preset-env": "^7.4.4",
- "@rollup/plugin-babel": "^5.2.0",
- "@rollup/plugin-json": "^4.1.0",
- "@rollup/plugin-node-resolve": "^9.0.0",
- "@rollup/plugin-typescript": "^5.0.2",
- "@types/node": "^14.0.27",
- "fp-ts": "^2.8.1",
- "logging-ts": "^0.3.3",
- "rollup": "^2.14",
- "rollup-plugin-babel": "^4.3.2",
- "rollup-plugin-json": "^4.0.0",
- "rollup-plugin-node-resolve": "^5.0.0",
- "testcafe": "^1.3.1",
- "testcafe-browser-provider-saucelabs": "^1.7.0",
+ "lerna": "^3.22.1",
+ "@types/node": "^14.10.1",
+ "fp-ts": "^2.8.2",
+ "logging-ts": "^0.3.4",
+ "npm-run-all": "^4.1.5",
+ "testcafe": "^1.9.2",
+ "testcafe-browser-provider-saucelabs": "^1.8.0",
"testcafe-reporter-xunit": "^2.1.0",
"ts-node": "^8.10.2",
- "tslib": "^2.0.1",
- "typescript": "^3.9.7",
- "uglify-js": "^3.5.12"
- },
- "description": "JavaScript library for reorderable drag-and-drop lists on modern browsers and touch devices. No jQuery required. Supports Meteor, AngularJS, React, Polymer, Vue, Knockout and any CSS library, e.g. Bootstrap.",
- "main": "./Sortable.js",
- "module": "modular/sortable.esm.js",
- "maintainers": [
- "Konstantin Lebedev ",
- "Owen Mills "
- ],
- "repository": {
- "type": "git",
- "url": "git://github.com/SortableJS/Sortable.git"
- },
- "files": [
- "Sortable.js",
- "Sortable.min.js",
- "modular/"
- ],
- "keywords": [
- "sortable",
- "reorder",
- "drag",
- "meteor",
- "angular",
- "ng-sortable",
- "react",
- "vue",
- "mixin"
- ],
- "license": "MIT"
+ "typescript": "^3.9.7"
+ }
}
diff --git a/plugins/AutoScroll/README.md b/packages/plugins/auto-scroll/README.md
similarity index 100%
rename from plugins/AutoScroll/README.md
rename to packages/plugins/auto-scroll/README.md
diff --git a/packages/plugins/auto-scroll/package.json b/packages/plugins/auto-scroll/package.json
new file mode 100644
index 000000000..f7ae1b4b6
--- /dev/null
+++ b/packages/plugins/auto-scroll/package.json
@@ -0,0 +1,4 @@
+{
+ "name": "@sortable/plugin-auto-scroll",
+ "private": true
+}
diff --git a/packages/plugins/auto-scroll/src/index.ts b/packages/plugins/auto-scroll/src/index.ts
new file mode 100644
index 000000000..4d421dcd6
--- /dev/null
+++ b/packages/plugins/auto-scroll/src/index.ts
@@ -0,0 +1,311 @@
+import {
+ on,
+ off,
+ css,
+ throttle,
+ cancelThrottle,
+ scrollBy,
+ getParentAutoScrollElement,
+ expando,
+ getRect,
+ getWindowScrollingElement,
+ Edge,
+ IE11OrLess,
+ Safari,
+} from "../../../utils/src";
+
+import Sortable from "../../../sortable/src/Sortable";
+
+let autoScrolls = [],
+ scrollEl,
+ scrollRootEl,
+ scrolling = false,
+ lastAutoScrollX,
+ lastAutoScrollY,
+ touchEvt,
+ pointerElemChangedInterval;
+
+function AutoScrollPlugin() {
+ function AutoScroll() {
+ this.defaults = {
+ scroll: true,
+ scrollSensitivity: 30,
+ scrollSpeed: 10,
+ bubbleScroll: true,
+ };
+
+ // Bind all private methods
+ for (let fn in this) {
+ if (fn.charAt(0) === "_" && typeof this[fn] === "function") {
+ this[fn] = this[fn].bind(this);
+ }
+ }
+ }
+
+ AutoScroll.prototype = {
+ dragStarted({ originalEvent }) {
+ if (this.sortable.nativeDraggable) {
+ on(document, "dragover", this._handleAutoScroll);
+ } else {
+ if (this.options.supportPointer) {
+ on(document, "pointermove", this._handleFallbackAutoScroll);
+ } else if (originalEvent.touches) {
+ on(document, "touchmove", this._handleFallbackAutoScroll);
+ } else {
+ on(document, "mousemove", this._handleFallbackAutoScroll);
+ }
+ }
+ },
+
+ dragOverCompleted({ originalEvent }) {
+ // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)
+ if (!this.options.dragOverBubble && !originalEvent.rootEl) {
+ this._handleAutoScroll(originalEvent);
+ }
+ },
+
+ drop() {
+ if (this.sortable.nativeDraggable) {
+ off(document, "dragover", this._handleAutoScroll);
+ } else {
+ off(document, "pointermove", this._handleFallbackAutoScroll);
+ off(document, "touchmove", this._handleFallbackAutoScroll);
+ off(document, "mousemove", this._handleFallbackAutoScroll);
+ }
+
+ clearPointerElemChangedInterval();
+ clearAutoScrolls();
+ cancelThrottle();
+ },
+
+ nulling() {
+ touchEvt = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;
+
+ autoScrolls.length = 0;
+ },
+
+ _handleFallbackAutoScroll(evt) {
+ this._handleAutoScroll(evt, true);
+ },
+
+ _handleAutoScroll(evt, fallback) {
+ const x = (evt.touches ? evt.touches[0] : evt).clientX,
+ y = (evt.touches ? evt.touches[0] : evt).clientY,
+ elem = document.elementFromPoint(x, y);
+
+ touchEvt = evt;
+
+ // IE does not seem to have native autoscroll,
+ // Edge's autoscroll seems too conditional,
+ // MACOS Safari does not have autoscroll,
+ // Firefox and Chrome are good
+ if (fallback || Edge || IE11OrLess || Safari) {
+ //@ts-ignore
+ autoScroll(evt, this.options, elem, fallback);
+
+ // Listener for pointer element change
+ let ogElemScroller = getParentAutoScrollElement(elem, true);
+ if (
+ scrolling &&
+ (!pointerElemChangedInterval ||
+ x !== lastAutoScrollX ||
+ y !== lastAutoScrollY)
+ ) {
+ pointerElemChangedInterval && clearPointerElemChangedInterval();
+ // Detect for pointer elem change, emulating native DnD behaviour
+ pointerElemChangedInterval = setInterval(() => {
+ let newElem = getParentAutoScrollElement(
+ document.elementFromPoint(x, y),
+ true
+ );
+ if (newElem !== ogElemScroller) {
+ ogElemScroller = newElem;
+ clearAutoScrolls();
+ }
+ //@ts-ignore
+ autoScroll(evt, this.options, newElem, fallback);
+ }, 10);
+ lastAutoScrollX = x;
+ lastAutoScrollY = y;
+ }
+ } else {
+ // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll
+ if (
+ !this.options.bubbleScroll ||
+ getParentAutoScrollElement(elem, true) === getWindowScrollingElement()
+ ) {
+ clearAutoScrolls();
+ return;
+ }
+ autoScroll(
+ //@ts-ignore
+ evt,
+ this.options,
+ getParentAutoScrollElement(elem, false),
+ false
+ );
+ }
+ },
+ };
+
+ return Object.assign(AutoScroll, {
+ pluginName: "scroll",
+ initializeByDefault: true,
+ });
+}
+
+function clearAutoScrolls() {
+ autoScrolls.forEach(function (autoScroll) {
+ clearInterval(autoScroll.pid);
+ });
+ autoScrolls = [];
+}
+
+function clearPointerElemChangedInterval() {
+ clearInterval(pointerElemChangedInterval);
+}
+
+const autoScroll = throttle(function (evt, options, rootEl, isFallback) {
+ // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
+ if (!options.scroll) return;
+ const x = (evt.touches ? evt.touches[0] : evt).clientX,
+ y = (evt.touches ? evt.touches[0] : evt).clientY,
+ sens = options.scrollSensitivity,
+ speed = options.scrollSpeed,
+ winScroller = getWindowScrollingElement();
+
+ let scrollThisInstance = false,
+ scrollCustomFn;
+
+ // New scroll root, set scrollEl
+ if (scrollRootEl !== rootEl) {
+ scrollRootEl = rootEl;
+
+ clearAutoScrolls();
+
+ scrollEl = options.scroll;
+ scrollCustomFn = options.scrollFn;
+
+ if (scrollEl === true) {
+ scrollEl = getParentAutoScrollElement(rootEl, true);
+ }
+ }
+
+ let layersOut = 0;
+ let currentParent = scrollEl;
+ do {
+ let el = currentParent,
+ //@ts-ignore
+ rect = getRect(el),
+ top = rect.top,
+ bottom = rect.bottom,
+ left = rect.left,
+ right = rect.right,
+ width = rect.width,
+ height = rect.height,
+ canScrollX,
+ canScrollY,
+ scrollWidth = el.scrollWidth,
+ scrollHeight = el.scrollHeight,
+ //@ts-ignore
+ elCSS = css(el),
+ scrollPosX = el.scrollLeft,
+ scrollPosY = el.scrollTop;
+
+ if (el === winScroller) {
+ canScrollX =
+ width < scrollWidth &&
+ (elCSS.overflowX === "auto" ||
+ elCSS.overflowX === "scroll" ||
+ elCSS.overflowX === "visible");
+ canScrollY =
+ height < scrollHeight &&
+ (elCSS.overflowY === "auto" ||
+ elCSS.overflowY === "scroll" ||
+ elCSS.overflowY === "visible");
+ } else {
+ canScrollX =
+ width < scrollWidth &&
+ (elCSS.overflowX === "auto" || elCSS.overflowX === "scroll");
+ canScrollY =
+ height < scrollHeight &&
+ (elCSS.overflowY === "auto" || elCSS.overflowY === "scroll");
+ }
+
+ let vx =
+ canScrollX &&
+ //@ts-ignore
+ (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) -
+ //@ts-ignore
+ (Math.abs(left - x) <= sens && !!scrollPosX);
+ let vy =
+ canScrollY &&
+ //@ts-ignore
+ (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) -
+ //@ts-ignore
+ (Math.abs(top - y) <= sens && !!scrollPosY);
+
+ if (!autoScrolls[layersOut]) {
+ for (let i = 0; i <= layersOut; i++) {
+ if (!autoScrolls[i]) {
+ autoScrolls[i] = {};
+ }
+ }
+ }
+
+ if (
+ autoScrolls[layersOut].vx != vx ||
+ autoScrolls[layersOut].vy != vy ||
+ autoScrolls[layersOut].el !== el
+ ) {
+ autoScrolls[layersOut].el = el;
+ autoScrolls[layersOut].vx = vx;
+ autoScrolls[layersOut].vy = vy;
+
+ clearInterval(autoScrolls[layersOut].pid);
+
+ if (vx != 0 || vy != 0) {
+ scrollThisInstance = true;
+ /* jshint loopfunc:true */
+ autoScrolls[layersOut].pid = setInterval(
+ function () {
+ // emulate drag over during autoscroll (fallback), emulating native DnD behaviour
+ if (isFallback && this.layer === 0) {
+ //@ts-ignore
+ Sortable.active._onTouchMove(touchEvt); // To move ghost if it is positioned absolutely
+ }
+ let scrollOffsetY = autoScrolls[this.layer].vy
+ ? autoScrolls[this.layer].vy * speed
+ : 0;
+ let scrollOffsetX = autoScrolls[this.layer].vx
+ ? autoScrolls[this.layer].vx * speed
+ : 0;
+
+ if (typeof scrollCustomFn === "function") {
+ if (
+ scrollCustomFn.call(
+ //@ts-ignore
+ Sortable.dragged.parentNode[expando],
+ scrollOffsetX,
+ scrollOffsetY,
+ evt,
+ touchEvt,
+ autoScrolls[this.layer].el
+ ) !== "continue"
+ ) {
+ return;
+ }
+ }
+
+ scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);
+ }.bind({ layer: layersOut }),
+ 24
+ );
+ }
+ }
+ layersOut++;
+ } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));
+ scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not
+}, 30);
+
+export default AutoScrollPlugin;
diff --git a/plugins/MultiDrag/README.md b/packages/plugins/multi-drag/README.md
similarity index 100%
rename from plugins/MultiDrag/README.md
rename to packages/plugins/multi-drag/README.md
diff --git a/packages/plugins/multi-drag/package.json b/packages/plugins/multi-drag/package.json
new file mode 100644
index 000000000..2df64d130
--- /dev/null
+++ b/packages/plugins/multi-drag/package.json
@@ -0,0 +1,4 @@
+{
+ "name": "@sortable/plugin-multi-drag",
+ "private": true
+}
diff --git a/packages/plugins/multi-drag/src/index.ts b/packages/plugins/multi-drag/src/index.ts
new file mode 100644
index 000000000..7ed65e4f2
--- /dev/null
+++ b/packages/plugins/multi-drag/src/index.ts
@@ -0,0 +1,701 @@
+import {
+ toggleClass,
+ getRect,
+ index,
+ closest,
+ on,
+ off,
+ clone,
+ css,
+ setRect,
+ unsetRect,
+ matrix,
+ expando,
+} from "../../../utils/src";
+
+import dispatchEvent from "../../../sortable/src/EventDispatcher";
+
+let multiDragElements = [],
+ multiDragClones = [],
+ lastMultiDragSelect, // for selection with modifier key down (SHIFT)
+ multiDragSortable,
+ initialFolding = false, // Initial multi-drag fold when drag started
+ folding = false, // Folding any other time
+ dragStarted = false,
+ dragEl,
+ clonesFromRect,
+ clonesHidden;
+
+function MultiDragPlugin() {
+ function MultiDrag(sortable) {
+ // Bind all private methods
+ for (let fn in this) {
+ if (fn.charAt(0) === "_" && typeof this[fn] === "function") {
+ this[fn] = this[fn].bind(this);
+ }
+ }
+
+ if (sortable.options.supportPointer) {
+ on(document, "pointerup", this._deselectMultiDrag);
+ } else {
+ on(document, "mouseup", this._deselectMultiDrag);
+ on(document, "touchend", this._deselectMultiDrag);
+ }
+
+ on(document, "keydown", this._checkKeyDown);
+ on(document, "keyup", this._checkKeyUp);
+
+ this.defaults = {
+ selectedClass: "sortable-selected",
+ multiDragKey: null,
+ setData(dataTransfer, dragEl) {
+ let data = "";
+ if (multiDragElements.length && multiDragSortable === sortable) {
+ multiDragElements.forEach((multiDragElement, i) => {
+ data += (!i ? "" : ", ") + multiDragElement.textContent;
+ });
+ } else {
+ data = dragEl.textContent;
+ }
+ dataTransfer.setData("Text", data);
+ },
+ };
+ }
+
+ MultiDrag.prototype = {
+ multiDragKeyDown: false,
+ isMultiDrag: false,
+
+ delayStartGlobal({ dragEl: dragged }) {
+ dragEl = dragged;
+ },
+
+ delayEnded() {
+ this.isMultiDrag = ~multiDragElements.indexOf(dragEl);
+ },
+
+ setupClone({ sortable, cancel }) {
+ if (!this.isMultiDrag) return;
+ for (let i = 0; i < multiDragElements.length; i++) {
+ multiDragClones.push(clone(multiDragElements[i]));
+
+ multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;
+
+ multiDragClones[i].draggable = false;
+ multiDragClones[i].style["will-change"] = "";
+
+ toggleClass(multiDragClones[i], this.options.selectedClass, false);
+ multiDragElements[i] === dragEl &&
+ toggleClass(multiDragClones[i], this.options.chosenClass, false);
+ }
+
+ sortable._hideClone();
+ cancel();
+ },
+
+ clone({ sortable, rootEl, dispatchSortableEvent, cancel }) {
+ if (!this.isMultiDrag) return;
+ if (!this.options.removeCloneOnHide) {
+ if (multiDragElements.length && multiDragSortable === sortable) {
+ insertMultiDragClones(true, rootEl);
+ dispatchSortableEvent("clone");
+
+ cancel();
+ }
+ }
+ },
+
+ showClone({ cloneNowShown, rootEl, cancel }) {
+ if (!this.isMultiDrag) return;
+ insertMultiDragClones(false, rootEl);
+ multiDragClones.forEach((clone) => {
+ css(clone, "display", "");
+ });
+
+ cloneNowShown();
+ clonesHidden = false;
+ cancel();
+ },
+
+ hideClone({ sortable, cloneNowHidden, cancel }) {
+ if (!this.isMultiDrag) return;
+ multiDragClones.forEach((clone) => {
+ css(clone, "display", "none");
+ if (this.options.removeCloneOnHide && clone.parentNode) {
+ clone.parentNode.removeChild(clone);
+ }
+ });
+
+ cloneNowHidden();
+ clonesHidden = true;
+ cancel();
+ },
+
+ dragStartGlobal({ sortable }) {
+ if (!this.isMultiDrag && multiDragSortable) {
+ multiDragSortable.multiDrag._deselectMultiDrag();
+ }
+
+ multiDragElements.forEach((multiDragElement) => {
+ //@ts-ignore
+ multiDragElement.sortableIndex = index(multiDragElement);
+ });
+
+ // Sort multi-drag elements
+ multiDragElements = multiDragElements.sort(function (a, b) {
+ return a.sortableIndex - b.sortableIndex;
+ });
+ dragStarted = true;
+ },
+
+ dragStarted({ sortable }) {
+ if (!this.isMultiDrag) return;
+ if (this.options.sort) {
+ // Capture rects,
+ // hide multi drag elements (by positioning them absolute),
+ // set multi drag elements rects to dragRect,
+ // show multi drag elements,
+ // animate to rects,
+ // unset rects & remove from DOM
+
+ sortable.captureAnimationState();
+
+ if (this.options.animation) {
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl) return;
+ css(multiDragElement, "position", "absolute");
+ });
+
+ //@ts-ignore
+ let dragRect = getRect(dragEl, false, true, true);
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl) return;
+ setRect(multiDragElement, dragRect);
+ });
+
+ folding = true;
+ initialFolding = true;
+ }
+ }
+
+ sortable.animateAll(() => {
+ folding = false;
+ initialFolding = false;
+
+ if (this.options.animation) {
+ multiDragElements.forEach((multiDragElement) => {
+ unsetRect(multiDragElement);
+ });
+ }
+
+ // Remove all auxiliary multidrag items from el, if sorting enabled
+ if (this.options.sort) {
+ removeMultiDragElements();
+ }
+ });
+ },
+
+ dragOver({ target, completed, cancel }) {
+ if (folding && ~multiDragElements.indexOf(target)) {
+ completed(false);
+ cancel();
+ }
+ },
+
+ revert({ fromSortable, rootEl, sortable, dragRect }) {
+ if (multiDragElements.length > 1) {
+ // Setup unfold animation
+ multiDragElements.forEach((multiDragElement) => {
+ sortable.addAnimationState({
+ target: multiDragElement,
+ //@ts-ignore
+ rect: folding ? getRect(multiDragElement) : dragRect,
+ });
+
+ unsetRect(multiDragElement);
+
+ multiDragElement.fromRect = dragRect;
+
+ fromSortable.removeAnimationState(multiDragElement);
+ });
+ folding = false;
+ insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);
+ }
+ },
+
+ dragOverCompleted({
+ sortable,
+ isOwner,
+ insertion,
+ activeSortable,
+ parentEl,
+ putSortable,
+ }) {
+ let options = this.options;
+ if (insertion) {
+ // Clones must be hidden before folding animation to capture dragRectAbsolute properly
+ if (isOwner) {
+ activeSortable._hideClone();
+ }
+
+ initialFolding = false;
+ // If leaving sort:false root, or already folding - Fold to new location
+ if (
+ options.animation &&
+ multiDragElements.length > 1 &&
+ (folding ||
+ (!isOwner && !activeSortable.options.sort && !putSortable))
+ ) {
+ //@ts-ignore
+ // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible
+ let dragRectAbsolute = getRect(dragEl, false, true, true);
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl) return;
+ setRect(multiDragElement, dragRectAbsolute);
+
+ // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted
+ // while folding, and so that we can capture them again because old sortable will no longer be fromSortable
+ parentEl.appendChild(multiDragElement);
+ });
+
+ folding = true;
+ }
+
+ // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out
+ if (!isOwner) {
+ // Only remove if not folding (folding will remove them anyways)
+ if (!folding) {
+ removeMultiDragElements();
+ }
+
+ if (multiDragElements.length > 1) {
+ let clonesHiddenBefore = clonesHidden;
+ activeSortable._showClone(sortable);
+
+ // Unfold animation for clones if showing from hidden
+ if (
+ activeSortable.options.animation &&
+ !clonesHidden &&
+ clonesHiddenBefore
+ ) {
+ multiDragClones.forEach((clone) => {
+ activeSortable.addAnimationState({
+ target: clone,
+ rect: clonesFromRect,
+ });
+
+ clone.fromRect = clonesFromRect;
+ clone.thisAnimationDuration = null;
+ });
+ }
+ } else {
+ activeSortable._showClone(sortable);
+ }
+ }
+ }
+ },
+
+ dragOverAnimationCapture({ dragRect, isOwner, activeSortable }) {
+ multiDragElements.forEach((multiDragElement) => {
+ multiDragElement.thisAnimationDuration = null;
+ });
+
+ if (
+ activeSortable.options.animation &&
+ !isOwner &&
+ activeSortable.multiDrag.isMultiDrag
+ ) {
+ clonesFromRect = Object.assign({}, dragRect);
+ let dragMatrix = matrix(dragEl, true);
+ clonesFromRect.top -= dragMatrix.f;
+ clonesFromRect.left -= dragMatrix.e;
+ }
+ },
+
+ dragOverAnimationComplete() {
+ if (folding) {
+ folding = false;
+ removeMultiDragElements();
+ }
+ },
+
+ drop({
+ originalEvent: evt,
+ rootEl,
+ parentEl,
+ sortable,
+ dispatchSortableEvent,
+ oldIndex,
+ putSortable,
+ }) {
+ let toSortable = putSortable || this.sortable;
+
+ if (!evt) return;
+
+ let options = this.options,
+ children = parentEl.children;
+
+ // Multi-drag selection
+ if (!dragStarted) {
+ if (options.multiDragKey && !this.multiDragKeyDown) {
+ this._deselectMultiDrag();
+ }
+ toggleClass(
+ dragEl,
+ options.selectedClass,
+ !~multiDragElements.indexOf(dragEl)
+ );
+
+ if (!~multiDragElements.indexOf(dragEl)) {
+ multiDragElements.push(dragEl);
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "select",
+ targetEl: dragEl,
+ //@ts-ignore
+ originalEvt: evt,
+ });
+
+ // Modifier activated, select from last to dragEl
+ if (
+ evt.shiftKey &&
+ lastMultiDragSelect &&
+ sortable.el.contains(lastMultiDragSelect)
+ ) {
+ //@ts-ignore
+ let lastIndex = index(lastMultiDragSelect),
+ //@ts-ignore
+ currentIndex = index(dragEl);
+
+ if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {
+ // Must include lastMultiDragSelect (select it), in case modified selection from no selection
+ // (but previous selection existed)
+ let n, i;
+ if (currentIndex > lastIndex) {
+ i = lastIndex;
+ n = currentIndex;
+ } else {
+ i = currentIndex;
+ n = lastIndex + 1;
+ }
+
+ for (; i < n; i++) {
+ if (~multiDragElements.indexOf(children[i])) continue;
+ toggleClass(children[i], options.selectedClass, true);
+ multiDragElements.push(children[i]);
+
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "select",
+ targetEl: children[i],
+ //@ts-ignore
+ originalEvt: evt,
+ });
+ }
+ }
+ } else {
+ lastMultiDragSelect = dragEl;
+ }
+
+ multiDragSortable = toSortable;
+ } else {
+ multiDragElements.splice(multiDragElements.indexOf(dragEl), 1);
+ lastMultiDragSelect = null;
+ dispatchEvent({
+ sortable,
+ rootEl,
+ name: "deselect",
+ targetEl: dragEl,
+ //@ts-ignore
+ originalEvt: evt,
+ });
+ }
+ }
+
+ // Multi-drag drop
+ if (dragStarted && this.isMultiDrag) {
+ // Do not "unfold" after around dragEl if reverted
+ if (
+ (parentEl[expando].options.sort || parentEl !== rootEl) &&
+ multiDragElements.length > 1
+ ) {
+ //@ts-ignore
+ let dragRect = getRect(dragEl),
+ multiDragIndex = index(
+ dragEl,
+ ":not(." + this.options.selectedClass + ")"
+ );
+
+ if (!initialFolding && options.animation)
+ dragEl.thisAnimationDuration = null;
+
+ toSortable.captureAnimationState();
+
+ if (!initialFolding) {
+ if (options.animation) {
+ dragEl.fromRect = dragRect;
+ multiDragElements.forEach((multiDragElement) => {
+ multiDragElement.thisAnimationDuration = null;
+ if (multiDragElement !== dragEl) {
+ //@ts-ignore
+ let rect = folding ? getRect(multiDragElement) : dragRect;
+ multiDragElement.fromRect = rect;
+
+ // Prepare unfold animation
+ toSortable.addAnimationState({
+ target: multiDragElement,
+ rect: rect,
+ });
+ }
+ });
+ }
+
+ // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert
+ // properly they must all be removed
+ removeMultiDragElements();
+
+ multiDragElements.forEach((multiDragElement) => {
+ if (children[multiDragIndex]) {
+ parentEl.insertBefore(
+ multiDragElement,
+ children[multiDragIndex]
+ );
+ } else {
+ parentEl.appendChild(multiDragElement);
+ }
+ multiDragIndex++;
+ });
+
+ // If initial folding is done, the elements may have changed position because they are now
+ // unfolding around dragEl, even though dragEl may not have his index changed, so update event
+ // must be fired here as Sortable will not.
+ //@ts-ignore
+ if (oldIndex === index(dragEl)) {
+ let update = false;
+ multiDragElements.forEach((multiDragElement) => {
+ //@ts-ignore
+ if (
+ //@ts-ignore
+ multiDragElement.sortableIndex !== index(multiDragElement)
+ ) {
+ update = true;
+ return;
+ }
+ });
+
+ if (update) {
+ dispatchSortableEvent("update");
+ }
+ }
+ }
+
+ // Must be done after capturing individual rects (scroll bar)
+ multiDragElements.forEach((multiDragElement) => {
+ unsetRect(multiDragElement);
+ });
+
+ toSortable.animateAll();
+ }
+
+ multiDragSortable = toSortable;
+ }
+
+ // Remove clones if necessary
+ if (
+ rootEl === parentEl ||
+ (putSortable && putSortable.lastPutMode !== "clone")
+ ) {
+ multiDragClones.forEach((clone) => {
+ clone.parentNode && clone.parentNode.removeChild(clone);
+ });
+ }
+ },
+
+ nullingGlobal() {
+ this.isMultiDrag = dragStarted = false;
+ multiDragClones.length = 0;
+ },
+
+ destroyGlobal() {
+ this._deselectMultiDrag();
+ off(document, "pointerup", this._deselectMultiDrag);
+ off(document, "mouseup", this._deselectMultiDrag);
+ off(document, "touchend", this._deselectMultiDrag);
+
+ off(document, "keydown", this._checkKeyDown);
+ off(document, "keyup", this._checkKeyUp);
+ },
+
+ _deselectMultiDrag(evt) {
+ if (typeof dragStarted !== "undefined" && dragStarted) return;
+
+ // Only deselect if selection is in this sortable
+ if (multiDragSortable !== this.sortable) return;
+
+ // Only deselect if target is not item in this sortable
+ if (
+ evt &&
+ closest(evt.target, this.options.draggable, this.sortable.el, false)
+ )
+ return;
+
+ // Only deselect if left click
+ if (evt && evt.button !== 0) return;
+
+ while (multiDragElements.length) {
+ let el = multiDragElements[0];
+ toggleClass(el, this.options.selectedClass, false);
+ multiDragElements.shift();
+ dispatchEvent({
+ sortable: this.sortable,
+ rootEl: this.sortable.el,
+ name: "deselect",
+ //@ts-ignore
+ targetEl: el,
+ //@ts-ignore
+ originalEvt: evt,
+ });
+ }
+ },
+
+ _checkKeyDown(evt) {
+ if (evt.key === this.options.multiDragKey) {
+ this.multiDragKeyDown = true;
+ }
+ },
+
+ _checkKeyUp(evt) {
+ if (evt.key === this.options.multiDragKey) {
+ this.multiDragKeyDown = false;
+ }
+ },
+ };
+
+ return Object.assign(MultiDrag, {
+ // Static methods & properties
+ pluginName: "multiDrag",
+ utils: {
+ /**
+ * Selects the provided multi-drag item
+ * @param {HTMLElement} el The element to be selected
+ */
+ select(el) {
+ let sortable = el.parentNode[expando];
+ if (
+ !sortable ||
+ !sortable.options.multiDrag ||
+ ~multiDragElements.indexOf(el)
+ )
+ return;
+ if (multiDragSortable && multiDragSortable !== sortable) {
+ multiDragSortable.multiDrag._deselectMultiDrag();
+ multiDragSortable = sortable;
+ }
+ toggleClass(el, sortable.options.selectedClass, true);
+ multiDragElements.push(el);
+ },
+ /**
+ * Deselects the provided multi-drag item
+ * @param {HTMLElement} el The element to be deselected
+ */
+ deselect(el) {
+ let sortable = el.parentNode[expando],
+ index = multiDragElements.indexOf(el);
+ if (!sortable || !sortable.options.multiDrag || !~index) return;
+ toggleClass(el, sortable.options.selectedClass, false);
+ multiDragElements.splice(index, 1);
+ },
+ },
+ eventProperties() {
+ const oldIndicies = [],
+ newIndicies = [];
+
+ multiDragElements.forEach((multiDragElement) => {
+ oldIndicies.push({
+ multiDragElement,
+ index: multiDragElement.sortableIndex,
+ });
+
+ // multiDragElements will already be sorted if folding
+ let newIndex;
+ if (folding && multiDragElement !== dragEl) {
+ newIndex = -1;
+ } else if (folding) {
+ newIndex = index(
+ multiDragElement,
+ ":not(." + this.options.selectedClass + ")"
+ );
+ } else {
+ //@ts-ignore
+ newIndex = index(multiDragElement);
+ }
+ newIndicies.push({
+ multiDragElement,
+ index: newIndex,
+ });
+ });
+ return {
+ items: [...multiDragElements],
+ clones: [...multiDragClones],
+ oldIndicies,
+ newIndicies,
+ };
+ },
+ optionListeners: {
+ multiDragKey(key) {
+ key = key.toLowerCase();
+ if (key === "ctrl") {
+ key = "Control";
+ } else if (key.length > 1) {
+ key = key.charAt(0).toUpperCase() + key.substr(1);
+ }
+ return key;
+ },
+ },
+ });
+}
+
+function insertMultiDragElements(clonesInserted, rootEl) {
+ multiDragElements.forEach((multiDragElement, i) => {
+ let target =
+ rootEl.children[
+ multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)
+ ];
+ if (target) {
+ rootEl.insertBefore(multiDragElement, target);
+ } else {
+ rootEl.appendChild(multiDragElement);
+ }
+ });
+}
+
+/**
+ * Insert multi-drag clones
+ * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted
+ * @param {HTMLElement} rootEl
+ */
+function insertMultiDragClones(elementsInserted, rootEl) {
+ multiDragClones.forEach((clone, i) => {
+ let target =
+ rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];
+ if (target) {
+ rootEl.insertBefore(clone, target);
+ } else {
+ rootEl.appendChild(clone);
+ }
+ });
+}
+
+function removeMultiDragElements() {
+ multiDragElements.forEach((multiDragElement) => {
+ if (multiDragElement === dragEl) return;
+ multiDragElement.parentNode &&
+ multiDragElement.parentNode.removeChild(multiDragElement);
+ });
+}
+
+export default MultiDragPlugin;
diff --git a/plugins/OnSpill/README.md b/packages/plugins/on-spill/README.md
similarity index 100%
rename from plugins/OnSpill/README.md
rename to packages/plugins/on-spill/README.md
diff --git a/packages/plugins/on-spill/package.json b/packages/plugins/on-spill/package.json
new file mode 100644
index 000000000..a3e76892a
--- /dev/null
+++ b/packages/plugins/on-spill/package.json
@@ -0,0 +1,4 @@
+{
+ "name": "@sortable/plugin-on-spill",
+ "private": true
+}
diff --git a/packages/plugins/on-spill/src/index.ts b/packages/plugins/on-spill/src/index.ts
new file mode 100644
index 000000000..24670c422
--- /dev/null
+++ b/packages/plugins/on-spill/src/index.ts
@@ -0,0 +1,76 @@
+import { getChild } from "../../../utils/src";
+
+const drop = function ({
+ originalEvent,
+ putSortable,
+ dragEl,
+ activeSortable,
+ dispatchSortableEvent,
+ hideGhostForTarget,
+ unhideGhostForTarget,
+}) {
+ if (!originalEvent) return;
+ let toSortable = putSortable || activeSortable;
+ hideGhostForTarget();
+ let touch =
+ originalEvent.changedTouches && originalEvent.changedTouches.length
+ ? originalEvent.changedTouches[0]
+ : originalEvent;
+ let target = document.elementFromPoint(touch.clientX, touch.clientY);
+ unhideGhostForTarget();
+ if (toSortable && !toSortable.el.contains(target)) {
+ dispatchSortableEvent("spill");
+ this.onSpill({ dragEl, putSortable });
+ }
+};
+
+function Revert() {}
+
+Revert.prototype = {
+ startIndex: null,
+ dragStart({ oldDraggableIndex }) {
+ this.startIndex = oldDraggableIndex;
+ },
+ onSpill({ dragEl, putSortable }) {
+ this.sortable.captureAnimationState();
+ if (putSortable) {
+ putSortable.captureAnimationState();
+ }
+ let nextSibling = getChild(this.sortable.el, this.startIndex, this.options);
+
+ if (nextSibling) {
+ this.sortable.el.insertBefore(dragEl, nextSibling);
+ } else {
+ this.sortable.el.appendChild(dragEl);
+ }
+ this.sortable.animateAll();
+ if (putSortable) {
+ putSortable.animateAll();
+ }
+ },
+ drop,
+};
+
+Object.assign(Revert, {
+ pluginName: "revertOnSpill",
+});
+
+function Remove() {}
+
+Remove.prototype = {
+ onSpill({ dragEl, putSortable }) {
+ const parentSortable = putSortable || this.sortable;
+ parentSortable.captureAnimationState();
+ dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);
+ parentSortable.animateAll();
+ },
+ drop,
+};
+
+Object.assign(Remove, {
+ pluginName: "removeOnSpill",
+});
+
+export default [Remove, Revert];
+
+export { Remove as RemoveOnSpill, Revert as RevertOnSpill };
diff --git a/plugins/Swap/README.md b/packages/plugins/swap/README.md
similarity index 100%
rename from plugins/Swap/README.md
rename to packages/plugins/swap/README.md
diff --git a/packages/plugins/swap/package.json b/packages/plugins/swap/package.json
new file mode 100644
index 000000000..8af41c3fc
--- /dev/null
+++ b/packages/plugins/swap/package.json
@@ -0,0 +1,4 @@
+{
+ "name": "@sortable/plugin-swap",
+ "private": true
+}
diff --git a/packages/plugins/swap/src/index.ts b/packages/plugins/swap/src/index.ts
new file mode 100644
index 000000000..d652ebdeb
--- /dev/null
+++ b/packages/plugins/swap/src/index.ts
@@ -0,0 +1,99 @@
+import { toggleClass, index } from "../../../utils/src";
+
+let lastSwapEl;
+
+function SwapPlugin() {
+ function Swap() {
+ this.defaults = {
+ swapClass: "sortable-swap-highlight",
+ };
+ }
+
+ Swap.prototype = {
+ dragStart({ dragEl }) {
+ lastSwapEl = dragEl;
+ },
+ dragOverValid({
+ completed,
+ target,
+ onMove,
+ activeSortable,
+ changed,
+ cancel,
+ }) {
+ if (!activeSortable.options.swap) return;
+ let el = this.sortable.el,
+ options = this.options;
+ if (target && target !== el) {
+ let prevSwapEl = lastSwapEl;
+ if (onMove(target) !== false) {
+ toggleClass(target, options.swapClass, true);
+ lastSwapEl = target;
+ } else {
+ lastSwapEl = null;
+ }
+
+ if (prevSwapEl && prevSwapEl !== lastSwapEl) {
+ toggleClass(prevSwapEl, options.swapClass, false);
+ }
+ }
+ changed();
+
+ completed(true);
+ cancel();
+ },
+ drop({ activeSortable, putSortable, dragEl }) {
+ let toSortable = putSortable || this.sortable;
+ let options = this.options;
+ lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);
+ if (
+ lastSwapEl &&
+ (options.swap || (putSortable && putSortable.options.swap))
+ ) {
+ if (dragEl !== lastSwapEl) {
+ toSortable.captureAnimationState();
+ if (toSortable !== activeSortable)
+ activeSortable.captureAnimationState();
+ swapNodes(dragEl, lastSwapEl);
+
+ toSortable.animateAll();
+ if (toSortable !== activeSortable) activeSortable.animateAll();
+ }
+ }
+ },
+ nulling() {
+ lastSwapEl = null;
+ },
+ };
+
+ return Object.assign(Swap, {
+ pluginName: "swap",
+ eventProperties() {
+ return {
+ swapItem: lastSwapEl,
+ };
+ },
+ });
+}
+
+function swapNodes(n1, n2) {
+ let p1 = n1.parentNode,
+ p2 = n2.parentNode,
+ i1,
+ i2;
+
+ if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;
+
+ //@ts-ignore
+ i1 = index(n1);
+ //@ts-ignore
+ i2 = index(n2);
+
+ if (p1.isEqualNode(p2) && i1 < i2) {
+ i2++;
+ }
+ p1.insertBefore(n2, p1.children[i1]);
+ p2.insertBefore(n1, p2.children[i2]);
+}
+
+export default SwapPlugin;
diff --git a/packages/sortable/README.md b/packages/sortable/README.md
new file mode 100644
index 000000000..74262de8f
--- /dev/null
+++ b/packages/sortable/README.md
@@ -0,0 +1,3 @@
+# sortable
+
+This is the primary class of sortablejs. This package is not the offical sortablejs, which can be found in packages/sortablejs.
diff --git a/packages/sortable/package.json b/packages/sortable/package.json
new file mode 100644
index 000000000..531a033ba
--- /dev/null
+++ b/packages/sortable/package.json
@@ -0,0 +1,5 @@
+{
+ "name": "@sortable/sortable",
+ "version": "1.11.1",
+ "private": true
+}
diff --git a/packages/sortable/src/Animation.ts b/packages/sortable/src/Animation.ts
new file mode 100644
index 000000000..2842e1cd0
--- /dev/null
+++ b/packages/sortable/src/Animation.ts
@@ -0,0 +1,200 @@
+import {
+ getRect,
+ css,
+ matrix,
+ isRectEqual,
+ indexOfObject,
+} from "../../utils/src";
+import * as Sortable from "./Sortable";
+
+export default function AnimationStateManager() {
+ let animationStates = [],
+ animationCallbackId;
+
+ return {
+ captureAnimationState() {
+ animationStates = [];
+ if (!this.options.animation) return;
+ let children = [].slice.call(this.el.children);
+
+ children.forEach((child) => {
+ //@ts-ignore
+ if (css(child, "display") === "none" || child === Sortable.ghost)
+ return;
+ animationStates.push({
+ target: child,
+ //@ts-ignore
+ rect: getRect(child),
+ });
+ let fromRect = { ...animationStates[animationStates.length - 1].rect };
+
+ // If animating: compensate for current animation
+ if (child.thisAnimationDuration) {
+ let childMatrix = matrix(child, true);
+ if (childMatrix) {
+ fromRect.top -= childMatrix.f;
+ fromRect.left -= childMatrix.e;
+ }
+ }
+
+ child.fromRect = fromRect;
+ });
+ },
+
+ addAnimationState(state) {
+ animationStates.push(state);
+ },
+
+ removeAnimationState(target) {
+ animationStates.splice(indexOfObject(animationStates, { target }), 1);
+ },
+
+ animateAll(callback) {
+ if (!this.options.animation) {
+ clearTimeout(animationCallbackId);
+ if (typeof callback === "function") callback();
+ return;
+ }
+
+ let animating = false,
+ animationTime = 0;
+
+ animationStates.forEach((state) => {
+ let time = 0,
+ animatingThis = false,
+ target = state.target,
+ fromRect = target.fromRect,
+ //@ts-ignore
+ toRect = getRect(target),
+ prevFromRect = target.prevFromRect,
+ prevToRect = target.prevToRect,
+ animatingRect = state.rect,
+ targetMatrix = matrix(target, true);
+
+ if (targetMatrix) {
+ // Compensate for current animation
+ toRect.top -= targetMatrix.f;
+ toRect.left -= targetMatrix.e;
+ }
+
+ target.toRect = toRect;
+
+ if (target.thisAnimationDuration) {
+ // Could also check if animatingRect is between fromRect and toRect
+ if (
+ isRectEqual(prevFromRect, toRect) &&
+ !isRectEqual(fromRect, toRect) &&
+ // Make sure animatingRect is on line between toRect & fromRect
+ (animatingRect.top - toRect.top) /
+ (animatingRect.left - toRect.left) ===
+ (fromRect.top - toRect.top) / (fromRect.left - toRect.left)
+ ) {
+ // If returning to same place as started from animation and on same axis
+ time = calculateRealTime(
+ animatingRect,
+ prevFromRect,
+ prevToRect,
+ this.options
+ );
+ }
+ }
+
+ // if fromRect != toRect: animate
+ if (!isRectEqual(toRect, fromRect)) {
+ target.prevFromRect = fromRect;
+ target.prevToRect = toRect;
+
+ if (!time) {
+ time = this.options.animation;
+ }
+ this.animate(target, animatingRect, toRect, time);
+ }
+
+ if (time) {
+ animating = true;
+ animationTime = Math.max(animationTime, time);
+ clearTimeout(target.animationResetTimer);
+ target.animationResetTimer = setTimeout(function () {
+ target.animationTime = 0;
+ target.prevFromRect = null;
+ target.fromRect = null;
+ target.prevToRect = null;
+ target.thisAnimationDuration = null;
+ }, time);
+ target.thisAnimationDuration = time;
+ }
+ });
+
+ clearTimeout(animationCallbackId);
+ if (!animating) {
+ if (typeof callback === "function") callback();
+ } else {
+ animationCallbackId = setTimeout(function () {
+ if (typeof callback === "function") callback();
+ }, animationTime);
+ }
+ animationStates = [];
+ },
+
+ animate(target, currentRect, toRect, duration) {
+ if (duration) {
+ css(target, "transition", "");
+ css(target, "transform", "");
+ //@ts-ignore
+ let elMatrix = matrix(this.el),
+ scaleX = elMatrix && elMatrix.a,
+ scaleY = elMatrix && elMatrix.d,
+ translateX = (currentRect.left - toRect.left) / (scaleX || 1),
+ translateY = (currentRect.top - toRect.top) / (scaleY || 1);
+
+ target.animatingX = !!translateX;
+ target.animatingY = !!translateY;
+
+ css(
+ target,
+ "transform",
+ "translate3d(" + translateX + "px," + translateY + "px,0)"
+ );
+
+ this.forRepaintDummy = repaint(target); // repaint
+
+ css(
+ target,
+ "transition",
+ "transform " +
+ duration +
+ "ms" +
+ (this.options.easing ? " " + this.options.easing : "")
+ );
+ css(target, "transform", "translate3d(0,0,0)");
+ typeof target.animated === "number" && clearTimeout(target.animated);
+ target.animated = setTimeout(function () {
+ css(target, "transition", "");
+ css(target, "transform", "");
+ target.animated = false;
+
+ target.animatingX = false;
+ target.animatingY = false;
+ }, duration);
+ }
+ },
+ };
+}
+
+function repaint(target) {
+ return target.offsetWidth;
+}
+
+function calculateRealTime(animatingRect, fromRect, toRect, options) {
+ return (
+ (Math.sqrt(
+ Math.pow(fromRect.top - animatingRect.top, 2) +
+ Math.pow(fromRect.left - animatingRect.left, 2)
+ ) /
+ Math.sqrt(
+ Math.pow(fromRect.top - toRect.top, 2) +
+ Math.pow(fromRect.left - toRect.left, 2)
+ )) *
+ options.animation
+ );
+}
diff --git a/packages/sortable/src/EventDispatcher.ts b/packages/sortable/src/EventDispatcher.ts
new file mode 100644
index 000000000..16c64759e
--- /dev/null
+++ b/packages/sortable/src/EventDispatcher.ts
@@ -0,0 +1,66 @@
+import { expando, IE11OrLess, Edge } from "../../utils/src";
+import PluginManager from "./PluginManager";
+
+export default function dispatchEvent({
+ sortable,
+ rootEl,
+ name,
+ targetEl,
+ cloneEl,
+ toEl,
+ fromEl,
+ oldIndex,
+ newIndex,
+ oldDraggableIndex,
+ newDraggableIndex,
+ originalEvent,
+ putSortable,
+ extraEventProperties,
+}) {
+ sortable = sortable || (rootEl && rootEl[expando]);
+ if (!sortable) return;
+
+ let evt,
+ options = sortable.options,
+ onName = "on" + name.charAt(0).toUpperCase() + name.substr(1);
+ // Support for new CustomEvent feature
+ if (window.CustomEvent && !IE11OrLess && !Edge) {
+ evt = new CustomEvent(name, {
+ bubbles: true,
+ cancelable: true,
+ });
+ } else {
+ evt = document.createEvent("Event");
+ evt.initEvent(name, true, true);
+ }
+
+ evt.to = toEl || rootEl;
+ evt.from = fromEl || rootEl;
+ evt.item = targetEl || rootEl;
+ evt.clone = cloneEl;
+
+ evt.oldIndex = oldIndex;
+ evt.newIndex = newIndex;
+
+ evt.oldDraggableIndex = oldDraggableIndex;
+ evt.newDraggableIndex = newDraggableIndex;
+
+ evt.originalEvent = originalEvent;
+ evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
+
+ let allEventProperties = {
+ ...extraEventProperties,
+ ...PluginManager.getEventProperties(name, sortable),
+ };
+ for (let option in allEventProperties) {
+ evt[option] = allEventProperties[option];
+ }
+
+ if (rootEl) {
+ rootEl.dispatchEvent(evt);
+ }
+
+ if (options[onName]) {
+ options[onName].call(sortable, evt);
+ }
+}
diff --git a/packages/sortable/src/PluginManager.ts b/packages/sortable/src/PluginManager.ts
new file mode 100644
index 000000000..70ddc9cac
--- /dev/null
+++ b/packages/sortable/src/PluginManager.ts
@@ -0,0 +1,100 @@
+let plugins = [];
+
+const defaults = {
+ initializeByDefault: true,
+};
+
+const pluginManager = {
+ mount(plugin) {
+ // Set default static properties
+ for (let option in defaults) {
+ if (defaults.hasOwnProperty(option) && !(option in plugin)) {
+ plugin[option] = defaults[option];
+ }
+ }
+ plugins.push(plugin);
+ },
+ pluginEvent(eventName, sortable, evt) {
+ this.eventCanceled = false;
+ evt.cancel = () => {
+ this.eventCanceled = true;
+ };
+ const eventNameGlobal = eventName + "Global";
+ plugins.forEach((plugin) => {
+ if (!sortable[plugin.pluginName]) return;
+ // Fire global events if it exists in this sortable
+ if (sortable[plugin.pluginName][eventNameGlobal]) {
+ sortable[plugin.pluginName][eventNameGlobal]({ sortable, ...evt });
+ }
+
+ // Only fire plugin event if plugin is enabled in this sortable,
+ // and plugin has event defined
+ if (
+ sortable.options[plugin.pluginName] &&
+ sortable[plugin.pluginName][eventName]
+ ) {
+ sortable[plugin.pluginName][eventName]({ sortable, ...evt });
+ }
+ });
+ },
+ initializePlugins(sortable, el, defaults, options) {
+ plugins.forEach((plugin) => {
+ const pluginName = plugin.pluginName;
+ if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;
+
+ let initialized = new plugin(sortable, el, sortable.options);
+ initialized.sortable = sortable;
+ initialized.options = sortable.options;
+ sortable[pluginName] = initialized;
+
+ // Add default options from plugin
+ Object.assign(defaults, initialized.defaults);
+ });
+
+ for (let option in sortable.options) {
+ if (!sortable.options.hasOwnProperty(option)) continue;
+ let modified = this.modifyOption(
+ sortable,
+ option,
+ sortable.options[option]
+ );
+ if (typeof modified !== "undefined") {
+ sortable.options[option] = modified;
+ }
+ }
+ },
+ getEventProperties(name, sortable) {
+ let eventProperties = {};
+ plugins.forEach((plugin) => {
+ if (typeof plugin.eventProperties !== "function") return;
+ Object.assign(
+ eventProperties,
+ plugin.eventProperties.call(sortable[plugin.pluginName], name)
+ );
+ });
+
+ return eventProperties;
+ },
+ modifyOption(sortable, name, value) {
+ let modifiedValue;
+ plugins.forEach((plugin) => {
+ // Plugin must exist on the Sortable
+ if (!sortable[plugin.pluginName]) return;
+
+ // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin
+ if (
+ plugin.optionListeners &&
+ typeof plugin.optionListeners[name] === "function"
+ ) {
+ modifiedValue = plugin.optionListeners[name].call(
+ sortable[plugin.pluginName],
+ value
+ );
+ }
+ });
+
+ return modifiedValue;
+ },
+};
+
+export default pluginManager;
diff --git a/src/Sortable.js b/packages/sortable/src/Sortable.ts
similarity index 97%
rename from src/Sortable.js
rename to packages/sortable/src/Sortable.ts
index f66d23cf9..5899ea7f4 100644
--- a/src/Sortable.js
+++ b/packages/sortable/src/Sortable.ts
@@ -1,27 +1,10 @@
-/**!
- * Sortable
- * @author RubaXa
- * @author owenm
- * @license MIT
- */
-
import { version } from "../package.json";
-
-import {
- IE11OrLess,
- Edge,
- FireFox,
- Safari,
- IOS,
- ChromeForAndroid,
-} from "./BrowserInfo.js";
-
-import AnimationStateManager from "./Animation.js";
-
-import PluginManager from "./PluginManager.js";
-
-import dispatchEvent from "./EventDispatcher.js";
-
+import AnimationStateManager from "./Animation";
+import PluginManager from "./PluginManager";
+import dispatchEvent from "./EventDispatcher";
+/**
+ * @todo import as namespace: import * as utils from "../../utils/src"
+ */
import {
on,
off,
@@ -42,11 +25,18 @@ import {
scrollBy,
clone,
expando,
-} from "./utils";
+ IE11OrLess,
+ Edge,
+ FireFox,
+ Safari,
+ IOS,
+ ChromeForAndroid,
+} from "../../utils/src";
let pluginEvent = function (
eventName,
sortable,
+ //@ts-ignore
{ evt: originalEvent, ...data } = {}
) {
PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, {
@@ -60,6 +50,7 @@ let pluginEvent = function (
cloneHidden,
dragStarted: moved,
putSortable,
+ //@ts-ignore
activeSortable: Sortable.active,
originalEvent,
@@ -156,6 +147,7 @@ const documentExists = typeof document !== "undefined",
return el.style.pointerEvents === "auto";
})(),
_detectDirection = function (el, options) {
+ //@ts-ignore
let elCSS = css(el),
elWidth =
parseInt(elCSS.width) -
@@ -165,17 +157,21 @@ const documentExists = typeof document !== "undefined",
parseInt(elCSS.borderRightWidth),
child1 = getChild(el, 0, options),
child2 = getChild(el, 1, options),
+ //@ts-ignore
firstChildCSS = child1 && css(child1),
+ //@ts-ignore
secondChildCSS = child2 && css(child2),
firstChildWidth =
firstChildCSS &&
parseInt(firstChildCSS.marginLeft) +
parseInt(firstChildCSS.marginRight) +
+ //@ts-ignore
getRect(child1).width,
secondChildWidth =
secondChildCSS &&
parseInt(secondChildCSS.marginLeft) +
parseInt(secondChildCSS.marginRight) +
+ //@ts-ignore
getRect(child2).width;
if (elCSS.display === "flex") {
@@ -237,8 +233,10 @@ const documentExists = typeof document !== "undefined",
_detectNearestEmptySortable = function (x, y) {
let ret;
sortables.some((sortable) => {
+ //@ts-ignore
if (lastChild(sortable)) return;
+ //@ts-ignore
let rect = getRect(sortable),
threshold = sortable[expando].options.emptyInsertThreshold,
insideHorizontally =
@@ -294,9 +292,13 @@ const documentExists = typeof document !== "undefined",
originalGroup = { name: originalGroup };
}
+ //@ts-ignore
group.name = originalGroup.name;
+ //@ts-ignore
group.checkPull = toFn(originalGroup.pull, true);
+ //@ts-ignore
group.checkPut = toFn(originalGroup.put);
+ //@ts-ignore
group.revertClone = originalGroup.revertClone;
options.group = group;
@@ -342,8 +344,11 @@ let nearestEmptyInsertDetectEvent = function (evt) {
event[i] = evt[i];
}
}
+ //@ts-ignore
event.target = event.rootEl = nearest;
+ //@ts-ignore
event.preventDefault = void 0;
+ //@ts-ignore
event.stopPropagation = void 0;
nearest[expando]._onDragOver(event);
}
@@ -406,6 +411,7 @@ function Sortable(el, options) {
delayOnTouchOnly: false,
touchStartThreshold:
(Number.parseInt ? Number : window).parseInt(
+ //@ts-ignore
window.devicePixelRatio,
10
) || 1,
@@ -415,10 +421,12 @@ function Sortable(el, options) {
fallbackTolerance: 0,
fallbackOffset: { x: 0, y: 0 },
supportPointer:
+ //@ts-ignore
Sortable.supportPointer !== false && "PointerEvent" in window,
emptyInsertThreshold: 5,
};
+ //@ts-ignore
PluginManager.initializePlugins(this, el, defaults);
// Set default options
@@ -541,6 +549,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
}
// Get the index of the dragged element within its parent
+ //@ts-ignore
oldIndex = index(target);
oldDraggableIndex = index(target, options.draggable);
@@ -603,6 +612,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
dragStartFn;
if (target && !dragEl && target.parentNode === el) {
+ //@ts-ignore
let dragRect = getRect(target);
rootEl = el;
dragEl = target;
@@ -611,6 +621,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
lastDownEl = target;
activeGroup = options.group;
+ //@ts-ignore
Sortable.dragged = dragEl;
tapEvt = {
@@ -629,6 +640,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
dragStartFn = function () {
pluginEvent("delayEnded", _this, { evt });
+ //@ts-ignore
if (Sortable.eventCanceled) {
_this._onDrop();
return;
@@ -682,6 +694,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
(!options.delayOnTouchOnly || touch) &&
(!this.nativeDraggable || !(Edge || IE11OrLess))
) {
+ //@ts-ignore
if (Sortable.eventCanceled) {
this._onDrop();
return;
@@ -754,9 +767,11 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
}
try {
+ //@ts-ignore
if (document.selection) {
// Timeout neccessary for IE9
_nextTick(function () {
+ //@ts-ignore
document.selection.empty();
});
} else {
@@ -780,6 +795,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
!fallback && toggleClass(dragEl, options.dragClass, false);
toggleClass(dragEl, options.ghostClass, true);
+ //@ts-ignore
Sortable.active = this;
fallback && this._appendGhost();
@@ -839,6 +855,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
target = parent; // store last element
} while (
/* jshint boss:true */
+ //@ts-ignore
(parent = parent.parentNode)
);
}
@@ -874,6 +891,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
(scaleY || 1);
// only set the status to dragging, when we are actually dragging
+ //@ts-ignore
if (!Sortable.active && !awaitingDragStarted) {
if (
fallbackTolerance &&
@@ -933,7 +951,9 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
ghostRelativeParent = container;
while (
+ //@ts-ignore
css(ghostRelativeParent, "position") === "static" &&
+ //@ts-ignore
css(ghostRelativeParent, "transform") === "none" &&
ghostRelativeParent !== document
) {
@@ -977,6 +997,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
css(ghostEl, "zIndex", "100000");
css(ghostEl, "pointerEvents", "none");
+ //@ts-ignore
Sortable.ghost = ghostEl;
container.appendChild(ghostEl);
@@ -999,12 +1020,14 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
let options = _this.options;
pluginEvent("dragStart", this, { evt });
+ //@ts-ignore
if (Sortable.eventCanceled) {
this._onDrop();
return;
}
pluginEvent("setupClone", this);
+ //@ts-ignore
if (!Sortable.eventCanceled) {
cloneEl = clone(dragEl);
@@ -1014,12 +1037,14 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
this._hideClone();
toggleClass(cloneEl, this.options.chosenClass, false);
+ //@ts-ignore
Sortable.clone = cloneEl;
}
// #1143: IFrame support workaround
_this.cloneId = _nextTick(function () {
pluginEvent("clone", _this);
+ //@ts-ignore
if (Sortable.eventCanceled) return;
if (!_this.options.removeCloneOnHide) {
@@ -1079,6 +1104,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
revert,
options = this.options,
group = options.group,
+ //@ts-ignore
activeSortable = Sortable.active,
isOwner = activeGroup === group,
canSort = options.sort,
@@ -1108,6 +1134,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
dragEl,
dragRect,
target,
+ //@ts-ignore
getRect(target),
evt,
after
@@ -1120,6 +1147,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
// Capture animation state
function capture() {
+ //@ts-ignore
dragOverEvent("dragOverAnimationCapture");
_this.captureAnimationState();
@@ -1152,8 +1180,10 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
toggleClass(dragEl, options.ghostClass, true);
}
+ //@ts-ignore
if (putSortable !== _this && _this !== Sortable.active) {
putSortable = _this;
+ //@ts-ignore
} else if (_this === Sortable.active && putSortable) {
putSortable = null;
}
@@ -1163,6 +1193,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
_this._ignoreWhileAnimating = target;
}
_this.animateAll(function () {
+ //@ts-ignore
dragOverEvent("dragOverAnimationComplete");
_this._ignoreWhileAnimating = null;
});
@@ -1195,6 +1226,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
// Call when dragEl has been inserted
function changed() {
+ //@ts-ignore
newIndex = index(dragEl);
newDraggableIndex = index(dragEl, options.draggable);
_dispatchEvent({
@@ -1213,7 +1245,9 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
target = closest(target, options.draggable, el, true);
+ //@ts-ignore
dragOverEvent("dragOver");
+ //@ts-ignore
if (Sortable.eventCanceled) return completedFired;
if (
@@ -1242,9 +1276,12 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
) {
vertical = this._getDirection(evt, target) === "vertical";
+ //@ts-ignore
dragRect = getRect(dragEl);
+ //@ts-ignore
dragOverEvent("dragOverValid");
+ //@ts-ignore
if (Sortable.eventCanceled) return completedFired;
if (revert) {
@@ -1253,8 +1290,10 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
this._hideClone();
+ //@ts-ignore
dragOverEvent("revert");
+ //@ts-ignore
if (!Sortable.eventCanceled) {
if (nextEl) {
rootEl.insertBefore(dragEl, nextEl);
@@ -1283,6 +1322,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
}
if (target) {
+ //@ts-ignore
targetRect = getRect(target);
}
@@ -1306,6 +1346,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
return completed(true);
}
} else if (target.parentNode === el) {
+ //@ts-ignore
targetRect = getRect(target);
let direction = 0,
targetBeforeFirstSwap,
@@ -1345,6 +1386,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
if (direction !== 0) {
// Check if target is beside dragEl in respective direction (ignoring hidden elements)
+ //@ts-ignore
let dragIndex = index(dragEl);
do {
@@ -1352,6 +1394,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
sibling = parentEl.children[dragIndex];
} while (
sibling &&
+ //@ts-ignore
(css(sibling, "display") === "none" || sibling === ghostEl)
);
}
@@ -1413,6 +1456,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
// must be done before animation
if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {
targetMoveDistance = Math.abs(
+ //@ts-ignore
targetBeforeFirstSwap - getRect(target)[side1]
);
}
@@ -1456,6 +1500,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
options = this.options;
// Get the index of the dragged element within its parent
+ //@ts-ignore
newIndex = index(dragEl);
newDraggableIndex = index(dragEl, options.draggable);
@@ -1466,9 +1511,11 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
parentEl = dragEl && dragEl.parentNode;
// Get again after plugin event
+ //@ts-ignore
newIndex = index(dragEl);
newDraggableIndex = index(dragEl, options.draggable);
+ //@ts-ignore
if (Sortable.eventCanceled) {
this._nulling();
return;
@@ -1606,6 +1653,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
}
}
+ //@ts-ignore
if (Sortable.active) {
/* jshint eqnull:true */
if (newIndex == null || newIndex === -1) {
@@ -1630,7 +1678,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
_nulling: function () {
pluginEvent("nulling", this);
-
+ //@ts-ignore
rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;
savedInputChecked.forEach(function (el) {
@@ -1786,6 +1834,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
_hideClone: function () {
if (!cloneHidden) {
pluginEvent("hideClone", this);
+ //@ts-ignore
if (Sortable.eventCanceled) return;
css(cloneEl, "display", "none");
@@ -1804,6 +1853,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
if (cloneHidden) {
pluginEvent("showClone", this);
+ //@ts-ignore
if (Sortable.eventCanceled) return;
// show clone at dragEl or original position
@@ -1862,6 +1912,7 @@ function onMove(
evt.dragged = dragEl;
evt.draggedRect = dragRect;
evt.related = targetEl || toEl;
+ //@ts-ignore
evt.relatedRect = targetRect || getRect(toEl);
evt.willInsertAfter = willInsertAfter;
@@ -1885,6 +1936,7 @@ function _unsilent() {
}
function _ghostIsLast(evt, vertical, sortable) {
+ //@ts-ignore
let rect = getRect(lastChild(sortable.el, sortable.options.draggable));
const spacer = 10;
@@ -1973,6 +2025,7 @@ function _getSwapDirection(
* @return {Number} Direction dragEl must be swapped
*/
function _getInsertDirection(target) {
+ //@ts-ignore
if (index(dragEl) < index(target)) {
return 1;
} else {
@@ -2021,6 +2074,7 @@ function _cancelNextTick(id) {
// Fixed #973:
if (documentExists) {
on(document, "touchmove", function (evt) {
+ //@ts-ignore
if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {
evt.preventDefault();
}
diff --git a/packages/sortable/tsconfig.json b/packages/sortable/tsconfig.json
new file mode 100644
index 000000000..5b94e731b
--- /dev/null
+++ b/packages/sortable/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "resolveJsonModule": true
+ },
+ "include": ["src"]
+}
diff --git a/packages/sortablejs/.gitignore b/packages/sortablejs/.gitignore
new file mode 100644
index 000000000..0754915fd
--- /dev/null
+++ b/packages/sortablejs/.gitignore
@@ -0,0 +1,2 @@
+dist/
+modular/
diff --git a/packages/sortablejs/CONTRIBUTE.md b/packages/sortablejs/CONTRIBUTE.md
new file mode 100644
index 000000000..eb88cd514
--- /dev/null
+++ b/packages/sortablejs/CONTRIBUTE.md
@@ -0,0 +1,61 @@
+# Contribute to SortableJS
+
+## Entry points
+
+All files in `src` are points of entry.
+
+A plugin is either exported or mounted.
+
+The plugins are mounted as follows:
+
+### Core
+
+
+
+
+ Mounted or Exported
+
+
+ plugin
+ core
+ default
+ complete
+
+
+
+
+ AutoScroll
+ Exported
+ Mounted
+ Mounted
+
+
+ RevertOnSpill
+ Exported
+ Mounted
+ Mounted
+
+
+ RemoveonSpill
+ Exported
+ Mounted
+ Mounted
+
+
+ MultiDrag
+ Exported
+ Exported
+ Mounted
+
+
+ Swap
+ Exported
+ Exported
+ Mounted
+
+
+
+
+This may be deprecated in the future, in favour of setting an option in the constructor.
+It looks like this was done so bundle sizes could be controlled.
+We now have treeshaking when bundling apps with NodeJS, so I feel we should have all plugins mounted via cdn and then no plugins mounted on nodejs imports.
diff --git a/packages/sortablejs/package.json b/packages/sortablejs/package.json
new file mode 100644
index 000000000..fb4aaea82
--- /dev/null
+++ b/packages/sortablejs/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "sortablejs",
+ "version": "1.11.1",
+ "description": "JavaScript library for reorderable drag-and-drop lists on modern browsers and touch devices",
+ "main": "dist/sortable.js",
+ "browser": "dist/sortable.umd.js",
+ "module": "dist/sortable.module.js",
+ "scripts": {
+ "build": "npm-run-all --parallel build:*",
+ "build:umd": "microbundle -f umd -i src/complete-umd.ts -o dist/sortable.umd.js --name Sortable",
+ "build:modular-core": "microbundle -f esm -i src/core-named.ts -o modular/sortable.core.esm.js",
+ "build:modular-default": "microbundle -f esm -i src/default-named.ts -o modular/sortable.esm.js",
+ "build:modular-complete": "microbundle -f esm -i src/complete-named.ts -o modular/sortable.complete.esm.js"
+ },
+ "files": [
+ "dist"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/SortableJS/Sortable.git"
+ },
+ "maintainers": [
+ "Konstantin Lebedev ",
+ "Owen Mills ",
+ "Wayne Van Son "
+ ],
+ "keywords": [
+ "sortable",
+ "reorder",
+ "drag",
+ "meteor",
+ "angular",
+ "ng-sortable",
+ "react",
+ "vue",
+ "mixin"
+ ],
+ "license": "MIT",
+ "devDependencies": {
+ "colorette": "^1.2.1",
+ "microbundle": "^0.12.3",
+ "npm-run-all": "^4.1.5",
+ "typescript": "^3.9.7"
+ }
+}
diff --git a/packages/sortablejs/src/complete-named.ts b/packages/sortablejs/src/complete-named.ts
new file mode 100644
index 000000000..39ea8e4de
--- /dev/null
+++ b/packages/sortablejs/src/complete-named.ts
@@ -0,0 +1,16 @@
+import Sortable from "../../sortable/src/Sortable";
+import Swap from "../../plugins/swap/src";
+import MultiDrag from "../../plugins/multi-drag/src";
+import { RemoveOnSpill, RevertOnSpill } from "../../plugins/on-spill/src";
+import AutoScroll from "../../plugins/auto-scroll/src";
+
+//@ts-ignore
+Sortable.mount(new AutoScroll());
+Sortable.mount(RemoveOnSpill, RevertOnSpill);
+//@ts-ignore
+Sortable.mount(new Swap());
+//@ts-ignore
+Sortable.mount(new MultiDrag());
+
+export default Sortable;
+export { Sortable };
diff --git a/packages/sortablejs/src/complete-umd.ts b/packages/sortablejs/src/complete-umd.ts
new file mode 100644
index 000000000..abebfff36
--- /dev/null
+++ b/packages/sortablejs/src/complete-umd.ts
@@ -0,0 +1,15 @@
+import Sortable from "../../sortable/src/Sortable";
+import Swap from "../../plugins/swap/src";
+import MultiDrag from "../../plugins/multi-drag/src";
+import { RemoveOnSpill, RevertOnSpill } from "../../plugins/on-spill/src";
+import AutoScroll from "../../plugins/auto-scroll/src";
+
+//@ts-ignore
+Sortable.mount(new AutoScroll());
+Sortable.mount(RemoveOnSpill, RevertOnSpill);
+//@ts-ignore
+Sortable.mount(new Swap());
+//@ts-ignore
+Sortable.mount(new MultiDrag());
+
+export default Sortable;
diff --git a/packages/sortablejs/src/core-named.ts b/packages/sortablejs/src/core-named.ts
new file mode 100644
index 000000000..fc9afa4e3
--- /dev/null
+++ b/packages/sortablejs/src/core-named.ts
@@ -0,0 +1,9 @@
+import Sortable from "../../sortable/src/Sortable";
+import Swap from "../../plugins/swap/src";
+import MultiDrag from "../../plugins/multi-drag/src";
+import OnSpill from "../../plugins/on-spill/src";
+import AutoScroll from "../../plugins/auto-scroll/src";
+
+export default Sortable;
+//@ts-ignore
+export { Sortable, AutoScroll, OnSpill, Swap, MultiDrag };
diff --git a/packages/sortablejs/src/core-umd.ts b/packages/sortablejs/src/core-umd.ts
new file mode 100644
index 000000000..4931750a1
--- /dev/null
+++ b/packages/sortablejs/src/core-umd.ts
@@ -0,0 +1,3 @@
+import Sortable from "../../sortable/src/Sortable";
+
+export default Sortable;
diff --git a/packages/sortablejs/src/default-named.ts b/packages/sortablejs/src/default-named.ts
new file mode 100644
index 000000000..307f3656b
--- /dev/null
+++ b/packages/sortablejs/src/default-named.ts
@@ -0,0 +1,13 @@
+import Sortable from "../../sortable/src/Sortable";
+import Swap from "../../plugins/swap/src";
+import MultiDrag from "../../plugins/multi-drag/src";
+import AutoScroll from "../../plugins/auto-scroll/src";
+
+import { RemoveOnSpill, RevertOnSpill } from "../../plugins/on-spill/src";
+
+//@ts-ignore
+Sortable.mount(new AutoScroll());
+Sortable.mount(RemoveOnSpill, RevertOnSpill);
+
+export default Sortable;
+export { Sortable, Swap, MultiDrag };
diff --git a/packages/sortablejs/src/default-umd.ts b/packages/sortablejs/src/default-umd.ts
new file mode 100644
index 000000000..fc5d90b4d
--- /dev/null
+++ b/packages/sortablejs/src/default-umd.ts
@@ -0,0 +1,9 @@
+import Sortable from "../../sortable/src/Sortable";
+import AutoScroll from "../../plugins/auto-scroll/src";
+import { RemoveOnSpill, RevertOnSpill } from "../../plugins/on-spill/src";
+
+//@ts-ignore
+Sortable.mount(new AutoScroll());
+Sortable.mount(RemoveOnSpill, RevertOnSpill);
+
+export default Sortable;
diff --git a/packages/sortablejs/tsconfig.json b/packages/sortablejs/tsconfig.json
new file mode 100644
index 000000000..1b59db93a
--- /dev/null
+++ b/packages/sortablejs/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "strict": false,
+ "target": "esnext",
+ "module": "esnext",
+ "moduleResolution": "node",
+ "declaration": false
+ },
+ "include": ["src", "../sortable", "../plugins", "../utils"]
+}
diff --git a/packages/sortablejs/yarn.lock b/packages/sortablejs/yarn.lock
new file mode 100644
index 000000000..4f2846beb
--- /dev/null
+++ b/packages/sortablejs/yarn.lock
@@ -0,0 +1,3429 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.5.5":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
+ integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
+ dependencies:
+ "@babel/highlight" "^7.10.4"
+
+"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0":
+ version "7.11.0"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c"
+ integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==
+ dependencies:
+ browserslist "^4.12.0"
+ invariant "^2.2.4"
+ semver "^5.5.0"
+
+"@babel/core@^7.10.2":
+ version "7.11.6"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651"
+ integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==
+ dependencies:
+ "@babel/code-frame" "^7.10.4"
+ "@babel/generator" "^7.11.6"
+ "@babel/helper-module-transforms" "^7.11.0"
+ "@babel/helpers" "^7.10.4"
+ "@babel/parser" "^7.11.5"
+ "@babel/template" "^7.10.4"
+ "@babel/traverse" "^7.11.5"
+ "@babel/types" "^7.11.5"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.1"
+ json5 "^2.1.2"
+ lodash "^4.17.19"
+ resolve "^1.3.2"
+ semver "^5.4.1"
+ source-map "^0.5.0"
+
+"@babel/generator@^7.11.5", "@babel/generator@^7.11.6":
+ version "7.11.6"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620"
+ integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==
+ dependencies:
+ "@babel/types" "^7.11.5"
+ jsesc "^2.5.1"
+ source-map "^0.5.0"
+
+"@babel/helper-annotate-as-pure@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3"
+ integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==
+ dependencies:
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3"
+ integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==
+ dependencies:
+ "@babel/helper-explode-assignable-expression" "^7.10.4"
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-builder-react-jsx-experimental@^7.10.4":
+ version "7.11.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz#4ea43dd63857b0a35cd1f1b161dc29b43414e79f"
+ integrity sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.10.4"
+ "@babel/helper-module-imports" "^7.10.4"
+ "@babel/types" "^7.11.5"
+
+"@babel/helper-builder-react-jsx@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d"
+ integrity sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.10.4"
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-compilation-targets@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2"
+ integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==
+ dependencies:
+ "@babel/compat-data" "^7.10.4"
+ browserslist "^4.12.0"
+ invariant "^2.2.4"
+ levenary "^1.1.1"
+ semver "^5.5.0"
+
+"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.7.4":
+ version "7.10.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d"
+ integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==
+ dependencies:
+ "@babel/helper-function-name" "^7.10.4"
+ "@babel/helper-member-expression-to-functions" "^7.10.5"
+ "@babel/helper-optimise-call-expression" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-replace-supers" "^7.10.4"
+ "@babel/helper-split-export-declaration" "^7.10.4"
+
+"@babel/helper-create-regexp-features-plugin@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8"
+ integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.10.4"
+ "@babel/helper-regex" "^7.10.4"
+ regexpu-core "^4.7.0"
+
+"@babel/helper-define-map@^7.10.4":
+ version "7.10.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30"
+ integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==
+ dependencies:
+ "@babel/helper-function-name" "^7.10.4"
+ "@babel/types" "^7.10.5"
+ lodash "^4.17.19"
+
+"@babel/helper-explode-assignable-expression@^7.10.4":
+ version "7.11.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz#2d8e3470252cc17aba917ede7803d4a7a276a41b"
+ integrity sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==
+ dependencies:
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-function-name@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a"
+ integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.10.4"
+ "@babel/template" "^7.10.4"
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-get-function-arity@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2"
+ integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==
+ dependencies:
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-hoist-variables@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e"
+ integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==
+ dependencies:
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5":
+ version "7.11.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df"
+ integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==
+ dependencies:
+ "@babel/types" "^7.11.0"
+
+"@babel/helper-module-imports@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620"
+ integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==
+ dependencies:
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0":
+ version "7.11.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359"
+ integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==
+ dependencies:
+ "@babel/helper-module-imports" "^7.10.4"
+ "@babel/helper-replace-supers" "^7.10.4"
+ "@babel/helper-simple-access" "^7.10.4"
+ "@babel/helper-split-export-declaration" "^7.11.0"
+ "@babel/template" "^7.10.4"
+ "@babel/types" "^7.11.0"
+ lodash "^4.17.19"
+
+"@babel/helper-optimise-call-expression@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673"
+ integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==
+ dependencies:
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375"
+ integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==
+
+"@babel/helper-regex@^7.10.4":
+ version "7.10.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0"
+ integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==
+ dependencies:
+ lodash "^4.17.19"
+
+"@babel/helper-remap-async-to-generator@^7.10.4":
+ version "7.11.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz#4474ea9f7438f18575e30b0cac784045b402a12d"
+ integrity sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.10.4"
+ "@babel/helper-wrap-function" "^7.10.4"
+ "@babel/template" "^7.10.4"
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-replace-supers@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf"
+ integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.10.4"
+ "@babel/helper-optimise-call-expression" "^7.10.4"
+ "@babel/traverse" "^7.10.4"
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-simple-access@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461"
+ integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==
+ dependencies:
+ "@babel/template" "^7.10.4"
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.11.0":
+ version "7.11.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729"
+ integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==
+ dependencies:
+ "@babel/types" "^7.11.0"
+
+"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0":
+ version "7.11.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f"
+ integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==
+ dependencies:
+ "@babel/types" "^7.11.0"
+
+"@babel/helper-validator-identifier@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
+ integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
+
+"@babel/helper-wrap-function@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87"
+ integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==
+ dependencies:
+ "@babel/helper-function-name" "^7.10.4"
+ "@babel/template" "^7.10.4"
+ "@babel/traverse" "^7.10.4"
+ "@babel/types" "^7.10.4"
+
+"@babel/helpers@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044"
+ integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==
+ dependencies:
+ "@babel/template" "^7.10.4"
+ "@babel/traverse" "^7.10.4"
+ "@babel/types" "^7.10.4"
+
+"@babel/highlight@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143"
+ integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.10.4"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.10.4", "@babel/parser@^7.11.5", "@babel/parser@^7.3.3":
+ version "7.11.5"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037"
+ integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==
+
+"@babel/plugin-proposal-async-generator-functions@^7.10.4":
+ version "7.10.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558"
+ integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-remap-async-to-generator" "^7.10.4"
+ "@babel/plugin-syntax-async-generators" "^7.8.0"
+
+"@babel/plugin-proposal-class-properties@7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz#2f964f0cb18b948450362742e33e15211e77c2ba"
+ integrity sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.7.4"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-proposal-class-properties@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807"
+ integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-proposal-dynamic-import@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e"
+ integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.0"
+
+"@babel/plugin-proposal-export-namespace-from@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54"
+ integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-proposal-json-strings@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db"
+ integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-json-strings" "^7.8.0"
+
+"@babel/plugin-proposal-logical-assignment-operators@^7.11.0":
+ version "7.11.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8"
+ integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a"
+ integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
+
+"@babel/plugin-proposal-numeric-separator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06"
+ integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-proposal-object-rest-spread@^7.11.0":
+ version "7.11.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af"
+ integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
+ "@babel/plugin-transform-parameters" "^7.10.4"
+
+"@babel/plugin-proposal-optional-catch-binding@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd"
+ integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
+
+"@babel/plugin-proposal-optional-chaining@^7.11.0":
+ version "7.11.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076"
+ integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.0"
+
+"@babel/plugin-proposal-private-methods@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909"
+ integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d"
+ integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-async-generators@^7.8.0":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c"
+ integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-dynamic-import@^7.8.0":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
+ integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-export-namespace-from@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
+ integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-flow@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz#53351dd7ae01995e567d04ce42af1a6e0ba846a6"
+ integrity sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-import-meta@^7.10.1":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+ integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.0":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-jsx@^7.10.1", "@babel/plugin-syntax-jsx@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz#39abaae3cbf710c4373d8429484e6ba21340166c"
+ integrity sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.0":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.0":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.0":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-top-level-await@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d"
+ integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-arrow-functions@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd"
+ integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-async-to-generator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37"
+ integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-remap-async-to-generator" "^7.10.4"
+
+"@babel/plugin-transform-block-scoped-functions@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8"
+ integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-block-scoping@^7.10.4":
+ version "7.11.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215"
+ integrity sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-classes@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7"
+ integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.10.4"
+ "@babel/helper-define-map" "^7.10.4"
+ "@babel/helper-function-name" "^7.10.4"
+ "@babel/helper-optimise-call-expression" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-replace-supers" "^7.10.4"
+ "@babel/helper-split-export-declaration" "^7.10.4"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb"
+ integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-destructuring@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5"
+ integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee"
+ integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-duplicate-keys@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47"
+ integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-exponentiation-operator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e"
+ integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-flow-strip-types@^7.10.1", "@babel/plugin-transform-flow-strip-types@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.4.tgz#c497957f09e86e3df7296271e9eb642876bf7788"
+ integrity sha512-XTadyuqNst88UWBTdLjM+wEY7BFnY2sYtPyAidfC7M/QaZnSuIZpMvLxqGT7phAcnGyWh/XQFLKcGf04CnvxSQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-flow" "^7.10.4"
+
+"@babel/plugin-transform-for-of@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9"
+ integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-function-name@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7"
+ integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==
+ dependencies:
+ "@babel/helper-function-name" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-literals@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c"
+ integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-member-expression-literals@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7"
+ integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-modules-amd@^7.10.4":
+ version "7.10.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1"
+ integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.10.5"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-commonjs@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0"
+ integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-simple-access" "^7.10.4"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-systemjs@^7.10.4":
+ version "7.10.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85"
+ integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.10.4"
+ "@babel/helper-module-transforms" "^7.10.5"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-umd@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e"
+ integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6"
+ integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.10.4"
+
+"@babel/plugin-transform-new-target@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888"
+ integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-object-super@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894"
+ integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-replace-supers" "^7.10.4"
+
+"@babel/plugin-transform-parameters@^7.10.4":
+ version "7.10.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a"
+ integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-property-literals@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0"
+ integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-react-jsx@^7.10.1":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz#673c9f913948764a4421683b2bef2936968fddf2"
+ integrity sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==
+ dependencies:
+ "@babel/helper-builder-react-jsx" "^7.10.4"
+ "@babel/helper-builder-react-jsx-experimental" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-jsx" "^7.10.4"
+
+"@babel/plugin-transform-regenerator@^7.10.1", "@babel/plugin-transform-regenerator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63"
+ integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==
+ dependencies:
+ regenerator-transform "^0.14.2"
+
+"@babel/plugin-transform-reserved-words@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd"
+ integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-shorthand-properties@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6"
+ integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-spread@^7.11.0":
+ version "7.11.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc"
+ integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0"
+
+"@babel/plugin-transform-sticky-regex@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d"
+ integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/helper-regex" "^7.10.4"
+
+"@babel/plugin-transform-template-literals@^7.10.4":
+ version "7.10.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c"
+ integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-typeof-symbol@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc"
+ integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-unicode-escapes@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007"
+ integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-unicode-regex@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8"
+ integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/preset-env@^7.10.2":
+ version "7.11.5"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.5.tgz#18cb4b9379e3e92ffea92c07471a99a2914e4272"
+ integrity sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==
+ dependencies:
+ "@babel/compat-data" "^7.11.0"
+ "@babel/helper-compilation-targets" "^7.10.4"
+ "@babel/helper-module-imports" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-proposal-async-generator-functions" "^7.10.4"
+ "@babel/plugin-proposal-class-properties" "^7.10.4"
+ "@babel/plugin-proposal-dynamic-import" "^7.10.4"
+ "@babel/plugin-proposal-export-namespace-from" "^7.10.4"
+ "@babel/plugin-proposal-json-strings" "^7.10.4"
+ "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4"
+ "@babel/plugin-proposal-numeric-separator" "^7.10.4"
+ "@babel/plugin-proposal-object-rest-spread" "^7.11.0"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.10.4"
+ "@babel/plugin-proposal-optional-chaining" "^7.11.0"
+ "@babel/plugin-proposal-private-methods" "^7.10.4"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.10.4"
+ "@babel/plugin-syntax-async-generators" "^7.8.0"
+ "@babel/plugin-syntax-class-properties" "^7.10.4"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.0"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/plugin-syntax-json-strings" "^7.8.0"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.0"
+ "@babel/plugin-syntax-top-level-await" "^7.10.4"
+ "@babel/plugin-transform-arrow-functions" "^7.10.4"
+ "@babel/plugin-transform-async-to-generator" "^7.10.4"
+ "@babel/plugin-transform-block-scoped-functions" "^7.10.4"
+ "@babel/plugin-transform-block-scoping" "^7.10.4"
+ "@babel/plugin-transform-classes" "^7.10.4"
+ "@babel/plugin-transform-computed-properties" "^7.10.4"
+ "@babel/plugin-transform-destructuring" "^7.10.4"
+ "@babel/plugin-transform-dotall-regex" "^7.10.4"
+ "@babel/plugin-transform-duplicate-keys" "^7.10.4"
+ "@babel/plugin-transform-exponentiation-operator" "^7.10.4"
+ "@babel/plugin-transform-for-of" "^7.10.4"
+ "@babel/plugin-transform-function-name" "^7.10.4"
+ "@babel/plugin-transform-literals" "^7.10.4"
+ "@babel/plugin-transform-member-expression-literals" "^7.10.4"
+ "@babel/plugin-transform-modules-amd" "^7.10.4"
+ "@babel/plugin-transform-modules-commonjs" "^7.10.4"
+ "@babel/plugin-transform-modules-systemjs" "^7.10.4"
+ "@babel/plugin-transform-modules-umd" "^7.10.4"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4"
+ "@babel/plugin-transform-new-target" "^7.10.4"
+ "@babel/plugin-transform-object-super" "^7.10.4"
+ "@babel/plugin-transform-parameters" "^7.10.4"
+ "@babel/plugin-transform-property-literals" "^7.10.4"
+ "@babel/plugin-transform-regenerator" "^7.10.4"
+ "@babel/plugin-transform-reserved-words" "^7.10.4"
+ "@babel/plugin-transform-shorthand-properties" "^7.10.4"
+ "@babel/plugin-transform-spread" "^7.11.0"
+ "@babel/plugin-transform-sticky-regex" "^7.10.4"
+ "@babel/plugin-transform-template-literals" "^7.10.4"
+ "@babel/plugin-transform-typeof-symbol" "^7.10.4"
+ "@babel/plugin-transform-unicode-escapes" "^7.10.4"
+ "@babel/plugin-transform-unicode-regex" "^7.10.4"
+ "@babel/preset-modules" "^0.1.3"
+ "@babel/types" "^7.11.5"
+ browserslist "^4.12.0"
+ core-js-compat "^3.6.2"
+ invariant "^2.2.2"
+ levenary "^1.1.1"
+ semver "^5.5.0"
+
+"@babel/preset-flow@^7.10.1":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.10.4.tgz#e0d9c72f8cb02d1633f6a5b7b16763aa2edf659f"
+ integrity sha512-XI6l1CptQCOBv+ZKYwynyswhtOKwpZZp5n0LG1QKCo8erRhqjoQV6nvx61Eg30JHpysWQSBwA2AWRU3pBbSY5g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-transform-flow-strip-types" "^7.10.4"
+
+"@babel/preset-modules@^0.1.3":
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e"
+ integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
+ "@babel/plugin-transform-dotall-regex" "^7.4.4"
+ "@babel/types" "^7.4.4"
+ esutils "^2.0.2"
+
+"@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4":
+ version "7.11.2"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
+ integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
+ integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==
+ dependencies:
+ "@babel/code-frame" "^7.10.4"
+ "@babel/parser" "^7.10.4"
+ "@babel/types" "^7.10.4"
+
+"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5":
+ version "7.11.5"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3"
+ integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==
+ dependencies:
+ "@babel/code-frame" "^7.10.4"
+ "@babel/generator" "^7.11.5"
+ "@babel/helper-function-name" "^7.10.4"
+ "@babel/helper-split-export-declaration" "^7.11.0"
+ "@babel/parser" "^7.11.5"
+ "@babel/types" "^7.11.5"
+ debug "^4.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.19"
+
+"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.4.4":
+ version "7.11.5"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d"
+ integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.10.4"
+ lodash "^4.17.19"
+ to-fast-properties "^2.0.0"
+
+"@rollup/plugin-alias@^3.1.1":
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-alias/-/plugin-alias-3.1.1.tgz#bb96cf37fefeb0a953a6566c284855c7d1cd290c"
+ integrity sha512-hNcQY4bpBUIvxekd26DBPgF7BT4mKVNDF5tBG4Zi+3IgwLxGYRY0itHs9D0oLVwXM5pvJDWJlBQro+au8WaUWw==
+ dependencies:
+ slash "^3.0.0"
+
+"@rollup/plugin-babel@^5.0.3":
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.2.1.tgz#20fc8f8864dc0eaa1c5578408459606808f72924"
+ integrity sha512-Jd7oqFR2dzZJ3NWANDyBjwTtX/lYbZpVcmkHrfQcpvawHs9E4c0nYk5U2mfZ6I/DZcIvy506KZJi54XK/jxH7A==
+ dependencies:
+ "@babel/helper-module-imports" "^7.10.4"
+ "@rollup/pluginutils" "^3.1.0"
+
+"@rollup/plugin-commonjs@^13.0.0":
+ version "13.0.2"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-13.0.2.tgz#b7783f0db049450c72d60bc06cf48d4951515e58"
+ integrity sha512-9JXf2k8xqvMYfqmhgtB6eCgMN9fbxwF1XDF3mGKJc6pkAmt0jnsqurxQ0tC1akQKNSXCm7c3unQxa3zuxtZ7mQ==
+ dependencies:
+ "@rollup/pluginutils" "^3.0.8"
+ commondir "^1.0.1"
+ estree-walker "^1.0.1"
+ glob "^7.1.2"
+ is-reference "^1.1.2"
+ magic-string "^0.25.2"
+ resolve "^1.11.0"
+
+"@rollup/plugin-json@^4.1.0":
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3"
+ integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==
+ dependencies:
+ "@rollup/pluginutils" "^3.0.8"
+
+"@rollup/plugin-node-resolve@^6.1.0":
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-6.1.0.tgz#0d2909f4bf606ae34d43a9bc8be06a9b0c850cf0"
+ integrity sha512-Cv7PDIvxdE40SWilY5WgZpqfIUEaDxFxs89zCAHjqyRwlTSuql4M5hjIuc5QYJkOH0/vyiyNXKD72O+LhRipGA==
+ dependencies:
+ "@rollup/pluginutils" "^3.0.0"
+ "@types/resolve" "0.0.8"
+ builtin-modules "^3.1.0"
+ is-module "^1.0.0"
+ resolve "^1.11.1"
+
+"@rollup/pluginutils@^3.0.0", "@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b"
+ integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==
+ dependencies:
+ "@types/estree" "0.0.39"
+ estree-walker "^1.0.1"
+ picomatch "^2.2.2"
+
+"@types/color-name@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
+ integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
+
+"@types/estree@*":
+ version "0.0.45"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884"
+ integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==
+
+"@types/estree@0.0.39":
+ version "0.0.39"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
+ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
+
+"@types/node@*":
+ version "14.10.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.10.1.tgz#cc323bad8e8a533d4822f45ce4e5326f36e42177"
+ integrity sha512-aYNbO+FZ/3KGeQCEkNhHFRIzBOUgc7QvcVNKXbfnhDkSfwUv91JsQQa10rDgKSTSLkXZ1UIyPe4FJJNVgw1xWQ==
+
+"@types/parse-json@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+"@types/q@^1.5.1":
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24"
+ integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==
+
+"@types/resolve@0.0.8":
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194"
+ integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==
+ dependencies:
+ "@types/node" "*"
+
+acorn@^7.1.0:
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c"
+ integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==
+
+alphanum-sort@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+ integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
+ integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
+ dependencies:
+ "@types/color-name" "^1.1.1"
+ color-convert "^2.0.1"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+asyncro@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/asyncro/-/asyncro-3.0.0.tgz#3c7a732e263bc4a42499042f48d7d858e9c0134e"
+ integrity sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg==
+
+autoprefixer@^9.8.0:
+ version "9.8.6"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f"
+ integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==
+ dependencies:
+ browserslist "^4.12.0"
+ caniuse-lite "^1.0.30001109"
+ colorette "^1.2.1"
+ normalize-range "^0.1.2"
+ num2fraction "^1.2.2"
+ postcss "^7.0.32"
+ postcss-value-parser "^4.1.0"
+
+babel-plugin-dynamic-import-node@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
+ integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
+ dependencies:
+ object.assign "^4.1.0"
+
+babel-plugin-macros@^2.8.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138"
+ integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==
+ dependencies:
+ "@babel/runtime" "^7.7.2"
+ cosmiconfig "^6.0.0"
+ resolve "^1.12.0"
+
+babel-plugin-transform-async-to-promises@^0.8.15:
+ version "0.8.15"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-promises/-/babel-plugin-transform-async-to-promises-0.8.15.tgz#13b6d8ef13676b4e3c576d3600b85344bb1ba346"
+ integrity sha512-fDXP68ZqcinZO2WCiimCL9zhGjGXOnn3D33zvbh+yheZ/qOrNVVDDIBtAaM3Faz8TRvQzHiRKsu3hfrBAhEncQ==
+
+babel-plugin-transform-replace-expressions@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-replace-expressions/-/babel-plugin-transform-replace-expressions-0.2.0.tgz#59cba8df4b4a675e7c78cd21548f8e7685bbc30d"
+ integrity sha512-Eh1rRd9hWEYgkgoA3D0kGp7xJ/wgVshgsqmq60iC4HVWD+Lux+fNHSHBa2v1Hsv+dHflShC71qKhiH40OiPtDA==
+ dependencies:
+ "@babel/parser" "^7.3.3"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+ integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+
+big.js@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+boolbase@^1.0.0, boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+brotli-size@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/brotli-size/-/brotli-size-4.0.0.tgz#a05ee3faad3c0e700a2f2da826ba6b4d76e69e5e"
+ integrity sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==
+ dependencies:
+ duplexer "0.1.1"
+
+browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.8.5:
+ version "4.14.2"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz#1b3cec458a1ba87588cc5e9be62f19b6d48813ce"
+ integrity sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==
+ dependencies:
+ caniuse-lite "^1.0.30001125"
+ electron-to-chromium "^1.3.564"
+ escalade "^3.0.2"
+ node-releases "^1.1.61"
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+builtin-modules@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484"
+ integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==
+
+caller-callsite@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
+ integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
+ dependencies:
+ callsites "^2.0.0"
+
+caller-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
+ integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
+ dependencies:
+ caller-callsite "^2.0.0"
+
+callsites@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+ integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+caniuse-api@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
+ integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-lite "^1.0.0"
+ lodash.memoize "^4.1.2"
+ lodash.uniq "^4.5.0"
+
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125:
+ version "1.0.30001129"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001129.tgz#e6514b94c0ef50f98cf7476daa91228ddd2ef7bc"
+ integrity sha512-9945fTVKS810DZITpsAbuhQG7Lam0tEfVbZlsBaCFZaszepbryrArS05PWmJSBQ6mta+v9iz0pUIAbW1eBILIg==
+
+chalk@^1.0.0, chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
+ integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+coa@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
+ integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==
+ dependencies:
+ "@types/q" "^1.5.1"
+ chalk "^2.4.1"
+ q "^1.1.2"
+
+color-convert@^1.9.0, color-convert@^1.9.1:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@^1.0.0, color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-string@^1.5.2:
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc"
+ integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==
+ dependencies:
+ color-name "^1.0.0"
+ simple-swizzle "^0.2.2"
+
+color@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10"
+ integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==
+ dependencies:
+ color-convert "^1.9.1"
+ color-string "^1.5.2"
+
+colorette@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
+ integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==
+
+commander@^2.20.0:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+ integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-with-sourcemaps@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e"
+ integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==
+ dependencies:
+ source-map "^0.6.1"
+
+convert-source-map@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
+ integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+core-js-compat@^3.6.2:
+ version "3.6.5"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c"
+ integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==
+ dependencies:
+ browserslist "^4.8.5"
+ semver "7.0.0"
+
+cosmiconfig@^5.0.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
+ integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
+ dependencies:
+ import-fresh "^2.0.0"
+ is-directory "^0.3.1"
+ js-yaml "^3.13.1"
+ parse-json "^4.0.0"
+
+cosmiconfig@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982"
+ integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.1.0"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.7.2"
+
+cross-spawn@^6.0.5:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+css-color-names@0.0.4, css-color-names@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+ integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
+
+css-declaration-sorter@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22"
+ integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==
+ dependencies:
+ postcss "^7.0.1"
+ timsort "^0.3.0"
+
+css-modules-loader-core@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16"
+ integrity sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=
+ dependencies:
+ icss-replace-symbols "1.1.0"
+ postcss "6.0.1"
+ postcss-modules-extract-imports "1.1.0"
+ postcss-modules-local-by-default "1.2.0"
+ postcss-modules-scope "1.1.0"
+ postcss-modules-values "1.3.0"
+
+css-select-base-adapter@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7"
+ integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==
+
+css-select@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef"
+ integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^3.2.1"
+ domutils "^1.7.0"
+ nth-check "^1.0.2"
+
+css-selector-tokenizer@^0.7.0:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1"
+ integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==
+ dependencies:
+ cssesc "^3.0.0"
+ fastparse "^1.1.2"
+
+css-tree@1.0.0-alpha.37:
+ version "1.0.0-alpha.37"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22"
+ integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==
+ dependencies:
+ mdn-data "2.0.4"
+ source-map "^0.6.1"
+
+css-tree@1.0.0-alpha.39:
+ version "1.0.0-alpha.39"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb"
+ integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==
+ dependencies:
+ mdn-data "2.0.6"
+ source-map "^0.6.1"
+
+css-what@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39"
+ integrity sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+cssnano-preset-default@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76"
+ integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==
+ dependencies:
+ css-declaration-sorter "^4.0.1"
+ cssnano-util-raw-cache "^4.0.1"
+ postcss "^7.0.0"
+ postcss-calc "^7.0.1"
+ postcss-colormin "^4.0.3"
+ postcss-convert-values "^4.0.1"
+ postcss-discard-comments "^4.0.2"
+ postcss-discard-duplicates "^4.0.2"
+ postcss-discard-empty "^4.0.1"
+ postcss-discard-overridden "^4.0.1"
+ postcss-merge-longhand "^4.0.11"
+ postcss-merge-rules "^4.0.3"
+ postcss-minify-font-values "^4.0.2"
+ postcss-minify-gradients "^4.0.2"
+ postcss-minify-params "^4.0.2"
+ postcss-minify-selectors "^4.0.2"
+ postcss-normalize-charset "^4.0.1"
+ postcss-normalize-display-values "^4.0.2"
+ postcss-normalize-positions "^4.0.2"
+ postcss-normalize-repeat-style "^4.0.2"
+ postcss-normalize-string "^4.0.2"
+ postcss-normalize-timing-functions "^4.0.2"
+ postcss-normalize-unicode "^4.0.1"
+ postcss-normalize-url "^4.0.1"
+ postcss-normalize-whitespace "^4.0.2"
+ postcss-ordered-values "^4.1.2"
+ postcss-reduce-initial "^4.0.3"
+ postcss-reduce-transforms "^4.0.2"
+ postcss-svgo "^4.0.2"
+ postcss-unique-selectors "^4.0.1"
+
+cssnano-util-get-arguments@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f"
+ integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=
+
+cssnano-util-get-match@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d"
+ integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=
+
+cssnano-util-raw-cache@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282"
+ integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==
+ dependencies:
+ postcss "^7.0.0"
+
+cssnano-util-same-parent@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3"
+ integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==
+
+cssnano@^4.1.10:
+ version "4.1.10"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2"
+ integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==
+ dependencies:
+ cosmiconfig "^5.0.0"
+ cssnano-preset-default "^4.0.7"
+ is-resolvable "^1.0.0"
+ postcss "^7.0.0"
+
+csso@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903"
+ integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==
+ dependencies:
+ css-tree "1.0.0-alpha.39"
+
+debug@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+ integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+ dependencies:
+ ms "^2.1.1"
+
+define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+dom-serializer@0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+ integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+ dependencies:
+ domelementtype "^2.0.1"
+ entities "^2.0.0"
+
+domelementtype@1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domelementtype@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971"
+ integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==
+
+domutils@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+ integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+dot-prop@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
+ integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
+ dependencies:
+ is-obj "^2.0.0"
+
+duplexer@0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+ integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=
+
+duplexer@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
+ integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
+
+electron-to-chromium@^1.3.564:
+ version "1.3.567"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.567.tgz#7a404288952ac990e447a7a86470d460ea953b8f"
+ integrity sha512-1aKkw0Hha1Bw9JA5K5PT5eFXC/TXbkJvUfNSNEciPUMgSIsRJZM1hF2GUEAGZpAbgvd8En21EA+Lv820KOhvqA==
+
+emojis-list@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+ integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
+entities@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f"
+ integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5:
+ version "1.17.6"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a"
+ integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==
+ dependencies:
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+ is-callable "^1.2.0"
+ is-regex "^1.1.0"
+ object-inspect "^1.7.0"
+ object-keys "^1.1.1"
+ object.assign "^4.1.0"
+ string.prototype.trimend "^1.0.1"
+ string.prototype.trimstart "^1.0.1"
+
+es-abstract@^1.18.0-next.0:
+ version "1.18.0-next.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.0.tgz#b302834927e624d8e5837ed48224291f2c66e6fc"
+ integrity sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==
+ dependencies:
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+ is-callable "^1.2.0"
+ is-negative-zero "^2.0.0"
+ is-regex "^1.1.1"
+ object-inspect "^1.8.0"
+ object-keys "^1.1.1"
+ object.assign "^4.1.0"
+ string.prototype.trimend "^1.0.1"
+ string.prototype.trimstart "^1.0.1"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es6-promisify@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.1.1.tgz#46837651b7b06bf6fff893d03f29393668d01621"
+ integrity sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==
+
+escalade@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4"
+ integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+estree-walker@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362"
+ integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==
+
+estree-walker@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700"
+ integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+eventemitter3@^4.0.4:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
+ integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+
+fastparse@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
+ integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
+
+figures@^1.0.1:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+ integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=
+ dependencies:
+ escape-string-regexp "^1.0.5"
+ object-assign "^4.1.0"
+
+filesize@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00"
+ integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==
+
+find-cache-dir@^3.0.0:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880"
+ integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^3.0.2"
+ pkg-dir "^4.1.0"
+
+find-up@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+fs-extra@8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+ integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+generic-names@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-2.0.1.tgz#f8a378ead2ccaa7a34f0317b05554832ae41b872"
+ integrity sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==
+ dependencies:
+ loader-utils "^1.1.0"
+
+gensync@^1.0.0-beta.1:
+ version "1.0.0-beta.1"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
+ integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
+
+glob@^7.1.2:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globalyzer@^0.1.0:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.4.tgz#bc8e273afe1ac7c24eea8def5b802340c5cc534f"
+ integrity sha512-LeguVWaxgHN0MNbWC6YljNMzHkrCny9fzjmEUdnF1kQ7wATFD1RHFRqA1qxaX2tgxGENlcxjOflopBwj3YZiXA==
+
+globrex@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098"
+ integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
+ integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+
+gzip-size@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520"
+ integrity sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=
+ dependencies:
+ duplexer "^0.1.1"
+
+gzip-size@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274"
+ integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==
+ dependencies:
+ duplexer "^0.1.1"
+ pify "^4.0.1"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+ integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbols@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
+ integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
+
+has@^1.0.0, has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hex-color-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
+ integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+
+hosted-git-info@^2.1.4:
+ version "2.8.8"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
+ integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
+
+hsl-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
+ integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
+
+hsla-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
+ integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
+
+html-comment-regex@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
+ integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==
+
+icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+ integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=
+
+import-cwd@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
+ integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=
+ dependencies:
+ import-from "^2.1.0"
+
+import-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92"
+ integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==
+ dependencies:
+ import-from "^3.0.0"
+
+import-fresh@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
+ integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
+ dependencies:
+ caller-path "^2.0.0"
+ resolve-from "^3.0.0"
+
+import-fresh@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
+ integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-from@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
+ integrity sha1-M1238qev/VOqpHHUuAId7ja387E=
+ dependencies:
+ resolve-from "^3.0.0"
+
+import-from@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966"
+ integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==
+ dependencies:
+ resolve-from "^5.0.0"
+
+indexes-of@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+ integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+invariant@^2.2.2, invariant@^2.2.4:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+is-absolute-url@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+ integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-arrayish@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+ integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
+is-callable@^1.1.4, is-callable@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.1.tgz#4d1e21a4f437509d25ce55f8184350771421c96d"
+ integrity sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==
+
+is-color-stop@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
+ integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=
+ dependencies:
+ css-color-names "^0.0.4"
+ hex-color-regex "^1.1.0"
+ hsl-regex "^1.0.0"
+ hsla-regex "^1.0.0"
+ rgb-regex "^1.0.1"
+ rgba-regex "^1.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
+ integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
+
+is-directory@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+ integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
+
+is-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
+ integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=
+
+is-negative-zero@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461"
+ integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=
+
+is-obj@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
+ integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
+
+is-reference@^1.1.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7"
+ integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==
+ dependencies:
+ "@types/estree" "*"
+
+is-regex@^1.1.0, is-regex@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9"
+ integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==
+ dependencies:
+ has-symbols "^1.0.1"
+
+is-resolvable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+ integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+
+is-svg@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75"
+ integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==
+ dependencies:
+ html-comment-regex "^1.1.0"
+
+is-symbol@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
+ integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
+ dependencies:
+ has-symbols "^1.0.1"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+jest-worker@^24.9.0:
+ version "24.9.0"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5"
+ integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==
+ dependencies:
+ merge-stream "^2.0.0"
+ supports-color "^6.1.0"
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.13.1:
+ version "3.14.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
+ integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+json-parse-better-errors@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+ integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+ dependencies:
+ minimist "^1.2.0"
+
+json5@^2.1.2:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
+ integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
+ dependencies:
+ minimist "^1.2.5"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+
+leven@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+ integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
+levenary@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77"
+ integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==
+ dependencies:
+ leven "^3.1.0"
+
+lines-and-columns@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
+ integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+
+load-json-file@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
+ integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^4.0.0"
+ pify "^3.0.0"
+ strip-bom "^3.0.0"
+
+loader-utils@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
+ integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^1.0.1"
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+lodash.camelcase@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+ integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
+
+lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+ integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash.uniq@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+ integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
+
+lodash@^4.17.19:
+ version "4.17.20"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
+ integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+magic-string@^0.22.4:
+ version "0.22.5"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e"
+ integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==
+ dependencies:
+ vlq "^0.2.2"
+
+magic-string@^0.25.2:
+ version "0.25.7"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
+ integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==
+ dependencies:
+ sourcemap-codec "^1.4.4"
+
+make-dir@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
+maxmin@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/maxmin/-/maxmin-2.1.0.tgz#4d3b220903d95eee7eb7ac7fa864e72dc09a3166"
+ integrity sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=
+ dependencies:
+ chalk "^1.0.0"
+ figures "^1.0.1"
+ gzip-size "^3.0.0"
+ pretty-bytes "^3.0.0"
+
+mdn-data@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
+ integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
+
+mdn-data@2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978"
+ integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==
+
+memorystream@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
+ integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI=
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+microbundle@^0.12.3:
+ version "0.12.3"
+ resolved "https://registry.yarnpkg.com/microbundle/-/microbundle-0.12.3.tgz#6f43f1a7d0ad6258f4406e390340db4ad0312e1f"
+ integrity sha512-OcpBYPytJXOJsTfPjhL5p3nR0JXt0O9dH97K2k6gJ9etokmuRE4qoAfdnYfsUYLRHftCMJu/BkbQySAPnQ87PQ==
+ dependencies:
+ "@babel/core" "^7.10.2"
+ "@babel/plugin-proposal-class-properties" "7.7.4"
+ "@babel/plugin-syntax-import-meta" "^7.10.1"
+ "@babel/plugin-syntax-jsx" "^7.10.1"
+ "@babel/plugin-transform-flow-strip-types" "^7.10.1"
+ "@babel/plugin-transform-react-jsx" "^7.10.1"
+ "@babel/plugin-transform-regenerator" "^7.10.1"
+ "@babel/preset-env" "^7.10.2"
+ "@babel/preset-flow" "^7.10.1"
+ "@babel/preset-modules" "^0.1.3"
+ "@rollup/plugin-alias" "^3.1.1"
+ "@rollup/plugin-babel" "^5.0.3"
+ "@rollup/plugin-commonjs" "^13.0.0"
+ "@rollup/plugin-json" "^4.1.0"
+ "@rollup/plugin-node-resolve" "^6.1.0"
+ asyncro "^3.0.0"
+ autoprefixer "^9.8.0"
+ babel-plugin-macros "^2.8.0"
+ babel-plugin-transform-async-to-promises "^0.8.15"
+ babel-plugin-transform-replace-expressions "^0.2.0"
+ brotli-size "^4.0.0"
+ camelcase "^5.3.1"
+ cssnano "^4.1.10"
+ es6-promisify "^6.1.1"
+ escape-string-regexp "^4.0.0"
+ filesize "^6.1.0"
+ gzip-size "^5.1.1"
+ kleur "^3.0.3"
+ lodash.merge "^4.6.2"
+ module-details-from-path "^1.0.3"
+ pretty-bytes "^5.3.0"
+ rollup "^1.32.1"
+ rollup-plugin-bundle-size "^1.0.1"
+ rollup-plugin-es3 "^1.1.0"
+ rollup-plugin-postcss "^2.9.0"
+ rollup-plugin-terser "^5.3.0"
+ rollup-plugin-typescript2 "^0.25.3"
+ sade "^1.7.3"
+ tiny-glob "^0.2.6"
+ tslib "^1.13.0"
+ typescript "^3.9.5"
+
+minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+mkdirp@~0.5.1:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+module-details-from-path@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b"
+ integrity sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=
+
+mri@^1.1.0:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.6.tgz#49952e1044db21dbf90f6cd92bc9c9a777d415a6"
+ integrity sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==
+
+ms@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+node-releases@^1.1.61:
+ version "1.1.61"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e"
+ integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==
+
+normalize-package-data@^2.3.2:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-range@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+ integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
+
+normalize-url@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
+ integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
+
+npm-run-all@^4.1.5:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba"
+ integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ chalk "^2.4.1"
+ cross-spawn "^6.0.5"
+ memorystream "^0.3.1"
+ minimatch "^3.0.4"
+ pidtree "^0.3.0"
+ read-pkg "^3.0.0"
+ shell-quote "^1.6.1"
+ string.prototype.padend "^3.0.0"
+
+nth-check@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+ integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+ dependencies:
+ boolbase "~1.0.0"
+
+num2fraction@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+ integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-inspect@^1.7.0, object-inspect@^1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0"
+ integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==
+
+object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd"
+ integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.0"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+object.getownpropertydescriptors@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649"
+ integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+
+object.values@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e"
+ integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-queue@^6.3.0:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.1.tgz#578891ada028a61371ec2692b26614d1b7d2b10a"
+ integrity sha512-miQiSxLYPYBxGkrldecZC18OTLjdUqnlRebGzPRiVxB8mco7usCmm7hFuxiTvp93K18JnLtE4KMMycjAu/cQQg==
+ dependencies:
+ eventemitter3 "^4.0.4"
+ p-timeout "^3.1.0"
+
+p-timeout@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe"
+ integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==
+ dependencies:
+ p-finally "^1.0.0"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-json@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+ integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
+ dependencies:
+ error-ex "^1.3.1"
+ json-parse-better-errors "^1.0.1"
+
+parse-json@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646"
+ integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-parse@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
+ integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
+
+path-type@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+ integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
+ dependencies:
+ pify "^3.0.0"
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+picomatch@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
+ integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
+
+pidtree@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a"
+ integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+ integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
+
+pify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+ integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pify@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f"
+ integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==
+
+pkg-dir@^4.1.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+postcss-calc@^7.0.1:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.4.tgz#5e177ddb417341e6d4a193c5d9fd8ada79094f8b"
+ integrity sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==
+ dependencies:
+ postcss "^7.0.27"
+ postcss-selector-parser "^6.0.2"
+ postcss-value-parser "^4.0.2"
+
+postcss-colormin@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381"
+ integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==
+ dependencies:
+ browserslist "^4.0.0"
+ color "^3.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-convert-values@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f"
+ integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-discard-comments@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033"
+ integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-duplicates@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb"
+ integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-empty@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765"
+ integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-overridden@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57"
+ integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-load-config@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003"
+ integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==
+ dependencies:
+ cosmiconfig "^5.0.0"
+ import-cwd "^2.0.0"
+
+postcss-merge-longhand@^4.0.11:
+ version "4.0.11"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24"
+ integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==
+ dependencies:
+ css-color-names "0.0.4"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ stylehacks "^4.0.0"
+
+postcss-merge-rules@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650"
+ integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-api "^3.0.0"
+ cssnano-util-same-parent "^4.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+ vendors "^1.0.0"
+
+postcss-minify-font-values@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6"
+ integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-gradients@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471"
+ integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ is-color-stop "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-params@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874"
+ integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ browserslist "^4.0.0"
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ uniqs "^2.0.0"
+
+postcss-minify-selectors@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8"
+ integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+
+postcss-modules-extract-imports@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb"
+ integrity sha1-thTJcgvmgW6u41+zpfqh26agXds=
+ dependencies:
+ postcss "^6.0.1"
+
+postcss-modules-local-by-default@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
+ integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=
+ dependencies:
+ css-selector-tokenizer "^0.7.0"
+ postcss "^6.0.1"
+
+postcss-modules-scope@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
+ integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A=
+ dependencies:
+ css-selector-tokenizer "^0.7.0"
+ postcss "^6.0.1"
+
+postcss-modules-values@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
+ integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=
+ dependencies:
+ icss-replace-symbols "^1.1.0"
+ postcss "^6.0.1"
+
+postcss-modules@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-2.0.0.tgz#473d0d7326651d8408585c2a154115d5cb36cce0"
+ integrity sha512-eqp+Bva+U2cwQO7dECJ8/V+X+uH1HduNeITB0CPPFAu6d/8LKQ32/j+p9rQ2YL1QytVcrNU0X+fBqgGmQIA1Rw==
+ dependencies:
+ css-modules-loader-core "^1.1.0"
+ generic-names "^2.0.1"
+ lodash.camelcase "^4.3.0"
+ postcss "^7.0.1"
+ string-hash "^1.1.1"
+
+postcss-normalize-charset@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4"
+ integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-normalize-display-values@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a"
+ integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-positions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f"
+ integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-repeat-style@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c"
+ integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-string@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c"
+ integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==
+ dependencies:
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-timing-functions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9"
+ integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-unicode@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb"
+ integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==
+ dependencies:
+ browserslist "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-url@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1"
+ integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==
+ dependencies:
+ is-absolute-url "^2.0.0"
+ normalize-url "^3.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-whitespace@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82"
+ integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-ordered-values@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee"
+ integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-reduce-initial@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
+ integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-api "^3.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+
+postcss-reduce-transforms@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29"
+ integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-selector-parser@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270"
+ integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==
+ dependencies:
+ dot-prop "^5.2.0"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-selector-parser@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c"
+ integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==
+ dependencies:
+ cssesc "^3.0.0"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-svgo@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258"
+ integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==
+ dependencies:
+ is-svg "^3.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ svgo "^1.0.0"
+
+postcss-unique-selectors@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac"
+ integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ postcss "^7.0.0"
+ uniqs "^2.0.0"
+
+postcss-value-parser@^3.0.0:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
+ integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
+
+postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
+ integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
+
+postcss@6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2"
+ integrity sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=
+ dependencies:
+ chalk "^1.1.3"
+ source-map "^0.5.6"
+ supports-color "^3.2.3"
+
+postcss@^6.0.1:
+ version "6.0.23"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+ integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
+ dependencies:
+ chalk "^2.4.1"
+ source-map "^0.6.1"
+ supports-color "^5.4.0"
+
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.27, postcss@^7.0.32:
+ version "7.0.32"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d"
+ integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==
+ dependencies:
+ chalk "^2.4.2"
+ source-map "^0.6.1"
+ supports-color "^6.1.0"
+
+pretty-bytes@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-3.0.1.tgz#27d0008d778063a0b4811bb35c79f1bd5d5fbccf"
+ integrity sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+pretty-bytes@^5.3.0:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.4.1.tgz#cd89f79bbcef21e3d21eb0da68ffe93f803e884b"
+ integrity sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA==
+
+promise.series@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/promise.series/-/promise.series-0.2.0.tgz#2cc7ebe959fc3a6619c04ab4dbdc9e452d864bbd"
+ integrity sha1-LMfr6Vn8OmYZwEq029yeRS2GS70=
+
+q@^1.1.2:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+ integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
+
+randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+read-pkg@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
+ integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=
+ dependencies:
+ load-json-file "^4.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^3.0.0"
+
+regenerate-unicode-properties@^8.2.0:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
+ integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==
+ dependencies:
+ regenerate "^1.4.0"
+
+regenerate@^1.4.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f"
+ integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==
+
+regenerator-runtime@^0.13.4:
+ version "0.13.7"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
+ integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
+
+regenerator-transform@^0.14.2:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4"
+ integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==
+ dependencies:
+ "@babel/runtime" "^7.8.4"
+
+regexpu-core@^4.7.0:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938"
+ integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==
+ dependencies:
+ regenerate "^1.4.0"
+ regenerate-unicode-properties "^8.2.0"
+ regjsgen "^0.5.1"
+ regjsparser "^0.6.4"
+ unicode-match-property-ecmascript "^1.0.4"
+ unicode-match-property-value-ecmascript "^1.2.0"
+
+regjsgen@^0.5.1:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
+ integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
+
+regjsparser@^0.6.4:
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272"
+ integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==
+ dependencies:
+ jsesc "~0.5.0"
+
+resolve-from@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+ integrity sha1-six699nWiBvItuZTM17rywoYh0g=
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve@1.12.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6"
+ integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==
+ dependencies:
+ path-parse "^1.0.6"
+
+resolve@^1.10.0, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.16.0, resolve@^1.3.2:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
+rgb-regex@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
+ integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
+
+rgba-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
+ integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
+
+rollup-plugin-bundle-size@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-bundle-size/-/rollup-plugin-bundle-size-1.0.3.tgz#d245cd988486b4040279f9fd33f357f61673e90f"
+ integrity sha512-aWj0Pvzq90fqbI5vN1IvUrlf4utOqy+AERYxwWjegH1G8PzheMnrRIgQ5tkwKVtQMDP0bHZEACW/zLDF+XgfXQ==
+ dependencies:
+ chalk "^1.1.3"
+ maxmin "^2.1.0"
+
+rollup-plugin-es3@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-es3/-/rollup-plugin-es3-1.1.0.tgz#f866f91b4db839e5b475d8e4a7b9d4c77ecade14"
+ integrity sha512-jTMqQgMZ/tkjRW4scf4ln5c0OiTSi+Lx/IEyFd41ldgGoLvvg9AQxmVOl93+KaoyB7XRYToYjiHDvO40NPF/fA==
+ dependencies:
+ magic-string "^0.22.4"
+
+rollup-plugin-postcss@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-postcss/-/rollup-plugin-postcss-2.9.0.tgz#e6ea0a1b8fdc4a49fc0385da58804e332750c282"
+ integrity sha512-Y7qDwlqjZMBexbB1kRJf+jKIQL8HR6C+ay53YzN+nNJ64hn1PNZfBE3c61hFUhD//zrMwmm7uBW30RuTi+CD0w==
+ dependencies:
+ chalk "^4.0.0"
+ concat-with-sourcemaps "^1.1.0"
+ cssnano "^4.1.10"
+ import-cwd "^3.0.0"
+ p-queue "^6.3.0"
+ pify "^5.0.0"
+ postcss "^7.0.27"
+ postcss-load-config "^2.1.0"
+ postcss-modules "^2.0.0"
+ promise.series "^0.2.0"
+ resolve "^1.16.0"
+ rollup-pluginutils "^2.8.2"
+ safe-identifier "^0.4.1"
+ style-inject "^0.3.0"
+
+rollup-plugin-terser@^5.3.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz#8c650062c22a8426c64268548957463bf981b413"
+ integrity sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==
+ dependencies:
+ "@babel/code-frame" "^7.5.5"
+ jest-worker "^24.9.0"
+ rollup-pluginutils "^2.8.2"
+ serialize-javascript "^4.0.0"
+ terser "^4.6.2"
+
+rollup-plugin-typescript2@^0.25.3:
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.25.3.tgz#a5fb2f0f85488789334ce540abe6c7011cbdf40f"
+ integrity sha512-ADkSaidKBovJmf5VBnZBZe+WzaZwofuvYdzGAKTN/J4hN7QJCFYAq7IrH9caxlru6T5qhX41PNFS1S4HqhsGQg==
+ dependencies:
+ find-cache-dir "^3.0.0"
+ fs-extra "8.1.0"
+ resolve "1.12.0"
+ rollup-pluginutils "2.8.1"
+ tslib "1.10.0"
+
+rollup-pluginutils@2.8.1:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz#8fa6dd0697344938ef26c2c09d2488ce9e33ce97"
+ integrity sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==
+ dependencies:
+ estree-walker "^0.6.1"
+
+rollup-pluginutils@^2.8.2:
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e"
+ integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==
+ dependencies:
+ estree-walker "^0.6.1"
+
+rollup@^1.32.1:
+ version "1.32.1"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4"
+ integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==
+ dependencies:
+ "@types/estree" "*"
+ "@types/node" "*"
+ acorn "^7.1.0"
+
+sade@^1.7.3:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/sade/-/sade-1.7.3.tgz#a217ccc4fb4abb2d271648bf48f6628b2636fa1b"
+ integrity sha512-m4BctppMvJ60W1dXnHq7jMmFe3hPJZDAH85kQ3ACTo7XZNVUuTItCQ+2HfyaMeV5cKrbw7l4vD/6We3GBxvdJw==
+ dependencies:
+ mri "^1.1.0"
+
+safe-buffer@^5.1.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-identifier@^0.4.1:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/safe-identifier/-/safe-identifier-0.4.2.tgz#cf6bfca31c2897c588092d1750d30ef501d59fcb"
+ integrity sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==
+
+sax@~1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
+ integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+
+semver@^6.0.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+serialize-javascript@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
+ integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
+ dependencies:
+ randombytes "^2.1.0"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+shell-quote@^1.6.1:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2"
+ integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==
+
+simple-swizzle@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+ integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
+ dependencies:
+ is-arrayish "^0.3.1"
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+source-map-support@~0.5.12:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.5.0, source-map@^0.5.6:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+sourcemap-codec@^1.4.4:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
+ integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
+ integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+stable@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+ integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+string-hash@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b"
+ integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=
+
+string.prototype.padend@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz#dc08f57a8010dc5c153550318f67e13adbb72ac3"
+ integrity sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+
+string.prototype.trimend@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
+ integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.5"
+
+string.prototype.trimstart@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
+ integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.5"
+
+strip-ansi@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+ integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
+
+style-inject@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/style-inject/-/style-inject-0.3.0.tgz#d21c477affec91811cc82355832a700d22bf8dd3"
+ integrity sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==
+
+stylehacks@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
+ integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==
+ dependencies:
+ browserslist "^4.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+ integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
+ dependencies:
+ has-flag "^1.0.0"
+
+supports-color@^5.3.0, supports-color@^5.4.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+ integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+svgo@^1.0.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167"
+ integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==
+ dependencies:
+ chalk "^2.4.1"
+ coa "^2.0.2"
+ css-select "^2.0.0"
+ css-select-base-adapter "^0.1.1"
+ css-tree "1.0.0-alpha.37"
+ csso "^4.0.2"
+ js-yaml "^3.13.1"
+ mkdirp "~0.5.1"
+ object.values "^1.1.0"
+ sax "~1.2.4"
+ stable "^0.1.8"
+ unquote "~1.1.1"
+ util.promisify "~1.0.0"
+
+terser@^4.6.2:
+ version "4.8.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
+ integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
+ dependencies:
+ commander "^2.20.0"
+ source-map "~0.6.1"
+ source-map-support "~0.5.12"
+
+timsort@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
+ integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
+
+tiny-glob@^0.2.6:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.6.tgz#9e056e169d9788fe8a734dfa1ff02e9b92ed7eda"
+ integrity sha512-A7ewMqPu1B5PWwC3m7KVgAu96Ch5LA0w4SnEN/LbDREj/gAD0nPWboRbn8YoP9ISZXqeNAlMvKSKoEuhcfK3Pw==
+ dependencies:
+ globalyzer "^0.1.0"
+ globrex "^0.1.1"
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
+tslib@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
+ integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
+
+tslib@^1.13.0:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
+ integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
+
+typescript@^3.9.5, typescript@^3.9.7:
+ version "3.9.7"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa"
+ integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==
+
+unicode-canonical-property-names-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
+ integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==
+
+unicode-match-property-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
+ integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^1.0.4"
+ unicode-property-aliases-ecmascript "^1.0.4"
+
+unicode-match-property-value-ecmascript@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531"
+ integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==
+
+unicode-property-aliases-ecmascript@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4"
+ integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==
+
+uniq@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+ integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
+
+uniqs@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+ integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+unquote@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
+ integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=
+
+util.promisify@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee"
+ integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.2"
+ has-symbols "^1.0.1"
+ object.getownpropertydescriptors "^2.1.0"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+vendors@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
+ integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==
+
+vlq@^0.2.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"
+ integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==
+
+which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+yaml@^1.7.2:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
+ integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
diff --git a/packages/utils/package.json b/packages/utils/package.json
new file mode 100644
index 000000000..29ddeab34
--- /dev/null
+++ b/packages/utils/package.json
@@ -0,0 +1,4 @@
+{
+ "name": "@sortable/utils",
+ "private": true
+}
diff --git a/packages/utils/src/browser-info.ts b/packages/utils/src/browser-info.ts
new file mode 100644
index 000000000..a67715b24
--- /dev/null
+++ b/packages/utils/src/browser-info.ts
@@ -0,0 +1,15 @@
+function userAgent(pattern) {
+ if (typeof window !== "undefined" && window.navigator) {
+ return !!(/*@__PURE__*/ navigator.userAgent.match(pattern));
+ }
+}
+
+export const IE11OrLess = userAgent(
+ /(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i
+);
+export const Edge = userAgent(/Edge/i);
+export const FireFox = userAgent(/firefox/i);
+export const Safari =
+ userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);
+export const IOS = userAgent(/iP(ad|od|hone)/i);
+export const ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);
diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts
new file mode 100644
index 000000000..e95be7b14
--- /dev/null
+++ b/packages/utils/src/index.ts
@@ -0,0 +1,2 @@
+export * from "./browser-info";
+export * from "./utils";
diff --git a/packages/utils/src/utils.ts b/packages/utils/src/utils.ts
new file mode 100644
index 000000000..c77e636b5
--- /dev/null
+++ b/packages/utils/src/utils.ts
@@ -0,0 +1,579 @@
+import { IE11OrLess } from "./browser-info";
+import Sortable from "../../sortable/src/Sortable";
+
+const captureMode = {
+ capture: false,
+ passive: false,
+};
+
+function on(el, event, fn) {
+ el.addEventListener(event, fn, !IE11OrLess && captureMode);
+}
+
+function off(el, event, fn) {
+ el.removeEventListener(event, fn, !IE11OrLess && captureMode);
+}
+
+function matches(/**HTMLElement*/ el, /**String*/ selector) {
+ if (!selector) return;
+
+ selector[0] === ">" && (selector = selector.substring(1));
+
+ if (el) {
+ try {
+ if (el.matches) {
+ return el.matches(selector);
+ } else if (el.msMatchesSelector) {
+ return el.msMatchesSelector(selector);
+ } else if (el.webkitMatchesSelector) {
+ return el.webkitMatchesSelector(selector);
+ }
+ } catch (_) {
+ return false;
+ }
+ }
+
+ return false;
+}
+
+function getParentOrHost(el) {
+ return el.host && el !== document && el.host.nodeType
+ ? el.host
+ : el.parentNode;
+}
+
+function closest(
+ /**HTMLElement*/ el,
+ /**String*/ selector,
+ /**HTMLElement*/ ctx,
+ includeCTX
+) {
+ if (el) {
+ ctx = ctx || document;
+
+ do {
+ if (
+ (selector != null &&
+ (selector[0] === ">"
+ ? el.parentNode === ctx && matches(el, selector)
+ : matches(el, selector))) ||
+ (includeCTX && el === ctx)
+ ) {
+ return el;
+ }
+
+ if (el === ctx) break;
+ /* jshint boss:true */
+ } while ((el = getParentOrHost(el)));
+ }
+
+ return null;
+}
+
+const R_SPACE = /\s+/g;
+
+function toggleClass(el, name, state) {
+ if (el && name) {
+ if (el.classList) {
+ el.classList[state ? "add" : "remove"](name);
+ } else {
+ let className = (" " + el.className + " ")
+ .replace(R_SPACE, " ")
+ .replace(" " + name + " ", " ");
+ el.className = (className + (state ? " " + name : "")).replace(
+ R_SPACE,
+ " "
+ );
+ }
+ }
+}
+
+function css(el, prop, val) {
+ let style = el && el.style;
+
+ if (style) {
+ if (val === void 0) {
+ if (document.defaultView && document.defaultView.getComputedStyle) {
+ val = document.defaultView.getComputedStyle(el, "");
+ } else if (el.currentStyle) {
+ val = el.currentStyle;
+ }
+
+ return prop === void 0 ? val : val[prop];
+ } else {
+ if (!(prop in style) && prop.indexOf("webkit") === -1) {
+ prop = "-webkit-" + prop;
+ }
+
+ style[prop] = val + (typeof val === "string" ? "" : "px");
+ }
+ }
+}
+
+function matrix(el, selfOnly) {
+ let appliedTransforms = "";
+ if (typeof el === "string") {
+ appliedTransforms = el;
+ } else {
+ do {
+ //@ts-ignore
+ let transform = css(el, "transform");
+
+ if (transform && transform !== "none") {
+ appliedTransforms = transform + " " + appliedTransforms;
+ }
+ /* jshint boss:true */
+ } while (!selfOnly && (el = el.parentNode));
+ }
+
+ const matrixFn =
+ window.DOMMatrix ||
+ window.WebKitCSSMatrix ||
+ //@ts-ignore
+ window.CSSMatrix ||
+ //@ts-ignore
+ window.MSCSSMatrix;
+ /*jshint -W056 */
+ return matrixFn && new matrixFn(appliedTransforms);
+}
+
+function find(ctx, tagName, iterator) {
+ if (ctx) {
+ let list = ctx.getElementsByTagName(tagName),
+ i = 0,
+ n = list.length;
+
+ if (iterator) {
+ for (; i < n; i++) {
+ iterator(list[i], i);
+ }
+ }
+
+ return list;
+ }
+
+ return [];
+}
+
+function getWindowScrollingElement() {
+ let scrollingElement = document.scrollingElement;
+
+ if (scrollingElement) {
+ return scrollingElement;
+ } else {
+ return document.documentElement;
+ }
+}
+
+/**
+ * Returns the "bounding client rect" of given element
+ * @param {HTMLElement} el The element whose boundingClientRect is wanted
+ * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container
+ * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr
+ * @param {[Boolean]} undoScale Whether the container's scale() should be undone
+ * @param {[HTMLElement]} container The parent the element will be placed in
+ * @return {Object} The boundingClientRect of el, with specified adjustments
+ */
+function getRect(
+ el,
+ relativeToContainingBlock,
+ relativeToNonStaticParent,
+ undoScale,
+ container
+) {
+ if (!el.getBoundingClientRect && el !== window) return;
+
+ let elRect, top, left, bottom, right, height, width;
+
+ if (el !== window && el !== getWindowScrollingElement()) {
+ elRect = el.getBoundingClientRect();
+ top = elRect.top;
+ left = elRect.left;
+ bottom = elRect.bottom;
+ right = elRect.right;
+ height = elRect.height;
+ width = elRect.width;
+ } else {
+ top = 0;
+ left = 0;
+ bottom = window.innerHeight;
+ right = window.innerWidth;
+ height = window.innerHeight;
+ width = window.innerWidth;
+ }
+
+ if (
+ (relativeToContainingBlock || relativeToNonStaticParent) &&
+ el !== window
+ ) {
+ // Adjust for translate()
+ container = container || el.parentNode;
+
+ // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)
+ // Not needed on <= IE11
+ if (!IE11OrLess) {
+ do {
+ if (
+ container &&
+ container.getBoundingClientRect &&
+ //@ts-ignore
+ (css(container, "transform") !== "none" ||
+ (relativeToNonStaticParent &&
+ //@ts-ignore
+ css(container, "position") !== "static"))
+ ) {
+ let containerRect = container.getBoundingClientRect();
+
+ // Set relative to edges of padding box of container
+ top -=
+ //@ts-ignore
+ containerRect.top + parseInt(css(container, "border-top-width"));
+ left -=
+ //@ts-ignore
+ containerRect.left + parseInt(css(container, "border-left-width"));
+ bottom = top + elRect.height;
+ right = left + elRect.width;
+
+ break;
+ }
+ /* jshint boss:true */
+ } while ((container = container.parentNode));
+ }
+ }
+
+ if (undoScale && el !== window) {
+ // Adjust for scale()
+ //@ts-ignore
+ let elMatrix = matrix(container || el),
+ scaleX = elMatrix && elMatrix.a,
+ scaleY = elMatrix && elMatrix.d;
+
+ if (elMatrix) {
+ top /= scaleY;
+ left /= scaleX;
+
+ width /= scaleX;
+ height /= scaleY;
+
+ bottom = top + height;
+ right = left + width;
+ }
+ }
+
+ return {
+ top: top,
+ left: left,
+ bottom: bottom,
+ right: right,
+ width: width,
+ height: height,
+ };
+}
+
+/**
+ * Checks if a side of an element is scrolled past a side of its parents
+ * @param {HTMLElement} el The element who's side being scrolled out of view is in question
+ * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')
+ * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')
+ * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element
+ */
+function isScrolledPast(el, elSide, parentSide) {
+ let parent = getParentAutoScrollElement(el, true),
+ //@ts-ignore
+ elSideVal = getRect(el)[elSide];
+
+ /* jshint boss:true */
+ while (parent) {
+ //@ts-ignore
+ let parentSideVal = getRect(parent)[parentSide],
+ visible;
+
+ if (parentSide === "top" || parentSide === "left") {
+ visible = elSideVal >= parentSideVal;
+ } else {
+ visible = elSideVal <= parentSideVal;
+ }
+
+ if (!visible) return parent;
+
+ if (parent === getWindowScrollingElement()) break;
+
+ parent = getParentAutoScrollElement(parent, false);
+ }
+
+ return false;
+}
+
+/**
+ * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)
+ * and non-draggable elements
+ * @param {HTMLElement} el The parent element
+ * @param {Number} childNum The index of the child
+ * @param {Object} options Parent Sortable's options
+ * @return {HTMLElement} The child at index childNum, or null if not found
+ */
+function getChild(el, childNum, options) {
+ let currentChild = 0,
+ i = 0,
+ children = el.children;
+
+ while (i < children.length) {
+ if (
+ children[i].style.display !== "none" &&
+ //@ts-ignore
+ children[i] !== Sortable.ghost &&
+ //@ts-ignore
+ children[i] !== Sortable.dragged &&
+ closest(children[i], options.draggable, el, false)
+ ) {
+ if (currentChild === childNum) {
+ return children[i];
+ }
+ currentChild++;
+ }
+
+ i++;
+ }
+ return null;
+}
+
+/**
+ * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)
+ * @param {HTMLElement} el Parent element
+ * @param {selector} selector Any other elements that should be ignored
+ * @return {HTMLElement} The last child, ignoring ghostEl
+ */
+function lastChild(el, selector) {
+ let last = el.lastElementChild;
+
+ while (
+ last &&
+ //@ts-ignore
+ (last === Sortable.ghost ||
+ //@ts-ignore
+ css(last, "display") === "none" ||
+ (selector && !matches(last, selector)))
+ ) {
+ last = last.previousElementSibling;
+ }
+
+ return last || null;
+}
+
+/**
+ * Returns the index of an element within its parent for a selected set of
+ * elements
+ * @param {HTMLElement} el
+ * @param {selector} selector
+ * @return {number}
+ */
+function index(el, selector) {
+ let index = 0;
+
+ if (!el || !el.parentNode) {
+ return -1;
+ }
+
+ /* jshint boss:true */
+ while ((el = el.previousElementSibling)) {
+ if (
+ el.nodeName.toUpperCase() !== "TEMPLATE" &&
+ //@ts-ignore
+ el !== Sortable.clone &&
+ (!selector || matches(el, selector))
+ ) {
+ index++;
+ }
+ }
+
+ return index;
+}
+
+/**
+ * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.
+ * The value is returned in real pixels.
+ * @param {HTMLElement} el
+ * @return {Array} Offsets in the format of [left, top]
+ */
+function getRelativeScrollOffset(el) {
+ let offsetLeft = 0,
+ offsetTop = 0,
+ winScroller = getWindowScrollingElement();
+
+ if (el) {
+ do {
+ //@ts-ignore
+ let elMatrix = matrix(el),
+ scaleX = elMatrix.a,
+ scaleY = elMatrix.d;
+
+ offsetLeft += el.scrollLeft * scaleX;
+ offsetTop += el.scrollTop * scaleY;
+ } while (el !== winScroller && (el = el.parentNode));
+ }
+
+ return [offsetLeft, offsetTop];
+}
+
+/**
+ * Returns the index of the object within the given array
+ * @param {Array} arr Array that may or may not hold the object
+ * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find
+ * @return {Number} The index of the object in the array, or -1
+ */
+function indexOfObject(arr, obj) {
+ for (let i in arr) {
+ if (!arr.hasOwnProperty(i)) continue;
+ for (let key in obj) {
+ if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);
+ }
+ }
+ return -1;
+}
+
+function getParentAutoScrollElement(el, includeSelf) {
+ // skip to window
+ if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();
+
+ let elem = el;
+ let gotSelf = false;
+ do {
+ // we don't need to get elem css if it isn't even overflowing in the first place (performance)
+ if (
+ elem.clientWidth < elem.scrollWidth ||
+ elem.clientHeight < elem.scrollHeight
+ ) {
+ //@ts-ignore
+ let elemCSS = css(elem);
+ if (
+ (elem.clientWidth < elem.scrollWidth &&
+ (elemCSS.overflowX == "auto" || elemCSS.overflowX == "scroll")) ||
+ (elem.clientHeight < elem.scrollHeight &&
+ (elemCSS.overflowY == "auto" || elemCSS.overflowY == "scroll"))
+ ) {
+ if (!elem.getBoundingClientRect || elem === document.body)
+ return getWindowScrollingElement();
+
+ if (gotSelf || includeSelf) return elem;
+ gotSelf = true;
+ }
+ }
+ /* jshint boss:true */
+ } while ((elem = elem.parentNode));
+
+ return getWindowScrollingElement();
+}
+
+function extend(dst, src) {
+ if (dst && src) {
+ for (let key in src) {
+ if (src.hasOwnProperty(key)) {
+ dst[key] = src[key];
+ }
+ }
+ }
+
+ return dst;
+}
+
+function isRectEqual(rect1, rect2) {
+ return (
+ Math.round(rect1.top) === Math.round(rect2.top) &&
+ Math.round(rect1.left) === Math.round(rect2.left) &&
+ Math.round(rect1.height) === Math.round(rect2.height) &&
+ Math.round(rect1.width) === Math.round(rect2.width)
+ );
+}
+
+let _throttleTimeout;
+function throttle(callback, ms) {
+ return function () {
+ if (!_throttleTimeout) {
+ let args = arguments,
+ _this = this;
+
+ if (args.length === 1) {
+ callback.call(_this, args[0]);
+ } else {
+ callback.apply(_this, args);
+ }
+
+ _throttleTimeout = setTimeout(function () {
+ _throttleTimeout = void 0;
+ }, ms);
+ }
+ };
+}
+
+function cancelThrottle() {
+ clearTimeout(_throttleTimeout);
+ _throttleTimeout = void 0;
+}
+
+function scrollBy(el, x, y) {
+ el.scrollLeft += x;
+ el.scrollTop += y;
+}
+
+function clone(el) {
+ //@ts-ignore
+ let Polymer = window.Polymer;
+ //@ts-ignore
+ let $ = window.jQuery || window.Zepto;
+
+ if (Polymer && Polymer.dom) {
+ return Polymer.dom(el).cloneNode(true);
+ } else if ($) {
+ return $(el).clone(true)[0];
+ } else {
+ return el.cloneNode(true);
+ }
+}
+
+function setRect(el, rect) {
+ css(el, "position", "absolute");
+ css(el, "top", rect.top);
+ css(el, "left", rect.left);
+ css(el, "width", rect.width);
+ css(el, "height", rect.height);
+}
+
+function unsetRect(el) {
+ css(el, "position", "");
+ css(el, "top", "");
+ css(el, "left", "");
+ css(el, "width", "");
+ css(el, "height", "");
+}
+
+const expando = "Sortable" + new Date().getTime();
+
+export {
+ on,
+ off,
+ matches,
+ getParentOrHost,
+ closest,
+ toggleClass,
+ css,
+ matrix,
+ find,
+ getWindowScrollingElement,
+ getRect,
+ isScrolledPast,
+ getChild,
+ lastChild,
+ index,
+ getRelativeScrollOffset,
+ indexOfObject,
+ getParentAutoScrollElement,
+ extend,
+ isRectEqual,
+ throttle,
+ cancelThrottle,
+ scrollBy,
+ clone,
+ setRect,
+ unsetRect,
+ expando,
+};
diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json
new file mode 100644
index 000000000..a91e7aa67
--- /dev/null
+++ b/packages/utils/tsconfig.json
@@ -0,0 +1,4 @@
+{
+ "compilerOptions": {},
+ "include": ["src"]
+}
diff --git a/plugins/AutoScroll/AutoScroll.js b/plugins/AutoScroll/AutoScroll.js
deleted file mode 100644
index 3027bb351..000000000
--- a/plugins/AutoScroll/AutoScroll.js
+++ /dev/null
@@ -1,270 +0,0 @@
-import {
- on,
- off,
- css,
- throttle,
- cancelThrottle,
- scrollBy,
- getParentAutoScrollElement,
- expando,
- getRect,
- getWindowScrollingElement
-} from '../../src/utils.js';
-
-import Sortable from '../../src/Sortable.js';
-
-import { Edge, IE11OrLess, Safari } from '../../src/BrowserInfo.js';
-
-let autoScrolls = [],
- scrollEl,
- scrollRootEl,
- scrolling = false,
- lastAutoScrollX,
- lastAutoScrollY,
- touchEvt,
- pointerElemChangedInterval;
-
-function AutoScrollPlugin() {
-
- function AutoScroll() {
- this.defaults = {
- scroll: true,
- scrollSensitivity: 30,
- scrollSpeed: 10,
- bubbleScroll: true
- };
-
- // Bind all private methods
- for (let fn in this) {
- if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
- this[fn] = this[fn].bind(this);
- }
- }
- }
-
- AutoScroll.prototype = {
- dragStarted({ originalEvent }) {
- if (this.sortable.nativeDraggable) {
- on(document, 'dragover', this._handleAutoScroll);
- } else {
- if (this.options.supportPointer) {
- on(document, 'pointermove', this._handleFallbackAutoScroll);
- } else if (originalEvent.touches) {
- on(document, 'touchmove', this._handleFallbackAutoScroll);
- } else {
- on(document, 'mousemove', this._handleFallbackAutoScroll);
- }
- }
- },
-
- dragOverCompleted({ originalEvent }) {
- // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)
- if (!this.options.dragOverBubble && !originalEvent.rootEl) {
- this._handleAutoScroll(originalEvent);
- }
- },
-
- drop() {
- if (this.sortable.nativeDraggable) {
- off(document, 'dragover', this._handleAutoScroll);
- } else {
- off(document, 'pointermove', this._handleFallbackAutoScroll);
- off(document, 'touchmove', this._handleFallbackAutoScroll);
- off(document, 'mousemove', this._handleFallbackAutoScroll);
- }
-
- clearPointerElemChangedInterval();
- clearAutoScrolls();
- cancelThrottle();
- },
-
- nulling() {
- touchEvt =
- scrollRootEl =
- scrollEl =
- scrolling =
- pointerElemChangedInterval =
- lastAutoScrollX =
- lastAutoScrollY = null;
-
- autoScrolls.length = 0;
- },
-
- _handleFallbackAutoScroll(evt) {
- this._handleAutoScroll(evt, true);
- },
-
- _handleAutoScroll(evt, fallback) {
- const x = (evt.touches ? evt.touches[0] : evt).clientX,
- y = (evt.touches ? evt.touches[0] : evt).clientY,
-
- elem = document.elementFromPoint(x, y);
-
- touchEvt = evt;
-
- // IE does not seem to have native autoscroll,
- // Edge's autoscroll seems too conditional,
- // MACOS Safari does not have autoscroll,
- // Firefox and Chrome are good
- if (fallback || Edge || IE11OrLess || Safari) {
- autoScroll(evt, this.options, elem, fallback);
-
- // Listener for pointer element change
- let ogElemScroller = getParentAutoScrollElement(elem, true);
- if (
- scrolling &&
- (
- !pointerElemChangedInterval ||
- x !== lastAutoScrollX ||
- y !== lastAutoScrollY
- )
- ) {
- pointerElemChangedInterval && clearPointerElemChangedInterval();
- // Detect for pointer elem change, emulating native DnD behaviour
- pointerElemChangedInterval = setInterval(() => {
- let newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);
- if (newElem !== ogElemScroller) {
- ogElemScroller = newElem;
- clearAutoScrolls();
- }
- autoScroll(evt, this.options, newElem, fallback);
- }, 10);
- lastAutoScrollX = x;
- lastAutoScrollY = y;
- }
- } else {
- // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll
- if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {
- clearAutoScrolls();
- return;
- }
- autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);
- }
- }
- };
-
- return Object.assign(AutoScroll, {
- pluginName: 'scroll',
- initializeByDefault: true
- });
-}
-
-function clearAutoScrolls() {
- autoScrolls.forEach(function(autoScroll) {
- clearInterval(autoScroll.pid);
- });
- autoScrolls = [];
-}
-
-function clearPointerElemChangedInterval() {
- clearInterval(pointerElemChangedInterval);
-}
-
-
-const autoScroll = throttle(function(evt, options, rootEl, isFallback) {
- // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
- if (!options.scroll) return;
- const x = (evt.touches ? evt.touches[0] : evt).clientX,
- y = (evt.touches ? evt.touches[0] : evt).clientY,
- sens = options.scrollSensitivity,
- speed = options.scrollSpeed,
- winScroller = getWindowScrollingElement();
-
- let scrollThisInstance = false,
- scrollCustomFn;
-
- // New scroll root, set scrollEl
- if (scrollRootEl !== rootEl) {
- scrollRootEl = rootEl;
-
- clearAutoScrolls();
-
- scrollEl = options.scroll;
- scrollCustomFn = options.scrollFn;
-
- if (scrollEl === true) {
- scrollEl = getParentAutoScrollElement(rootEl, true);
- }
- }
-
-
- let layersOut = 0;
- let currentParent = scrollEl;
- do {
- let el = currentParent,
- rect = getRect(el),
-
- top = rect.top,
- bottom = rect.bottom,
- left = rect.left,
- right = rect.right,
-
- width = rect.width,
- height = rect.height,
-
- canScrollX,
- canScrollY,
-
- scrollWidth = el.scrollWidth,
- scrollHeight = el.scrollHeight,
-
- elCSS = css(el),
-
- scrollPosX = el.scrollLeft,
- scrollPosY = el.scrollTop;
-
-
- if (el === winScroller) {
- canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');
- canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');
- } else {
- canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');
- canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');
- }
-
- let vx = canScrollX && (Math.abs(right - x) <= sens && (scrollPosX + width) < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);
- let vy = canScrollY && (Math.abs(bottom - y) <= sens && (scrollPosY + height) < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);
-
-
- if (!autoScrolls[layersOut]) {
- for (let i = 0; i <= layersOut; i++) {
- if (!autoScrolls[i]) {
- autoScrolls[i] = {};
- }
- }
- }
-
- if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {
- autoScrolls[layersOut].el = el;
- autoScrolls[layersOut].vx = vx;
- autoScrolls[layersOut].vy = vy;
-
- clearInterval(autoScrolls[layersOut].pid);
-
- if (vx != 0 || vy != 0) {
- scrollThisInstance = true;
- /* jshint loopfunc:true */
- autoScrolls[layersOut].pid = setInterval((function () {
- // emulate drag over during autoscroll (fallback), emulating native DnD behaviour
- if (isFallback && this.layer === 0) {
- Sortable.active._onTouchMove(touchEvt); // To move ghost if it is positioned absolutely
- }
- let scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;
- let scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;
-
- if (typeof(scrollCustomFn) === 'function') {
- if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt, autoScrolls[this.layer].el) !== 'continue') {
- return;
- }
- }
-
- scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);
- }).bind({layer: layersOut}), 24);
- }
- }
- layersOut++;
- } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));
- scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not
-}, 30);
-
-export default AutoScrollPlugin;
diff --git a/plugins/AutoScroll/index.js b/plugins/AutoScroll/index.js
deleted file mode 100644
index cc79f7e24..000000000
--- a/plugins/AutoScroll/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './AutoScroll.js';
diff --git a/plugins/MultiDrag/MultiDrag.js b/plugins/MultiDrag/MultiDrag.js
deleted file mode 100644
index 61f690137..000000000
--- a/plugins/MultiDrag/MultiDrag.js
+++ /dev/null
@@ -1,617 +0,0 @@
-import {
- toggleClass,
- getRect,
- index,
- closest,
- on,
- off,
- clone,
- css,
- setRect,
- unsetRect,
- matrix,
- expando
-} from '../../src/utils.js';
-
-import dispatchEvent from '../../src/EventDispatcher.js';
-
-let multiDragElements = [],
- multiDragClones = [],
- lastMultiDragSelect, // for selection with modifier key down (SHIFT)
- multiDragSortable,
- initialFolding = false, // Initial multi-drag fold when drag started
- folding = false, // Folding any other time
- dragStarted = false,
- dragEl,
- clonesFromRect,
- clonesHidden;
-
-function MultiDragPlugin() {
- function MultiDrag(sortable) {
- // Bind all private methods
- for (let fn in this) {
- if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
- this[fn] = this[fn].bind(this);
- }
- }
-
- if (sortable.options.supportPointer) {
- on(document, 'pointerup', this._deselectMultiDrag);
- } else {
- on(document, 'mouseup', this._deselectMultiDrag);
- on(document, 'touchend', this._deselectMultiDrag);
- }
-
- on(document, 'keydown', this._checkKeyDown);
- on(document, 'keyup', this._checkKeyUp);
-
- this.defaults = {
- selectedClass: 'sortable-selected',
- multiDragKey: null,
- setData(dataTransfer, dragEl) {
- let data = '';
- if (multiDragElements.length && multiDragSortable === sortable) {
- multiDragElements.forEach((multiDragElement, i) => {
- data += (!i ? '' : ', ') + multiDragElement.textContent;
- });
- } else {
- data = dragEl.textContent;
- }
- dataTransfer.setData('Text', data);
- }
- };
- }
-
- MultiDrag.prototype = {
- multiDragKeyDown: false,
- isMultiDrag: false,
-
-
- delayStartGlobal({ dragEl: dragged }) {
- dragEl = dragged;
- },
-
- delayEnded() {
- this.isMultiDrag = ~multiDragElements.indexOf(dragEl);
- },
-
- setupClone({ sortable, cancel }) {
- if (!this.isMultiDrag) return;
- for (let i = 0; i < multiDragElements.length; i++) {
- multiDragClones.push(clone(multiDragElements[i]));
-
- multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;
-
- multiDragClones[i].draggable = false;
- multiDragClones[i].style['will-change'] = '';
-
- toggleClass(multiDragClones[i], this.options.selectedClass, false);
- multiDragElements[i] === dragEl && toggleClass(multiDragClones[i], this.options.chosenClass, false);
- }
-
- sortable._hideClone();
- cancel();
- },
-
- clone({ sortable, rootEl, dispatchSortableEvent, cancel }) {
- if (!this.isMultiDrag) return;
- if (!this.options.removeCloneOnHide) {
- if (multiDragElements.length && multiDragSortable === sortable) {
- insertMultiDragClones(true, rootEl);
- dispatchSortableEvent('clone');
-
- cancel();
- }
- }
- },
-
- showClone({ cloneNowShown, rootEl, cancel }) {
- if (!this.isMultiDrag) return;
- insertMultiDragClones(false, rootEl);
- multiDragClones.forEach(clone => {
- css(clone, 'display', '');
- });
-
- cloneNowShown();
- clonesHidden = false;
- cancel();
- },
-
- hideClone({ sortable, cloneNowHidden, cancel }) {
- if (!this.isMultiDrag) return;
- multiDragClones.forEach(clone => {
- css(clone, 'display', 'none');
- if (this.options.removeCloneOnHide && clone.parentNode) {
- clone.parentNode.removeChild(clone);
- }
- });
-
- cloneNowHidden();
- clonesHidden = true;
- cancel();
- },
-
- dragStartGlobal({ sortable }) {
- if (!this.isMultiDrag && multiDragSortable) {
- multiDragSortable.multiDrag._deselectMultiDrag();
- }
-
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.sortableIndex = index(multiDragElement);
- });
-
- // Sort multi-drag elements
- multiDragElements = multiDragElements.sort(function(a, b) {
- return a.sortableIndex - b.sortableIndex;
- });
- dragStarted = true;
- },
-
- dragStarted({ sortable }) {
- if (!this.isMultiDrag) return;
- if (this.options.sort) {
- // Capture rects,
- // hide multi drag elements (by positioning them absolute),
- // set multi drag elements rects to dragRect,
- // show multi drag elements,
- // animate to rects,
- // unset rects & remove from DOM
-
- sortable.captureAnimationState();
-
- if (this.options.animation) {
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl) return;
- css(multiDragElement, 'position', 'absolute');
- });
-
- let dragRect = getRect(dragEl, false, true, true);
-
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl) return;
- setRect(multiDragElement, dragRect);
- });
-
- folding = true;
- initialFolding = true;
- }
- }
-
- sortable.animateAll(() => {
- folding = false;
- initialFolding = false;
-
- if (this.options.animation) {
- multiDragElements.forEach(multiDragElement => {
- unsetRect(multiDragElement);
- });
- }
-
- // Remove all auxiliary multidrag items from el, if sorting enabled
- if (this.options.sort) {
- removeMultiDragElements();
- }
- });
- },
-
- dragOver({ target, completed, cancel }) {
- if (folding && ~multiDragElements.indexOf(target)) {
- completed(false);
- cancel();
- }
- },
-
- revert({ fromSortable, rootEl, sortable, dragRect }) {
- if (multiDragElements.length > 1) {
- // Setup unfold animation
- multiDragElements.forEach(multiDragElement => {
- sortable.addAnimationState({
- target: multiDragElement,
- rect: folding ? getRect(multiDragElement) : dragRect
- });
-
- unsetRect(multiDragElement);
-
- multiDragElement.fromRect = dragRect;
-
- fromSortable.removeAnimationState(multiDragElement);
- });
- folding = false;
- insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);
- }
- },
-
- dragOverCompleted({ sortable, isOwner, insertion, activeSortable, parentEl, putSortable }) {
- let options = this.options;
- if (insertion) {
- // Clones must be hidden before folding animation to capture dragRectAbsolute properly
- if (isOwner) {
- activeSortable._hideClone();
- }
-
- initialFolding = false;
- // If leaving sort:false root, or already folding - Fold to new location
- if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {
- // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible
- let dragRectAbsolute = getRect(dragEl, false, true, true);
-
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl) return;
- setRect(multiDragElement, dragRectAbsolute);
-
- // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted
- // while folding, and so that we can capture them again because old sortable will no longer be fromSortable
- parentEl.appendChild(multiDragElement);
- });
-
- folding = true;
- }
-
- // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out
- if (!isOwner) {
- // Only remove if not folding (folding will remove them anyways)
- if (!folding) {
- removeMultiDragElements();
- }
-
- if (multiDragElements.length > 1) {
- let clonesHiddenBefore = clonesHidden;
- activeSortable._showClone(sortable);
-
- // Unfold animation for clones if showing from hidden
- if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {
- multiDragClones.forEach(clone => {
- activeSortable.addAnimationState({
- target: clone,
- rect: clonesFromRect
- });
-
- clone.fromRect = clonesFromRect;
- clone.thisAnimationDuration = null;
- });
- }
- } else {
- activeSortable._showClone(sortable);
- }
- }
- }
- },
-
- dragOverAnimationCapture({ dragRect, isOwner, activeSortable }) {
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.thisAnimationDuration = null;
- });
-
- if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {
- clonesFromRect = Object.assign({}, dragRect);
- let dragMatrix = matrix(dragEl, true);
- clonesFromRect.top -= dragMatrix.f;
- clonesFromRect.left -= dragMatrix.e;
- }
- },
-
- dragOverAnimationComplete() {
- if (folding) {
- folding = false;
- removeMultiDragElements();
- }
- },
-
- drop({ originalEvent: evt, rootEl, parentEl, sortable, dispatchSortableEvent, oldIndex, putSortable }) {
- let toSortable = (putSortable || this.sortable);
-
- if (!evt) return;
-
- let options = this.options,
- children = parentEl.children;
-
- // Multi-drag selection
- if (!dragStarted) {
- if (options.multiDragKey && !this.multiDragKeyDown) {
- this._deselectMultiDrag();
- }
- toggleClass(dragEl, options.selectedClass, !~multiDragElements.indexOf(dragEl));
-
- if (!~multiDragElements.indexOf(dragEl)) {
- multiDragElements.push(dragEl);
- dispatchEvent({
- sortable,
- rootEl,
- name: 'select',
- targetEl: dragEl,
- originalEvt: evt
- });
-
- // Modifier activated, select from last to dragEl
- if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {
- let lastIndex = index(lastMultiDragSelect),
- currentIndex = index(dragEl);
-
- if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {
- // Must include lastMultiDragSelect (select it), in case modified selection from no selection
- // (but previous selection existed)
- let n, i;
- if (currentIndex > lastIndex) {
- i = lastIndex;
- n = currentIndex;
- } else {
- i = currentIndex;
- n = lastIndex + 1;
- }
-
- for (; i < n; i++) {
- if (~multiDragElements.indexOf(children[i])) continue;
- toggleClass(children[i], options.selectedClass, true);
- multiDragElements.push(children[i]);
-
- dispatchEvent({
- sortable,
- rootEl,
- name: 'select',
- targetEl: children[i],
- originalEvt: evt
- });
- }
- }
- } else {
- lastMultiDragSelect = dragEl;
- }
-
- multiDragSortable = toSortable;
- } else {
- multiDragElements.splice(multiDragElements.indexOf(dragEl), 1);
- lastMultiDragSelect = null;
- dispatchEvent({
- sortable,
- rootEl,
- name: 'deselect',
- targetEl: dragEl,
- originalEvt: evt
- });
- }
- }
-
- // Multi-drag drop
- if (dragStarted && this.isMultiDrag) {
- // Do not "unfold" after around dragEl if reverted
- if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {
- let dragRect = getRect(dragEl),
- multiDragIndex = index(dragEl, ':not(.' + this.options.selectedClass + ')');
-
- if (!initialFolding && options.animation) dragEl.thisAnimationDuration = null;
-
- toSortable.captureAnimationState();
-
- if (!initialFolding) {
- if (options.animation) {
- dragEl.fromRect = dragRect;
- multiDragElements.forEach(multiDragElement => {
- multiDragElement.thisAnimationDuration = null;
- if (multiDragElement !== dragEl) {
- let rect = folding ? getRect(multiDragElement) : dragRect;
- multiDragElement.fromRect = rect;
-
- // Prepare unfold animation
- toSortable.addAnimationState({
- target: multiDragElement,
- rect: rect
- });
- }
- });
- }
-
- // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert
- // properly they must all be removed
- removeMultiDragElements();
-
- multiDragElements.forEach(multiDragElement => {
- if (children[multiDragIndex]) {
- parentEl.insertBefore(multiDragElement, children[multiDragIndex]);
- } else {
- parentEl.appendChild(multiDragElement);
- }
- multiDragIndex++;
- });
-
- // If initial folding is done, the elements may have changed position because they are now
- // unfolding around dragEl, even though dragEl may not have his index changed, so update event
- // must be fired here as Sortable will not.
- if (oldIndex === index(dragEl)) {
- let update = false;
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement.sortableIndex !== index(multiDragElement)) {
- update = true;
- return;
- }
- });
-
- if (update) {
- dispatchSortableEvent('update');
- }
- }
- }
-
- // Must be done after capturing individual rects (scroll bar)
- multiDragElements.forEach(multiDragElement => {
- unsetRect(multiDragElement);
- });
-
- toSortable.animateAll();
- }
-
- multiDragSortable = toSortable;
- }
-
- // Remove clones if necessary
- if (rootEl === parentEl || (putSortable && putSortable.lastPutMode !== 'clone')) {
- multiDragClones.forEach(clone => {
- clone.parentNode && clone.parentNode.removeChild(clone);
- });
- }
- },
-
- nullingGlobal() {
- this.isMultiDrag =
- dragStarted = false;
- multiDragClones.length = 0;
- },
-
- destroyGlobal() {
- this._deselectMultiDrag();
- off(document, 'pointerup', this._deselectMultiDrag);
- off(document, 'mouseup', this._deselectMultiDrag);
- off(document, 'touchend', this._deselectMultiDrag);
-
- off(document, 'keydown', this._checkKeyDown);
- off(document, 'keyup', this._checkKeyUp);
- },
-
- _deselectMultiDrag(evt) {
- if (typeof dragStarted !== "undefined" && dragStarted) return;
-
- // Only deselect if selection is in this sortable
- if (multiDragSortable !== this.sortable) return;
-
- // Only deselect if target is not item in this sortable
- if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;
-
- // Only deselect if left click
- if (evt && evt.button !== 0) return;
-
- while (multiDragElements.length) {
- let el = multiDragElements[0];
- toggleClass(el, this.options.selectedClass, false);
- multiDragElements.shift();
- dispatchEvent({
- sortable: this.sortable,
- rootEl: this.sortable.el,
- name: 'deselect',
- targetEl: el,
- originalEvt: evt
- });
- }
- },
-
- _checkKeyDown(evt) {
- if (evt.key === this.options.multiDragKey) {
- this.multiDragKeyDown = true;
- }
- },
-
- _checkKeyUp(evt) {
- if (evt.key === this.options.multiDragKey) {
- this.multiDragKeyDown = false;
- }
- }
- };
-
- return Object.assign(MultiDrag, {
- // Static methods & properties
- pluginName: 'multiDrag',
- utils: {
- /**
- * Selects the provided multi-drag item
- * @param {HTMLElement} el The element to be selected
- */
- select(el) {
- let sortable = el.parentNode[expando];
- if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;
- if (multiDragSortable && multiDragSortable !== sortable) {
- multiDragSortable.multiDrag._deselectMultiDrag();
- multiDragSortable = sortable;
- }
- toggleClass(el, sortable.options.selectedClass, true);
- multiDragElements.push(el);
- },
- /**
- * Deselects the provided multi-drag item
- * @param {HTMLElement} el The element to be deselected
- */
- deselect(el) {
- let sortable = el.parentNode[expando],
- index = multiDragElements.indexOf(el);
- if (!sortable || !sortable.options.multiDrag || !~index) return;
- toggleClass(el, sortable.options.selectedClass, false);
- multiDragElements.splice(index, 1);
- }
- },
- eventProperties() {
- const oldIndicies = [],
- newIndicies = [];
-
- multiDragElements.forEach(multiDragElement => {
- oldIndicies.push({
- multiDragElement,
- index: multiDragElement.sortableIndex
- });
-
- // multiDragElements will already be sorted if folding
- let newIndex;
- if (folding && multiDragElement !== dragEl) {
- newIndex = -1;
- } else if (folding) {
- newIndex = index(multiDragElement, ':not(.' + this.options.selectedClass + ')');
- } else {
- newIndex = index(multiDragElement);
- }
- newIndicies.push({
- multiDragElement,
- index: newIndex
- });
- });
- return {
- items: [...multiDragElements],
- clones: [...multiDragClones],
- oldIndicies,
- newIndicies
- };
- },
- optionListeners: {
- multiDragKey(key) {
- key = key.toLowerCase();
- if (key === 'ctrl') {
- key = 'Control';
- } else if (key.length > 1) {
- key = key.charAt(0).toUpperCase() + key.substr(1);
- }
- return key;
- }
- }
- });
-}
-
-function insertMultiDragElements(clonesInserted, rootEl) {
- multiDragElements.forEach((multiDragElement, i) => {
- let target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];
- if (target) {
- rootEl.insertBefore(multiDragElement, target);
- } else {
- rootEl.appendChild(multiDragElement);
- }
- });
-}
-
-/**
- * Insert multi-drag clones
- * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted
- * @param {HTMLElement} rootEl
- */
-function insertMultiDragClones(elementsInserted, rootEl) {
- multiDragClones.forEach((clone, i) => {
- let target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];
- if (target) {
- rootEl.insertBefore(clone, target);
- } else {
- rootEl.appendChild(clone);
- }
- });
-}
-
-function removeMultiDragElements() {
- multiDragElements.forEach(multiDragElement => {
- if (multiDragElement === dragEl) return;
- multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);
- });
-}
-
-export default MultiDragPlugin;
diff --git a/plugins/MultiDrag/index.js b/plugins/MultiDrag/index.js
deleted file mode 100644
index 2507117e0..000000000
--- a/plugins/MultiDrag/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './MultiDrag.js';
diff --git a/plugins/OnSpill/OnSpill.js b/plugins/OnSpill/OnSpill.js
deleted file mode 100644
index e8c6439d9..000000000
--- a/plugins/OnSpill/OnSpill.js
+++ /dev/null
@@ -1,79 +0,0 @@
-import { getChild } from '../../src/utils.js';
-
-
-const drop = function({
- originalEvent,
- putSortable,
- dragEl,
- activeSortable,
- dispatchSortableEvent,
- hideGhostForTarget,
- unhideGhostForTarget
-}) {
- if (!originalEvent) return;
- let toSortable = putSortable || activeSortable;
- hideGhostForTarget();
- let touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;
- let target = document.elementFromPoint(touch.clientX, touch.clientY);
- unhideGhostForTarget();
- if (toSortable && !toSortable.el.contains(target)) {
- dispatchSortableEvent('spill');
- this.onSpill({ dragEl, putSortable });
- }
-};
-
-function Revert() {}
-
-Revert.prototype = {
- startIndex: null,
- dragStart({ oldDraggableIndex }) {
- this.startIndex = oldDraggableIndex;
- },
- onSpill({ dragEl, putSortable }) {
- this.sortable.captureAnimationState();
- if (putSortable) {
- putSortable.captureAnimationState();
- }
- let nextSibling = getChild(this.sortable.el, this.startIndex, this.options);
-
- if (nextSibling) {
- this.sortable.el.insertBefore(dragEl, nextSibling);
- } else {
- this.sortable.el.appendChild(dragEl);
- }
- this.sortable.animateAll();
- if (putSortable) {
- putSortable.animateAll();
- }
- },
- drop
-};
-
-Object.assign(Revert, {
- pluginName: 'revertOnSpill'
-});
-
-
-function Remove() {}
-
-Remove.prototype = {
- onSpill({ dragEl, putSortable }) {
- const parentSortable = putSortable || this.sortable;
- parentSortable.captureAnimationState();
- dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);
- parentSortable.animateAll();
- },
- drop
-};
-
-Object.assign(Remove, {
- pluginName: 'removeOnSpill'
-});
-
-
-export default [Remove, Revert];
-
-export {
- Remove as RemoveOnSpill,
- Revert as RevertOnSpill
-};
diff --git a/plugins/OnSpill/index.js b/plugins/OnSpill/index.js
deleted file mode 100644
index 4023b0f60..000000000
--- a/plugins/OnSpill/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default, RemoveOnSpill, RevertOnSpill } from './OnSpill.js';
diff --git a/plugins/Swap/Swap.js b/plugins/Swap/Swap.js
deleted file mode 100644
index 3f0feb7dc..000000000
--- a/plugins/Swap/Swap.js
+++ /dev/null
@@ -1,90 +0,0 @@
-import {
- toggleClass,
- index
-} from '../../src/utils.js';
-
-let lastSwapEl;
-
-
-function SwapPlugin() {
- function Swap() {
- this.defaults = {
- swapClass: 'sortable-swap-highlight'
- };
- }
-
- Swap.prototype = {
- dragStart({ dragEl }) {
- lastSwapEl = dragEl;
- },
- dragOverValid({ completed, target, onMove, activeSortable, changed, cancel }) {
- if (!activeSortable.options.swap) return;
- let el = this.sortable.el,
- options = this.options;
- if (target && target !== el) {
- let prevSwapEl = lastSwapEl;
- if (onMove(target) !== false) {
- toggleClass(target, options.swapClass, true);
- lastSwapEl = target;
- } else {
- lastSwapEl = null;
- }
-
- if (prevSwapEl && prevSwapEl !== lastSwapEl) {
- toggleClass(prevSwapEl, options.swapClass, false);
- }
- }
- changed();
-
- completed(true);
- cancel();
- },
- drop({ activeSortable, putSortable, dragEl }) {
- let toSortable = (putSortable || this.sortable);
- let options = this.options;
- lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);
- if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {
- if (dragEl !== lastSwapEl) {
- toSortable.captureAnimationState();
- if (toSortable !== activeSortable) activeSortable.captureAnimationState();
- swapNodes(dragEl, lastSwapEl);
-
- toSortable.animateAll();
- if (toSortable !== activeSortable) activeSortable.animateAll();
- }
- }
- },
- nulling() {
- lastSwapEl = null;
- }
- };
-
- return Object.assign(Swap, {
- pluginName: 'swap',
- eventProperties() {
- return {
- swapItem: lastSwapEl
- };
- }
- });
-}
-
-
-function swapNodes(n1, n2) {
- let p1 = n1.parentNode,
- p2 = n2.parentNode,
- i1, i2;
-
- if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;
-
- i1 = index(n1);
- i2 = index(n2);
-
- if (p1.isEqualNode(p2) && i1 < i2) {
- i2++;
- }
- p1.insertBefore(n2, p1.children[i1]);
- p2.insertBefore(n1, p2.children[i2]);
-}
-
-export default SwapPlugin;
diff --git a/plugins/Swap/index.js b/plugins/Swap/index.js
deleted file mode 100644
index 9799bc72c..000000000
--- a/plugins/Swap/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './Swap.js';
diff --git a/scripts/banner.js b/scripts/banner.js
deleted file mode 100644
index 337928bff..000000000
--- a/scripts/banner.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import { version } from '../package.json';
-
-export default `/**!
- * Sortable ${ version }
- * @author RubaXa
- * @author owenm
- * @license MIT
- */`;
diff --git a/scripts/build.js b/scripts/build.js
deleted file mode 100644
index 9e7543966..000000000
--- a/scripts/build.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import json from "rollup-plugin-json";
-import resolve from "rollup-plugin-node-resolve";
-import banner from "./banner.js";
-import typescript from "@rollup/plugin-typescript";
-
-export default {
- output: {
- banner,
- name: "Sortable",
- },
- plugins: [
- json(),
- resolve(),
- typescript({
- allowJs: true,
- include: "src",
- }),
- ],
-};
diff --git a/scripts/esm-build.js b/scripts/esm-build.js
deleted file mode 100644
index 9caff74d0..000000000
--- a/scripts/esm-build.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import build from './build.js';
-
-export default ([
- {
- input: 'entry/entry-core.js',
- output: Object.assign({}, build.output, {
- file: 'modular/sortable.core.esm.js',
- format: 'esm'
- })
- },
- {
- input: 'entry/entry-defaults.js',
- output: Object.assign({}, build.output, {
- file: 'modular/sortable.esm.js',
- format: 'esm'
- })
- },
- {
- input: 'entry/entry-complete.js',
- output: Object.assign({}, build.output, {
- file: 'modular/sortable.complete.esm.js',
- format: 'esm'
- })
- }
-]).map(config => {
- let buildCopy = { ...build };
- return Object.assign(buildCopy, config);
-});
diff --git a/scripts/minify.js b/scripts/minify.js
deleted file mode 100644
index e2051a2c2..000000000
--- a/scripts/minify.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const UglifyJS = require('uglify-js'),
- fs = require('fs'),
- package = require('../package.json');
-
-const banner = `/*! Sortable ${ package.version } - ${ package.license } | ${ package.repository.url } */\n`;
-
-fs.writeFileSync(
- `./Sortable.min.js`,
- banner + UglifyJS.minify(fs.readFileSync(`./Sortable.js`, 'utf8')).code,
- 'utf8'
-);
diff --git a/scripts/test-compat.ts b/scripts/test-compat.ts
index b2d69d854..24967fd8d 100644
--- a/scripts/test-compat.ts
+++ b/scripts/test-compat.ts
@@ -31,7 +31,11 @@ const runTests = (settings: (runner: Runner) => Runner) =>
() => pipe(testcafe.createRunner(), settings, (runner) => runner.run()),
(e) => e
),
- (testcafe) => TE.fromIO(() => testcafe.close())
+ (testcafe) =>
+ TE.tryCatch(
+ () => testcafe.close(),
+ (e) => e
+ )
);
// if failed count is 0, it passes
diff --git a/scripts/test.ts b/scripts/test.ts
index ecf7734d9..aa802ea06 100644
--- a/scripts/test.ts
+++ b/scripts/test.ts
@@ -22,7 +22,11 @@ const runTests = (settings: (runner: Runner) => Runner) =>
() => pipe(testcafe.createRunner(), settings, (runner) => runner.run()),
(e) => e
),
- (testcafe) => TE.fromIO(() => testcafe.close())
+ (testcafe) =>
+ TE.tryCatch(
+ () => testcafe.close(),
+ (e) => e
+ )
);
// if failed count is 0, it passes
diff --git a/scripts/umd-build.js b/scripts/umd-build.js
deleted file mode 100644
index ec179fdb9..000000000
--- a/scripts/umd-build.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import build from './build.js';
-
-
-export default ([
- {
- input: 'entry/entry-complete.js',
- output: Object.assign({}, build.output, {
- file: './Sortable.js',
- format: 'umd'
- })
- }
-]).map(config => {
- let buildCopy = { ...build };
- return Object.assign(buildCopy, config);
-});
diff --git a/src/Animation.js b/src/Animation.js
deleted file mode 100644
index 6aa8e3ef8..000000000
--- a/src/Animation.js
+++ /dev/null
@@ -1,175 +0,0 @@
-import { getRect, css, matrix, isRectEqual, indexOfObject } from './utils.js';
-import Sortable from './Sortable.js';
-
-export default function AnimationStateManager() {
- let animationStates = [],
- animationCallbackId;
-
- return {
- captureAnimationState() {
- animationStates = [];
- if (!this.options.animation) return;
- let children = [].slice.call(this.el.children);
-
- children.forEach(child => {
- if (css(child, 'display') === 'none' || child === Sortable.ghost) return;
- animationStates.push({
- target: child,
- rect: getRect(child)
- });
- let fromRect = { ...animationStates[animationStates.length - 1].rect };
-
- // If animating: compensate for current animation
- if (child.thisAnimationDuration) {
- let childMatrix = matrix(child, true);
- if (childMatrix) {
- fromRect.top -= childMatrix.f;
- fromRect.left -= childMatrix.e;
- }
- }
-
- child.fromRect = fromRect;
- });
- },
-
- addAnimationState(state) {
- animationStates.push(state);
- },
-
- removeAnimationState(target) {
- animationStates.splice(indexOfObject(animationStates, { target }), 1);
- },
-
- animateAll(callback) {
- if (!this.options.animation) {
- clearTimeout(animationCallbackId);
- if (typeof(callback) === 'function') callback();
- return;
- }
-
- let animating = false,
- animationTime = 0;
-
- animationStates.forEach((state) => {
- let time = 0,
- animatingThis = false,
- target = state.target,
- fromRect = target.fromRect,
- toRect = getRect(target),
- prevFromRect = target.prevFromRect,
- prevToRect = target.prevToRect,
- animatingRect = state.rect,
- targetMatrix = matrix(target, true);
-
-
- if (targetMatrix) {
- // Compensate for current animation
- toRect.top -= targetMatrix.f;
- toRect.left -= targetMatrix.e;
- }
-
- target.toRect = toRect;
-
- if (target.thisAnimationDuration) {
- // Could also check if animatingRect is between fromRect and toRect
- if (
- isRectEqual(prevFromRect, toRect) &&
- !isRectEqual(fromRect, toRect) &&
- // Make sure animatingRect is on line between toRect & fromRect
- (animatingRect.top - toRect.top) /
- (animatingRect.left - toRect.left) ===
- (fromRect.top - toRect.top) /
- (fromRect.left - toRect.left)
- ) {
- // If returning to same place as started from animation and on same axis
- time = calculateRealTime(animatingRect, prevFromRect, prevToRect, this.options);
- }
- }
-
- // if fromRect != toRect: animate
- if (!isRectEqual(toRect, fromRect)) {
- target.prevFromRect = fromRect;
- target.prevToRect = toRect;
-
- if (!time) {
- time = this.options.animation;
- }
- this.animate(
- target,
- animatingRect,
- toRect,
- time
- );
- }
-
- if (time) {
- animating = true;
- animationTime = Math.max(animationTime, time);
- clearTimeout(target.animationResetTimer);
- target.animationResetTimer = setTimeout(function() {
- target.animationTime = 0;
- target.prevFromRect = null;
- target.fromRect = null;
- target.prevToRect = null;
- target.thisAnimationDuration = null;
- }, time);
- target.thisAnimationDuration = time;
- }
- });
-
-
- clearTimeout(animationCallbackId);
- if (!animating) {
- if (typeof(callback) === 'function') callback();
- } else {
- animationCallbackId = setTimeout(function() {
- if (typeof(callback) === 'function') callback();
- }, animationTime);
- }
- animationStates = [];
- },
-
- animate(target, currentRect, toRect, duration) {
- if (duration) {
- css(target, 'transition', '');
- css(target, 'transform', '');
- let elMatrix = matrix(this.el),
- scaleX = elMatrix && elMatrix.a,
- scaleY = elMatrix && elMatrix.d,
- translateX = (currentRect.left - toRect.left) / (scaleX || 1),
- translateY = (currentRect.top - toRect.top) / (scaleY || 1);
-
- target.animatingX = !!translateX;
- target.animatingY = !!translateY;
-
- css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');
-
- this.forRepaintDummy = repaint(target); // repaint
-
- css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));
- css(target, 'transform', 'translate3d(0,0,0)');
- (typeof target.animated === 'number') && clearTimeout(target.animated);
- target.animated = setTimeout(function () {
- css(target, 'transition', '');
- css(target, 'transform', '');
- target.animated = false;
-
- target.animatingX = false;
- target.animatingY = false;
- }, duration);
- }
- }
- };
-}
-
-function repaint(target) {
- return target.offsetWidth;
-}
-
-
-function calculateRealTime(animatingRect, fromRect, toRect, options) {
- return (
- Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) /
- Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2))
- ) * options.animation;
-}
diff --git a/src/BrowserInfo.js b/src/BrowserInfo.js
deleted file mode 100644
index 304a853a2..000000000
--- a/src/BrowserInfo.js
+++ /dev/null
@@ -1,12 +0,0 @@
-function userAgent(pattern) {
- if (typeof window !== 'undefined' && window.navigator) {
- return !!/*@__PURE__*/navigator.userAgent.match(pattern);
- }
-}
-
-export const IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i);
-export const Edge = userAgent(/Edge/i);
-export const FireFox = userAgent(/firefox/i);
-export const Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);
-export const IOS = userAgent(/iP(ad|od|hone)/i);
-export const ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);
diff --git a/src/EventDispatcher.js b/src/EventDispatcher.js
deleted file mode 100644
index e47cb5809..000000000
--- a/src/EventDispatcher.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import { IE11OrLess, Edge } from './BrowserInfo.js';
-import { expando } from './utils.js';
-import PluginManager from './PluginManager.js';
-
-export default function dispatchEvent(
- {
- sortable, rootEl, name,
- targetEl, cloneEl, toEl, fromEl,
- oldIndex, newIndex,
- oldDraggableIndex, newDraggableIndex,
- originalEvent, putSortable, extraEventProperties
- }
-) {
- sortable = (sortable || (rootEl && rootEl[expando]));
- if (!sortable) return;
-
- let evt,
- options = sortable.options,
- onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);
- // Support for new CustomEvent feature
- if (window.CustomEvent && !IE11OrLess && !Edge) {
- evt = new CustomEvent(name, {
- bubbles: true,
- cancelable: true
- });
- } else {
- evt = document.createEvent('Event');
- evt.initEvent(name, true, true);
- }
-
- evt.to = toEl || rootEl;
- evt.from = fromEl || rootEl;
- evt.item = targetEl || rootEl;
- evt.clone = cloneEl;
-
- evt.oldIndex = oldIndex;
- evt.newIndex = newIndex;
-
- evt.oldDraggableIndex = oldDraggableIndex;
- evt.newDraggableIndex = newDraggableIndex;
-
- evt.originalEvent = originalEvent;
- evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
-
- let allEventProperties = { ...extraEventProperties, ...PluginManager.getEventProperties(name, sortable) };
- for (let option in allEventProperties) {
- evt[option] = allEventProperties[option];
- }
-
- if (rootEl) {
- rootEl.dispatchEvent(evt);
- }
-
- if (options[onName]) {
- options[onName].call(sortable, evt);
- }
-}
diff --git a/src/PluginManager.js b/src/PluginManager.js
deleted file mode 100644
index 623c26f62..000000000
--- a/src/PluginManager.js
+++ /dev/null
@@ -1,87 +0,0 @@
-let plugins = [];
-
-const defaults = {
- initializeByDefault: true
-};
-
-export default {
- mount(plugin) {
- // Set default static properties
- for (let option in defaults) {
- if (defaults.hasOwnProperty(option) && !(option in plugin)) {
- plugin[option] = defaults[option];
- }
- }
- plugins.push(plugin);
- },
- pluginEvent(eventName, sortable, evt) {
- this.eventCanceled = false;
- evt.cancel = () => {
- this.eventCanceled = true;
- };
- const eventNameGlobal = eventName + 'Global';
- plugins.forEach(plugin => {
- if (!sortable[plugin.pluginName]) return;
- // Fire global events if it exists in this sortable
- if (
- sortable[plugin.pluginName][eventNameGlobal]
- ) {
- sortable[plugin.pluginName][eventNameGlobal]({ sortable, ...evt });
- }
-
- // Only fire plugin event if plugin is enabled in this sortable,
- // and plugin has event defined
- if (
- sortable.options[plugin.pluginName] &&
- sortable[plugin.pluginName][eventName]
- ) {
- sortable[plugin.pluginName][eventName]({ sortable, ...evt });
- }
- });
- },
- initializePlugins(sortable, el, defaults, options) {
- plugins.forEach(plugin => {
- const pluginName = plugin.pluginName;
- if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;
-
- let initialized = new plugin(sortable, el, sortable.options);
- initialized.sortable = sortable;
- initialized.options = sortable.options;
- sortable[pluginName] = initialized;
-
- // Add default options from plugin
- Object.assign(defaults, initialized.defaults);
- });
-
- for (let option in sortable.options) {
- if (!sortable.options.hasOwnProperty(option)) continue;
- let modified = this.modifyOption(sortable, option, sortable.options[option]);
- if (typeof(modified) !== 'undefined') {
- sortable.options[option] = modified;
- }
- }
- },
- getEventProperties(name, sortable) {
- let eventProperties = {};
- plugins.forEach(plugin => {
- if (typeof(plugin.eventProperties) !== 'function') return;
- Object.assign(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));
- });
-
- return eventProperties;
- },
- modifyOption(sortable, name, value) {
- let modifiedValue;
- plugins.forEach(plugin => {
- // Plugin must exist on the Sortable
- if (!sortable[plugin.pluginName]) return;
-
- // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin
- if (plugin.optionListeners && typeof(plugin.optionListeners[name]) === 'function') {
- modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);
- }
- });
-
- return modifiedValue;
- }
-};
diff --git a/src/utils.ts b/src/utils.ts
deleted file mode 100644
index 0993b0acb..000000000
--- a/src/utils.ts
+++ /dev/null
@@ -1,573 +0,0 @@
-import { IE11OrLess } from './BrowserInfo.js';
-import Sortable from './Sortable.js';
-
-const captureMode = {
- capture: false,
- passive: false
-};
-
-function on(el, event, fn) {
- el.addEventListener(event, fn, !IE11OrLess && captureMode);
-}
-
-function off(el, event, fn) {
- el.removeEventListener(event, fn, !IE11OrLess && captureMode);
-}
-
-function matches(/**HTMLElement*/el, /**String*/selector) {
- if (!selector) return;
-
- selector[0] === '>' && (selector = selector.substring(1));
-
- if (el) {
- try {
- if (el.matches) {
- return el.matches(selector);
- } else if (el.msMatchesSelector) {
- return el.msMatchesSelector(selector);
- } else if (el.webkitMatchesSelector) {
- return el.webkitMatchesSelector(selector);
- }
- } catch(_) {
- return false;
- }
- }
-
- return false;
-}
-
-function getParentOrHost(el) {
- return (el.host && el !== document && el.host.nodeType)
- ? el.host
- : el.parentNode;
-}
-
-function closest(/**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {
- if (el) {
- ctx = ctx || document;
-
- do {
- if (
- selector != null &&
- (
- selector[0] === '>' ?
- el.parentNode === ctx && matches(el, selector) :
- matches(el, selector)
- ) ||
- includeCTX && el === ctx
- ) {
- return el;
- }
-
- if (el === ctx) break;
- /* jshint boss:true */
- } while (el = getParentOrHost(el));
- }
-
- return null;
-}
-
-const R_SPACE = /\s+/g;
-
-function toggleClass(el, name, state) {
- if (el && name) {
- if (el.classList) {
- el.classList[state ? 'add' : 'remove'](name);
- }
- else {
- let className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');
- el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');
- }
- }
-}
-
-
-function css(el, prop, val) {
- let style = el && el.style;
-
- if (style) {
- if (val === void 0) {
- if (document.defaultView && document.defaultView.getComputedStyle) {
- val = document.defaultView.getComputedStyle(el, '');
- }
- else if (el.currentStyle) {
- val = el.currentStyle;
- }
-
- return prop === void 0 ? val : val[prop];
- }
- else {
- if (!(prop in style) && prop.indexOf('webkit') === -1) {
- prop = '-webkit-' + prop;
- }
-
- style[prop] = val + (typeof val === 'string' ? '' : 'px');
- }
- }
-}
-
-function matrix(el, selfOnly) {
- let appliedTransforms = '';
- if (typeof(el) === 'string') {
- appliedTransforms = el;
- } else {
- do {
- //@ts-ignore
- let transform = css(el, 'transform');
-
- if (transform && transform !== 'none') {
- appliedTransforms = transform + ' ' + appliedTransforms;
- }
- /* jshint boss:true */
- } while (!selfOnly && (el = el.parentNode));
- }
-
- //@ts-ignore
- const matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;
- /*jshint -W056 */
- return matrixFn && (new matrixFn(appliedTransforms));
-}
-
-
-function find(ctx, tagName, iterator) {
- if (ctx) {
- let list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;
-
- if (iterator) {
- for (; i < n; i++) {
- iterator(list[i], i);
- }
- }
-
- return list;
- }
-
- return [];
-}
-
-
-
-function getWindowScrollingElement() {
- let scrollingElement = document.scrollingElement;
-
- if (scrollingElement) {
- return scrollingElement
- } else {
- return document.documentElement
- }
-}
-
-
-/**
- * Returns the "bounding client rect" of given element
- * @param {HTMLElement} el The element whose boundingClientRect is wanted
- * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container
- * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr
- * @param {[Boolean]} undoScale Whether the container's scale() should be undone
- * @param {[HTMLElement]} container The parent the element will be placed in
- * @return {Object} The boundingClientRect of el, with specified adjustments
- */
-function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {
- if (!el.getBoundingClientRect && el !== window) return;
-
- let elRect,
- top,
- left,
- bottom,
- right,
- height,
- width;
-
- if (el !== window && el !== getWindowScrollingElement()) {
- elRect = el.getBoundingClientRect();
- top = elRect.top;
- left = elRect.left;
- bottom = elRect.bottom;
- right = elRect.right;
- height = elRect.height;
- width = elRect.width;
- } else {
- top = 0;
- left = 0;
- bottom = window.innerHeight;
- right = window.innerWidth;
- height = window.innerHeight;
- width = window.innerWidth;
- }
-
- if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {
- // Adjust for translate()
- container = container || el.parentNode;
-
- // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)
- // Not needed on <= IE11
- if (!IE11OrLess) {
- do {
- if (
- container &&
- container.getBoundingClientRect &&
- (
- //@ts-ignore
- css(container, 'transform') !== 'none' ||
- relativeToNonStaticParent &&
- //@ts-ignore
- css(container, 'position') !== 'static'
- )
- ) {
- let containerRect = container.getBoundingClientRect();
-
- // Set relative to edges of padding box of container
- //@ts-ignore
- top -= containerRect.top + parseInt(css(container, 'border-top-width'));
- //@ts-ignore
- left -= containerRect.left + parseInt(css(container, 'border-left-width'));
- bottom = top + elRect.height;
- right = left + elRect.width;
-
- break;
- }
- /* jshint boss:true */
- } while (container = container.parentNode);
- }
- }
-
- if (undoScale && el !== window) {
- // Adjust for scale()
- //@ts-ignore
- let elMatrix = matrix(container || el),
- scaleX = elMatrix && elMatrix.a,
- scaleY = elMatrix && elMatrix.d;
-
- if (elMatrix) {
- top /= scaleY;
- left /= scaleX;
-
- width /= scaleX;
- height /= scaleY;
-
- bottom = top + height;
- right = left + width;
- }
- }
-
- return {
- top: top,
- left: left,
- bottom: bottom,
- right: right,
- width: width,
- height: height
- };
-}
-
-/**
- * Checks if a side of an element is scrolled past a side of its parents
- * @param {HTMLElement} el The element who's side being scrolled out of view is in question
- * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')
- * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')
- * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element
- */
-function isScrolledPast(el, elSide, parentSide) {
- let parent = getParentAutoScrollElement(el, true),
- //@ts-ignore
- elSideVal = getRect(el)[elSide];
-
- /* jshint boss:true */
- while (parent) {
- //@ts-ignore
- let parentSideVal = getRect(parent)[parentSide],
- visible;
-
- if (parentSide === 'top' || parentSide === 'left') {
- visible = elSideVal >= parentSideVal;
- } else {
- visible = elSideVal <= parentSideVal;
- }
-
- if (!visible) return parent;
-
- if (parent === getWindowScrollingElement()) break;
-
- parent = getParentAutoScrollElement(parent, false);
- }
-
- return false;
-}
-
-
-
-/**
- * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)
- * and non-draggable elements
- * @param {HTMLElement} el The parent element
- * @param {Number} childNum The index of the child
- * @param {Object} options Parent Sortable's options
- * @return {HTMLElement} The child at index childNum, or null if not found
- */
-function getChild(el, childNum, options) {
- let currentChild = 0,
- i = 0,
- children = el.children;
-
- while (i < children.length) {
- if (
- children[i].style.display !== 'none' &&
- //@ts-ignore
- children[i] !== Sortable.ghost &&
- //@ts-ignore
- children[i] !== Sortable.dragged &&
- closest(children[i], options.draggable, el, false)
- ) {
- if (currentChild === childNum) {
- return children[i];
- }
- currentChild++;
- }
-
- i++;
- }
- return null;
-}
-
-/**
- * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)
- * @param {HTMLElement} el Parent element
- * @param {selector} selector Any other elements that should be ignored
- * @return {HTMLElement} The last child, ignoring ghostEl
- */
-function lastChild(el, selector) {
- let last = el.lastElementChild;
-
- while (
- last &&
- (
- //@ts-ignore
- last === Sortable.ghost ||
- //@ts-ignore
- css(last, 'display') === 'none' ||
- selector && !matches(last, selector)
- )
- ) {
- last = last.previousElementSibling;
- }
-
- return last || null;
-}
-
-
-/**
- * Returns the index of an element within its parent for a selected set of
- * elements
- * @param {HTMLElement} el
- * @param {selector} selector
- * @return {number}
- */
-function index(el, selector) {
- let index = 0;
-
- if (!el || !el.parentNode) {
- return -1;
- }
-
- /* jshint boss:true */
- while (el = el.previousElementSibling) {
- //@ts-ignore
- if ((el.nodeName.toUpperCase() !== 'TEMPLATE') && el !== Sortable.clone && (!selector || matches(el, selector))) {
- index++;
- }
- }
-
- return index;
-}
-
-/**
- * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.
- * The value is returned in real pixels.
- * @param {HTMLElement} el
- * @return {Array} Offsets in the format of [left, top]
- */
-function getRelativeScrollOffset(el) {
- let offsetLeft = 0,
- offsetTop = 0,
- winScroller = getWindowScrollingElement();
-
- if (el) {
- do {
- //@ts-ignore
- let elMatrix = matrix(el),
- scaleX = elMatrix.a,
- scaleY = elMatrix.d;
-
- offsetLeft += el.scrollLeft * scaleX;
- offsetTop += el.scrollTop * scaleY;
- } while (el !== winScroller && (el = el.parentNode));
- }
-
- return [offsetLeft, offsetTop];
-}
-
-/**
- * Returns the index of the object within the given array
- * @param {Array} arr Array that may or may not hold the object
- * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find
- * @return {Number} The index of the object in the array, or -1
- */
-function indexOfObject(arr, obj) {
- for (let i in arr) {
- if (!arr.hasOwnProperty(i)) continue;
- for (let key in obj) {
- if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);
- }
- }
- return -1;
-}
-
-
-function getParentAutoScrollElement(el, includeSelf) {
- // skip to window
- if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();
-
- let elem = el;
- let gotSelf = false;
- do {
- // we don't need to get elem css if it isn't even overflowing in the first place (performance)
- if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {
- //@ts-ignore
- let elemCSS = css(elem);
- if (
- elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') ||
- elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')
- ) {
- if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();
-
- if (gotSelf || includeSelf) return elem;
- gotSelf = true;
- }
- }
- /* jshint boss:true */
- } while (elem = elem.parentNode);
-
- return getWindowScrollingElement();
-}
-
-function extend(dst, src) {
- if (dst && src) {
- for (let key in src) {
- if (src.hasOwnProperty(key)) {
- dst[key] = src[key];
- }
- }
- }
-
- return dst;
-}
-
-
-function isRectEqual(rect1, rect2) {
- return Math.round(rect1.top) === Math.round(rect2.top) &&
- Math.round(rect1.left) === Math.round(rect2.left) &&
- Math.round(rect1.height) === Math.round(rect2.height) &&
- Math.round(rect1.width) === Math.round(rect2.width);
-}
-
-
-let _throttleTimeout;
-function throttle(callback, ms) {
- return function () {
- if (!_throttleTimeout) {
- let args = arguments,
- _this = this;
-
- if (args.length === 1) {
- callback.call(_this, args[0]);
- } else {
- callback.apply(_this, args);
- }
-
- _throttleTimeout = setTimeout(function () {
- _throttleTimeout = void 0;
- }, ms);
- }
- };
-}
-
-
-function cancelThrottle() {
- clearTimeout(_throttleTimeout);
- _throttleTimeout = void 0;
-}
-
-
-function scrollBy(el, x, y) {
- el.scrollLeft += x;
- el.scrollTop += y;
-}
-
-
-function clone(el) {
- //@ts-ignore
- let Polymer = window.Polymer;
- //@ts-ignore
- let $ = window.jQuery || window.Zepto;
-
- if (Polymer && Polymer.dom) {
- return Polymer.dom(el).cloneNode(true);
- }
- else if ($) {
- return $(el).clone(true)[0];
- }
- else {
- return el.cloneNode(true);
- }
-}
-
-
-function setRect(el, rect) {
- css(el, 'position', 'absolute');
- css(el, 'top', rect.top);
- css(el, 'left', rect.left);
- css(el, 'width', rect.width);
- css(el, 'height', rect.height);
-}
-
-function unsetRect(el) {
- css(el, 'position', '');
- css(el, 'top', '');
- css(el, 'left', '');
- css(el, 'width', '');
- css(el, 'height', '');
-}
-
-
-const expando = 'Sortable' + (new Date).getTime();
-
-
-export {
- on,
- off,
- matches,
- getParentOrHost,
- closest,
- toggleClass,
- css,
- matrix,
- find,
- getWindowScrollingElement,
- getRect,
- isScrolledPast,
- getChild,
- lastChild,
- index,
- getRelativeScrollOffset,
- indexOfObject,
- getParentAutoScrollElement,
- extend,
- isRectEqual,
- throttle,
- cancelThrottle,
- scrollBy,
- clone,
- setRect,
- unsetRect,
- expando
-};
diff --git a/st/iframe/index.html b/st/iframe/index.html
index fcd089857..08f5fa282 100644
--- a/st/iframe/index.html
+++ b/st/iframe/index.html
@@ -1,49 +1,47 @@
-
-
- IFrame playground
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
It works with Bootstrap...
-
...out of the box.
-
It has support for touch devices.
-
Just drag some elements around.
-
-
-
-
-
+
+
+ IFrame playground
+
+
+
+
+
+
+
+
+
+
+
+
It works with Bootstrap...
+
...out of the box.
+
It has support for touch devices.
+
Just drag some elements around.
+
+
+
+
diff --git a/tests/e2e-fixtures/dual-list.html b/tests/e2e-fixtures/dual-list.html
index 93942630d..eb38d0cc0 100644
--- a/tests/e2e-fixtures/dual-list.html
+++ b/tests/e2e-fixtures/dual-list.html
@@ -21,7 +21,7 @@
Item 2.5
-
+
+
+
+
+
+